RTEMS 6.1-rc6
Loading...
Searching...
No Matches
libio_.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-2-Clause */
2
11/*
12 * COPYRIGHT (C) 1989, 2021 On-Line Applications Research Corporation (OAR).
13 *
14 * Modifications to support reference counting in the file system are
15 * Copyright (c) 2012 embedded brains GmbH & Co. KG
16 *
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions
19 * are met:
20 * 1. Redistributions of source code must retain the above copyright
21 * notice, this list of conditions and the following disclaimer.
22 * 2. Redistributions in binary form must reproduce the above copyright
23 * notice, this list of conditions and the following disclaimer in the
24 * documentation and/or other materials provided with the distribution.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
30 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 * * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 * POSSIBILITY OF SUCH DAMAGE.
37 */
38
39#ifndef _RTEMS_RTEMS_LIBIO__H
40#define _RTEMS_RTEMS_LIBIO__H
41
42#include <sys/uio.h>
43#include <errno.h>
44#include <limits.h>
45#include <pthread.h>
46
47#include <rtems.h>
48#include <rtems/libio.h>
49#include <rtems/seterr.h>
50#include <rtems/score/assert.h>
52
53#ifdef __cplusplus
54extern "C" {
55#endif
56
67#define RTEMS_FILESYSTEM_SYMLOOP_MAX 32
68
69/*
70 * Not defined in newlib so provide here. Users should use dup2 and
71 * not this non-portable fcntl command. Provided here to allow the
72 * RTEMS implementation to work.
73 */
74#define F_DUP2FD 20
75
76/*
77 * File descriptor Table Information
78 */
79
80extern const uint32_t rtems_libio_number_iops;
81extern rtems_libio_t rtems_libio_iops[];
82extern void *rtems_libio_iop_free_head;
83extern void **rtems_libio_iop_free_tail;
84
85extern const rtems_filesystem_file_handlers_r rtems_filesystem_null_handlers;
86
87extern rtems_filesystem_mount_table_entry_t rtems_filesystem_null_mt_entry;
88
105
114static inline unsigned int rtems_libio_iop_flags_set(
115 rtems_libio_t *iop,
116 unsigned int set
117)
118{
119 return _Atomic_Fetch_or_uint( &iop->flags, set, ATOMIC_ORDER_RELAXED );
120}
121
130static inline unsigned int rtems_libio_iop_flags_clear(
131 rtems_libio_t *iop,
132 unsigned int clear
133)
134{
135 return _Atomic_Fetch_and_uint( &iop->flags, ~clear, ATOMIC_ORDER_RELAXED );
136}
137
147static inline rtems_libio_t *rtems_libio_iop( int fd )
148{
149 return &rtems_libio_iops[ fd ];
150}
151
159static inline unsigned int rtems_libio_iop_hold( rtems_libio_t *iop )
160{
161 return _Atomic_Fetch_add_uint(
162 &iop->flags,
163 LIBIO_FLAGS_REFERENCE_INC,
164 ATOMIC_ORDER_ACQUIRE
165 );
166}
167
173static inline void rtems_libio_iop_drop( rtems_libio_t *iop )
174{
175#if defined(RTEMS_DEBUG)
176 unsigned int flags;
177 bool success;
178
179 flags = _Atomic_Load_uint( &iop->flags, ATOMIC_ORDER_RELAXED );
180
181 do {
182 unsigned int desired;
183
184 _Assert( flags >= LIBIO_FLAGS_REFERENCE_INC );
185
186 desired = flags - LIBIO_FLAGS_REFERENCE_INC;
187 success = _Atomic_Compare_exchange_uint(
188 &iop->flags,
189 &flags,
190 desired,
191 ATOMIC_ORDER_RELEASE,
192 ATOMIC_ORDER_RELAXED
193 );
194 } while ( !success );
195#else
196 _Atomic_Fetch_sub_uint(
197 &iop->flags,
198 LIBIO_FLAGS_REFERENCE_INC,
199 ATOMIC_ORDER_RELEASE
200 );
201#endif
202}
203
204/*
205 * rtems_libio_iop_to_descriptor
206 *
207 * Macro to convert an internal file descriptor pointer (iop) into
208 * the integer file descriptor used by the "section 2" system calls.
209 */
210
211#define rtems_libio_iop_to_descriptor(_iop) \
212 ((_iop) - &rtems_libio_iops[0])
213
214/*
215 * rtems_libio_check_is_open
216 *
217 * Macro to check if a file descriptor is actually open.
218 */
219
220#define rtems_libio_check_is_open(_iop) \
221 do { \
222 if ((rtems_libio_iop_flags(_iop) & LIBIO_FLAGS_OPEN) == 0) { \
223 errno = EBADF; \
224 return -1; \
225 } \
226 } while (0)
227
233#define LIBIO_GET_IOP( _fd, _iop ) \
234 do { \
235 unsigned int _flags; \
236 if ( (uint32_t) ( _fd ) >= rtems_libio_number_iops ) { \
237 rtems_set_errno_and_return_minus_one( EBADF ); \
238 } \
239 _iop = rtems_libio_iop( _fd ); \
240 _flags = rtems_libio_iop_hold( _iop ); \
241 if ( ( _flags & LIBIO_FLAGS_OPEN ) == 0 ) { \
242 rtems_libio_iop_drop( _iop ); \
243 rtems_set_errno_and_return_minus_one( EBADF ); \
244 } \
245 } while ( 0 )
246
253#define LIBIO_GET_IOP_WITH_ACCESS( _fd, _iop, _access_flags, _access_error ) \
254 do { \
255 unsigned int _flags; \
256 unsigned int _mandatory; \
257 if ( (uint32_t) ( _fd ) >= rtems_libio_number_iops ) { \
258 rtems_set_errno_and_return_minus_one( EBADF ); \
259 } \
260 _iop = rtems_libio_iop( _fd ); \
261 _flags = rtems_libio_iop_hold( _iop ); \
262 _mandatory = LIBIO_FLAGS_OPEN | ( _access_flags ); \
263 if ( ( _flags & _mandatory ) != _mandatory ) { \
264 int _error; \
265 rtems_libio_iop_drop( _iop ); \
266 if ( ( _flags & LIBIO_FLAGS_OPEN ) == 0 ) { \
267 _error = EBADF; \
268 } else { \
269 _error = _access_error; \
270 } \
271 rtems_set_errno_and_return_minus_one( _error ); \
272 } \
273 } while ( 0 )
274
275/*
276 * rtems_libio_check_buffer
277 *
278 * Macro to check if a buffer pointer is valid.
279 */
280
281#define rtems_libio_check_buffer(_buffer) \
282 do { \
283 if ((_buffer) == 0) { \
284 errno = EINVAL; \
285 return -1; \
286 } \
287 } while (0)
288
289/*
290 * rtems_libio_check_count
291 *
292 * Macro to check if a count or length is valid.
293 */
294
295#define rtems_libio_check_count(_count) \
296 do { \
297 if ((_count) == 0) { \
298 return 0; \
299 } \
300 } while (0)
301
315);
316
330
331/*
332 * External structures
333 */
334#include <rtems/userenv.h>
335
336void rtems_libio_lock( void );
337
338void rtems_libio_unlock( void );
339
340static inline void rtems_filesystem_mt_lock( void )
341{
342 rtems_libio_lock();
343}
344
345static inline void rtems_filesystem_mt_unlock( void )
346{
347 rtems_libio_unlock();
348}
349
350extern rtems_interrupt_lock rtems_filesystem_mt_entry_lock_control;
351
352#define rtems_filesystem_mt_entry_declare_lock_context( ctx ) \
353 rtems_interrupt_lock_context ctx
354
355#define rtems_filesystem_mt_entry_lock( ctx ) \
356 rtems_interrupt_lock_acquire( &rtems_filesystem_mt_entry_lock_control, &ctx )
357
358#define rtems_filesystem_mt_entry_unlock( ctx ) \
359 rtems_interrupt_lock_release( &rtems_filesystem_mt_entry_lock_control, &ctx )
360
361static inline void rtems_filesystem_instance_lock(
363)
364{
365 const rtems_filesystem_mount_table_entry_t *mt_entry = loc->mt_entry;
366
367 (*mt_entry->ops->lock_h)( mt_entry );
368}
369
370static inline void rtems_filesystem_instance_unlock(
372)
373{
374 const rtems_filesystem_mount_table_entry_t *mt_entry = loc->mt_entry;
375
376 (*mt_entry->ops->unlock_h)( mt_entry );
377}
378
392bool rtems_filesystem_utime_tv_nsec_valid( struct timespec time );
393
410 const rtems_filesystem_location_info_t *currentloc,
411 const struct timespec times[2]
412);
413
434 const struct timespec times[2],
435 struct timespec new_times[2]
436);
437
438/*
439 * File Descriptor Routine Prototypes
440 */
441
447
451unsigned int rtems_libio_fcntl_flags( int fcntl_flags );
452
456int rtems_libio_to_fcntl_flags( unsigned int flags );
457
463 rtems_libio_t *iop
464);
465
470
471/*
472 * File System Routine Prototypes
473 */
474
476rtems_filesystem_eval_path_start(
478 const char *path,
479 int eval_flags
480);
481
483rtems_filesystem_eval_path_start_with_parent(
485 const char *path,
486 int eval_flags,
488 int parent_eval_flags
489);
490
492rtems_filesystem_eval_path_start_with_root_and_current(
494 const char *path,
495 size_t pathlen,
496 int eval_flags,
497 rtems_filesystem_global_location_t *const *global_root_ptr,
498 rtems_filesystem_global_location_t *const *global_current_ptr
499);
500
501void rtems_filesystem_eval_path_continue(
503);
504
505void rtems_filesystem_eval_path_cleanup(
507);
508
509void rtems_filesystem_eval_path_recursive(
511 const char *path,
512 size_t pathlen
513);
514
515void rtems_filesystem_eval_path_cleanup_with_parent(
518);
519
535 rtems_filesystem_global_location_t **newstartloc_ptr
536);
537
538typedef enum {
539 RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_CONTINUE,
540 RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_DONE,
541 RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_NO_ENTRY
542} rtems_filesystem_eval_path_generic_status;
543
557 void *arg
558);
559
572typedef rtems_filesystem_eval_path_generic_status
575 void *arg,
576 const char *token,
577 size_t tokenlen
578);
579
580typedef struct {
584
585void rtems_filesystem_eval_path_generic(
587 void *arg,
589);
590
592
609);
610
612rtems_filesystem_location_initialize_to_null(
614)
615{
617 loc,
619 );
620}
621
623rtems_filesystem_location_transform_to_global(
625);
626
635 rtems_filesystem_global_location_t **lhs_global_loc_ptr,
637);
638
659 rtems_filesystem_global_location_t *const *global_loc_ptr
660);
661
681 bool deferred
682);
683
684void rtems_filesystem_location_detach(
686);
687
688void rtems_filesystem_location_copy_and_detach(
691);
692
694rtems_filesystem_global_location_obtain_null(void)
695{
696 rtems_filesystem_global_location_t *global_loc = NULL;
697
698 return rtems_filesystem_global_location_obtain( &global_loc );
699}
700
701static inline bool rtems_filesystem_location_is_null(
703)
704{
705 return loc->handlers == &rtems_filesystem_null_handlers;
706}
707
708static inline bool rtems_filesystem_global_location_is_null(
709 const rtems_filesystem_global_location_t *global_loc
710)
711{
712 return rtems_filesystem_location_is_null( &global_loc->location );
713}
714
715static inline void rtems_filesystem_location_error(
717 int eno
718)
719{
720 if ( !rtems_filesystem_location_is_null( loc ) ) {
721 errno = eno;
722 }
723}
724
725int rtems_filesystem_mknod(
726 const rtems_filesystem_location_info_t *parentloc,
727 const char *name,
728 size_t namelen,
729 mode_t mode,
730 dev_t dev
731);
732
733int rtems_filesystem_chdir( rtems_filesystem_location_info_t *loc );
734
735int rtems_filesystem_chmod(
737 mode_t mode
738);
739
740int rtems_filesystem_chown(
742 uid_t owner,
743 gid_t group
744);
745
746static inline bool rtems_filesystem_is_ready_for_unmount(
748)
749{
750 bool ready = !mt_entry->mounted
751 && rtems_chain_has_only_one_node( &mt_entry->location_chain )
752 && mt_entry->mt_fs_root->reference_count == 1;
753
754 if ( ready ) {
755 rtems_chain_initialize_empty( &mt_entry->location_chain );
756 }
757
758 return ready;
759}
760
761static inline void rtems_filesystem_location_add_to_mt_entry(
763)
764{
765 rtems_filesystem_mt_entry_declare_lock_context( lock_context );
766
767 rtems_filesystem_mt_entry_lock( lock_context );
768 rtems_chain_append_unprotected(
769 &loc->mt_entry->location_chain,
770 &loc->mt_entry_node
771 );
772 rtems_filesystem_mt_entry_unlock( lock_context );
773}
774
775void rtems_filesystem_location_remove_from_mt_entry(
777);
778
779void rtems_filesystem_do_unmount(
781);
782
783static inline bool rtems_filesystem_location_is_instance_root(
785)
786{
787 const rtems_filesystem_mount_table_entry_t *mt_entry = loc->mt_entry;
788
789 return (*mt_entry->ops->are_nodes_equal_h)(
790 loc,
791 &mt_entry->mt_fs_root->location
792 );
793}
794
795static inline const char *rtems_filesystem_eval_path_get_path(
797)
798{
799 return ctx->path;
800}
801
802static inline size_t rtems_filesystem_eval_path_get_pathlen(
804)
805{
806 return ctx->pathlen;
807}
808
809static inline void rtems_filesystem_eval_path_set_path(
811 const char *path,
812 size_t pathlen
813)
814{
815 ctx->path = path;
816 ctx->pathlen = pathlen;
817}
818
819static inline void rtems_filesystem_eval_path_clear_path(
821)
822{
823 ctx->pathlen = 0;
824}
825
826static inline const char *rtems_filesystem_eval_path_get_token(
828)
829{
830 return ctx->token;
831}
832
833static inline size_t rtems_filesystem_eval_path_get_tokenlen(
835)
836{
837 return ctx->tokenlen;
838}
839
840static inline void rtems_filesystem_eval_path_set_token(
842 const char *token,
843 size_t tokenlen
844)
845{
846 ctx->token = token;
847 ctx->tokenlen = tokenlen;
848}
849
850static inline void rtems_filesystem_eval_path_clear_token(
852)
853{
854 ctx->tokenlen = 0;
855}
856
857static inline void rtems_filesystem_eval_path_put_back_token(
859)
860{
861 size_t tokenlen = ctx->tokenlen;
862
863 ctx->path -= tokenlen;
864 ctx->pathlen += tokenlen;
865 ctx->tokenlen = 0;
866}
867
868void rtems_filesystem_eval_path_eat_delimiter(
870);
871
872void rtems_filesystem_eval_path_next_token(
874);
875
876static inline void rtems_filesystem_eval_path_get_next_token(
878 const char **token,
879 size_t *tokenlen
880)
881{
882 rtems_filesystem_eval_path_next_token(ctx);
883 *token = ctx->token;
884 *tokenlen = ctx->tokenlen;
885}
886
888rtems_filesystem_eval_path_get_currentloc(
890)
891{
892 return &ctx->currentloc;
893}
894
895static inline bool rtems_filesystem_eval_path_has_path(
897)
898{
899 return ctx->pathlen > 0;
900}
901
902static inline bool rtems_filesystem_eval_path_has_token(
904)
905{
906 return ctx->tokenlen > 0;
907}
908
909static inline int rtems_filesystem_eval_path_get_flags(
911)
912{
913 return ctx->flags;
914}
915
916static inline void rtems_filesystem_eval_path_set_flags(
918 int flags
919)
920{
921 ctx->flags = flags;
922}
923
924static inline void rtems_filesystem_eval_path_clear_and_set_flags(
926 int clear,
927 int set
928)
929{
930 int flags = ctx->flags;
931
932 flags &= ~clear;
933 flags |= set;
934
935 ctx->flags = flags;
936}
937
938static inline void rtems_filesystem_eval_path_extract_currentloc(
941)
942{
943 rtems_filesystem_location_copy_and_detach(
944 get,
945 &ctx->currentloc
946 );
947}
948
949void rtems_filesystem_eval_path_error(
951 int eno
952);
953
963);
964
985 int flags,
986 mode_t object_mode,
987 uid_t object_uid,
988 gid_t object_gid
989);
990
991bool rtems_filesystem_eval_path_check_access(
993 int eval_flags,
994 mode_t node_mode,
995 uid_t node_uid,
996 gid_t node_gid
997);
998
999static inline bool rtems_filesystem_is_delimiter(char c)
1000{
1001 return c == '/' || c == '\\';
1002}
1003
1004static inline bool rtems_filesystem_is_current_directory(
1005 const char *token,
1006 size_t tokenlen
1007)
1008{
1009 return tokenlen == 1 && token [0] == '.';
1010}
1011
1012static inline bool rtems_filesystem_is_parent_directory(
1013 const char *token,
1014 size_t tokenlen
1015)
1016{
1017 return tokenlen == 2 && token [0] == '.' && token [1] == '.';
1018}
1019
1020typedef ssize_t ( *rtems_libio_iovec_adapter )(
1021 rtems_libio_t *iop,
1022 const struct iovec *iov,
1023 int iovcnt,
1024 ssize_t total
1025);
1026
1027static inline ssize_t rtems_libio_iovec_eval(
1028 int fd,
1029 const struct iovec *iov,
1030 int iovcnt,
1031 unsigned int flags,
1032 rtems_libio_iovec_adapter adapter
1033)
1034{
1035 ssize_t total;
1036 int v;
1037 rtems_libio_t *iop;
1038
1039 /*
1040 * Argument validation on IO vector
1041 */
1042 if ( iov == NULL )
1044
1045 if ( iovcnt <= 0 )
1047
1048 if ( iovcnt > IOV_MAX )
1050
1051 /*
1052 * OpenGroup says that you are supposed to return EINVAL if the
1053 * sum of the iov_len values in the iov array would overflow a
1054 * ssize_t.
1055 */
1056 total = 0;
1057 for ( v = 0 ; v < iovcnt ; ++v ) {
1058 size_t len = iov[ v ].iov_len;
1059
1060 if ( len > ( size_t ) ( SSIZE_MAX - total ) ) {
1062 }
1063
1064 total += ( ssize_t ) len;
1065
1066 if ( iov[ v ].iov_base == NULL && len != 0 ) {
1068 }
1069 }
1070
1071 LIBIO_GET_IOP_WITH_ACCESS( fd, iop, flags, EBADF );
1072
1073 if ( total > 0 ) {
1074 total = ( *adapter )( iop, iov, iovcnt, total );
1075 }
1076
1077 rtems_libio_iop_drop( iop );
1078 return total;
1079}
1080
1089static inline mode_t rtems_filesystem_location_type(
1091)
1092{
1093 struct stat st;
1094
1095 st.st_mode = 0;
1096 (void) ( *loc->handlers->fstat_h )( loc, &st );
1097
1098 return st.st_mode;
1099}
1100
1103#ifdef __cplusplus
1104}
1105#endif
1106
1107#endif
1108/* end of include file */
clock_t times(struct tms *ptms)
Definition: __times.c:97
This header file provides the interfaces of the Assert Handler.
#define LIBIO_GET_IOP_WITH_ACCESS(_fd, _iop, _access_flags, _access_error)
Macro to get the iop for the specified file descriptor with access flags and error.
Definition: libio_.h:253
int rtems_filesystem_utime_check_permissions(const rtems_filesystem_location_info_t *currentloc, const struct timespec times[2])
Checks for errors and if the process has write permissions to the file.
Definition: utimensat.c:75
unsigned int rtems_libio_fcntl_flags(int fcntl_flags)
Definition: libio.c:80
bool(* rtems_filesystem_eval_path_is_directory)(rtems_filesystem_eval_path_context_t *ctx, void *arg)
Tests if the current location is a directory.
Definition: libio_.h:555
void rtems_filesystem_global_location_assign(rtems_filesystem_global_location_t **lhs_global_loc_ptr, rtems_filesystem_global_location_t *rhs_global_loc)
Assigns a global file system location.
Definition: sup_fs_location.c:108
rtems_filesystem_global_location_t rtems_filesystem_global_location_null
The global null location.
Definition: __usrenv.c:246
void rtems_filesystem_eval_path_restart(rtems_filesystem_eval_path_context_t *ctx, rtems_filesystem_global_location_t **newstartloc_ptr)
Requests a path evaluation restart.
Definition: sup_fs_eval_path.c:330
bool rtems_filesystem_utime_tv_nsec_valid(struct timespec time)
Checks the tv_nsec member of a timespec struct.
Definition: utimensat.c:53
bool rtems_filesystem_check_access(int flags, mode_t object_mode, uid_t object_uid, gid_t object_gid)
Checks if access to an object is allowed for the current user.
Definition: sup_fs_check_permissions.c:102
rtems_filesystem_global_location_t * rtems_filesystem_global_location_obtain(rtems_filesystem_global_location_t *const *global_loc_ptr)
Obtains a global file system location.
Definition: sup_fs_location.c:175
void rtems_filesystem_global_location_release(rtems_filesystem_global_location_t *global_loc, bool deferred)
Releases a global file system location.
Definition: sup_fs_location.c:198
int rtems_libio_count_open_iops(void)
Definition: libio.c:180
int rtems_libio_to_fcntl_flags(unsigned int flags)
Definition: libio.c:105
rtems_libio_t * rtems_libio_allocate(void)
Definition: libio.c:128
void rtems_filesystem_location_free(rtems_filesystem_location_info_t *loc)
Releases all resources of a location.
Definition: freenode.c:44
void rtems_filesystem_location_clone(rtems_filesystem_location_info_t *clone, const rtems_filesystem_location_info_t *master)
Clones a node.
Definition: clonenode.c:41
void rtems_libio_free(rtems_libio_t *iop)
Definition: libio.c:152
int rtems_filesystem_utime_update(const struct timespec times[2], struct timespec new_times[2])
Checks times and fills new_times with the time to be written.
Definition: utimensat.c:120
int rtems_filesystem_location_exists_in_same_instance_as(const rtems_filesystem_location_info_t *a, const rtems_filesystem_location_info_t *b)
Checks that the locations exist in the same file system instance.
Definition: sup_fs_exist_in_same_instance.c:41
void rtems_filesystem_initialize(void)
Base File System Initialization.
Definition: base_fs.c:51
rtems_filesystem_location_info_t * rtems_filesystem_location_copy(rtems_filesystem_location_info_t *dst, const rtems_filesystem_location_info_t *src)
Copies a location.
rtems_filesystem_eval_path_generic_status(* rtems_filesystem_eval_path_eval_token)(rtems_filesystem_eval_path_context_t *ctx, void *arg, const char *token, size_t tokenlen)
Evaluates a token.
Definition: libio_.h:573
char rtems_interrupt_lock
This structure represents an ISR lock.
Definition: intr.h:532
#define rtems_set_errno_and_return_minus_one(_error)
Definition: seterr.h:67
#define _Assert(_e)
Assertion similar to assert() controlled via RTEMS_DEBUG instead of NDEBUG and static analysis runs.
Definition: assert.h:96
Basic IO API.
POSIX Threads Private Support.
This header file defines the RTEMS Classic API.
This header file provides the interfaces of the Timespec Helpers.
This header file defines macros to set errno and return minus one.
File system node operations table.
Definition: libio.h:1021
Definition: deflate.c:114
Path evaluation context.
Definition: libio.h:103
rtems_filesystem_location_info_t currentloc
Definition: libio.h:154
const char * path
Definition: libio.h:107
size_t pathlen
Definition: libio.h:112
size_t tokenlen
Definition: libio.h:124
const char * token
Definition: libio.h:118
int flags
Definition: libio.h:138
Global file system location.
Definition: fs.h:100
File system location.
Definition: fs.h:72
Mount table entry.
Definition: libio.h:1622
An open file data structure.
Definition: libio.h:1338
User Environment Support.