RTEMS 6.1-rc1
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
466/*
467 * File System Routine Prototypes
468 */
469
471rtems_filesystem_eval_path_start(
473 const char *path,
474 int eval_flags
475);
476
478rtems_filesystem_eval_path_start_with_parent(
480 const char *path,
481 int eval_flags,
483 int parent_eval_flags
484);
485
487rtems_filesystem_eval_path_start_with_root_and_current(
489 const char *path,
490 size_t pathlen,
491 int eval_flags,
492 rtems_filesystem_global_location_t *const *global_root_ptr,
493 rtems_filesystem_global_location_t *const *global_current_ptr
494);
495
496void rtems_filesystem_eval_path_continue(
498);
499
500void rtems_filesystem_eval_path_cleanup(
502);
503
504void rtems_filesystem_eval_path_recursive(
506 const char *path,
507 size_t pathlen
508);
509
510void rtems_filesystem_eval_path_cleanup_with_parent(
513);
514
530 rtems_filesystem_global_location_t **newstartloc_ptr
531);
532
533typedef enum {
534 RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_CONTINUE,
535 RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_DONE,
536 RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_NO_ENTRY
537} rtems_filesystem_eval_path_generic_status;
538
552 void *arg
553);
554
567typedef rtems_filesystem_eval_path_generic_status
570 void *arg,
571 const char *token,
572 size_t tokenlen
573);
574
575typedef struct {
579
580void rtems_filesystem_eval_path_generic(
582 void *arg,
584);
585
587
604);
605
607rtems_filesystem_location_initialize_to_null(
609)
610{
612 loc,
614 );
615}
616
618rtems_filesystem_location_transform_to_global(
620);
621
630 rtems_filesystem_global_location_t **lhs_global_loc_ptr,
632);
633
654 rtems_filesystem_global_location_t *const *global_loc_ptr
655);
656
676 bool deferred
677);
678
679void rtems_filesystem_location_detach(
681);
682
683void rtems_filesystem_location_copy_and_detach(
686);
687
689rtems_filesystem_global_location_obtain_null(void)
690{
692
693 return rtems_filesystem_global_location_obtain( &global_loc );
694}
695
696static inline bool rtems_filesystem_location_is_null(
698)
699{
700 return loc->handlers == &rtems_filesystem_null_handlers;
701}
702
703static inline bool rtems_filesystem_global_location_is_null(
704 const rtems_filesystem_global_location_t *global_loc
705)
706{
707 return rtems_filesystem_location_is_null( &global_loc->location );
708}
709
710static inline void rtems_filesystem_location_error(
712 int eno
713)
714{
715 if ( !rtems_filesystem_location_is_null( loc ) ) {
716 errno = eno;
717 }
718}
719
720int rtems_filesystem_mknod(
721 const rtems_filesystem_location_info_t *parentloc,
722 const char *name,
723 size_t namelen,
724 mode_t mode,
725 dev_t dev
726);
727
728int rtems_filesystem_chdir( rtems_filesystem_location_info_t *loc );
729
730int rtems_filesystem_chmod(
732 mode_t mode
733);
734
735int rtems_filesystem_chown(
737 uid_t owner,
738 gid_t group
739);
740
741static inline bool rtems_filesystem_is_ready_for_unmount(
743)
744{
745 bool ready = !mt_entry->mounted
746 && rtems_chain_has_only_one_node( &mt_entry->location_chain )
747 && mt_entry->mt_fs_root->reference_count == 1;
748
749 if ( ready ) {
750 rtems_chain_initialize_empty( &mt_entry->location_chain );
751 }
752
753 return ready;
754}
755
756static inline void rtems_filesystem_location_add_to_mt_entry(
758)
759{
760 rtems_filesystem_mt_entry_declare_lock_context( lock_context );
761
762 rtems_filesystem_mt_entry_lock( lock_context );
763 rtems_chain_append_unprotected(
764 &loc->mt_entry->location_chain,
765 &loc->mt_entry_node
766 );
767 rtems_filesystem_mt_entry_unlock( lock_context );
768}
769
770void rtems_filesystem_location_remove_from_mt_entry(
772);
773
774void rtems_filesystem_do_unmount(
776);
777
778static inline bool rtems_filesystem_location_is_instance_root(
780)
781{
782 const rtems_filesystem_mount_table_entry_t *mt_entry = loc->mt_entry;
783
784 return (*mt_entry->ops->are_nodes_equal_h)(
785 loc,
786 &mt_entry->mt_fs_root->location
787 );
788}
789
790static inline const char *rtems_filesystem_eval_path_get_path(
792)
793{
794 return ctx->path;
795}
796
797static inline size_t rtems_filesystem_eval_path_get_pathlen(
799)
800{
801 return ctx->pathlen;
802}
803
804static inline void rtems_filesystem_eval_path_set_path(
806 const char *path,
807 size_t pathlen
808)
809{
810 ctx->path = path;
811 ctx->pathlen = pathlen;
812}
813
814static inline void rtems_filesystem_eval_path_clear_path(
816)
817{
818 ctx->pathlen = 0;
819}
820
821static inline const char *rtems_filesystem_eval_path_get_token(
823)
824{
825 return ctx->token;
826}
827
828static inline size_t rtems_filesystem_eval_path_get_tokenlen(
830)
831{
832 return ctx->tokenlen;
833}
834
835static inline void rtems_filesystem_eval_path_set_token(
837 const char *token,
838 size_t tokenlen
839)
840{
841 ctx->token = token;
842 ctx->tokenlen = tokenlen;
843}
844
845static inline void rtems_filesystem_eval_path_clear_token(
847)
848{
849 ctx->tokenlen = 0;
850}
851
852static inline void rtems_filesystem_eval_path_put_back_token(
854)
855{
856 size_t tokenlen = ctx->tokenlen;
857
858 ctx->path -= tokenlen;
859 ctx->pathlen += tokenlen;
860 ctx->tokenlen = 0;
861}
862
863void rtems_filesystem_eval_path_eat_delimiter(
865);
866
867void rtems_filesystem_eval_path_next_token(
869);
870
871static inline void rtems_filesystem_eval_path_get_next_token(
873 const char **token,
874 size_t *tokenlen
875)
876{
877 rtems_filesystem_eval_path_next_token(ctx);
878 *token = ctx->token;
879 *tokenlen = ctx->tokenlen;
880}
881
883rtems_filesystem_eval_path_get_currentloc(
885)
886{
887 return &ctx->currentloc;
888}
889
890static inline bool rtems_filesystem_eval_path_has_path(
892)
893{
894 return ctx->pathlen > 0;
895}
896
897static inline bool rtems_filesystem_eval_path_has_token(
899)
900{
901 return ctx->tokenlen > 0;
902}
903
904static inline int rtems_filesystem_eval_path_get_flags(
906)
907{
908 return ctx->flags;
909}
910
911static inline void rtems_filesystem_eval_path_set_flags(
913 int flags
914)
915{
916 ctx->flags = flags;
917}
918
919static inline void rtems_filesystem_eval_path_clear_and_set_flags(
921 int clear,
922 int set
923)
924{
925 int flags = ctx->flags;
926
927 flags &= ~clear;
928 flags |= set;
929
930 ctx->flags = flags;
931}
932
933static inline void rtems_filesystem_eval_path_extract_currentloc(
936)
937{
938 rtems_filesystem_location_copy_and_detach(
939 get,
940 &ctx->currentloc
941 );
942}
943
944void rtems_filesystem_eval_path_error(
946 int eno
947);
948
958);
959
980 int flags,
981 mode_t object_mode,
982 uid_t object_uid,
983 gid_t object_gid
984);
985
986bool rtems_filesystem_eval_path_check_access(
988 int eval_flags,
989 mode_t node_mode,
990 uid_t node_uid,
991 gid_t node_gid
992);
993
994static inline bool rtems_filesystem_is_delimiter(char c)
995{
996 return c == '/' || c == '\\';
997}
998
999static inline bool rtems_filesystem_is_current_directory(
1000 const char *token,
1001 size_t tokenlen
1002)
1003{
1004 return tokenlen == 1 && token [0] == '.';
1005}
1006
1007static inline bool rtems_filesystem_is_parent_directory(
1008 const char *token,
1009 size_t tokenlen
1010)
1011{
1012 return tokenlen == 2 && token [0] == '.' && token [1] == '.';
1013}
1014
1015typedef ssize_t ( *rtems_libio_iovec_adapter )(
1016 rtems_libio_t *iop,
1017 const struct iovec *iov,
1018 int iovcnt,
1019 ssize_t total
1020);
1021
1022static inline ssize_t rtems_libio_iovec_eval(
1023 int fd,
1024 const struct iovec *iov,
1025 int iovcnt,
1026 unsigned int flags,
1027 rtems_libio_iovec_adapter adapter
1028)
1029{
1030 ssize_t total;
1031 int v;
1032 rtems_libio_t *iop;
1033
1034 /*
1035 * Argument validation on IO vector
1036 */
1037 if ( iov == NULL )
1039
1040 if ( iovcnt <= 0 )
1042
1043 if ( iovcnt > IOV_MAX )
1045
1046 /*
1047 * OpenGroup says that you are supposed to return EINVAL if the
1048 * sum of the iov_len values in the iov array would overflow a
1049 * ssize_t.
1050 */
1051 total = 0;
1052 for ( v = 0 ; v < iovcnt ; ++v ) {
1053 size_t len = iov[ v ].iov_len;
1054
1055 if ( len > ( size_t ) ( SSIZE_MAX - total ) ) {
1057 }
1058
1059 total += ( ssize_t ) len;
1060
1061 if ( iov[ v ].iov_base == NULL && len != 0 ) {
1063 }
1064 }
1065
1066 LIBIO_GET_IOP_WITH_ACCESS( fd, iop, flags, EBADF );
1067
1068 if ( total > 0 ) {
1069 total = ( *adapter )( iop, iov, iovcnt, total );
1070 }
1071
1072 rtems_libio_iop_drop( iop );
1073 return total;
1074}
1075
1084static inline mode_t rtems_filesystem_location_type(
1086)
1087{
1088 struct stat st;
1089
1090 st.st_mode = 0;
1091 (void) ( *loc->handlers->fstat_h )( loc, &st );
1092
1093 return st.st_mode;
1094}
1095
1098#ifdef __cplusplus
1099}
1100#endif
1101
1102#endif
1103/* 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:550
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_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:568
#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
#define NULL
Requests a GPIO pin group configuration.
Definition: xil_types.h:54
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.
ISR lock control.
Definition: isrlock.h:72
File system node operations table.
Definition: libio.h:1020
Definition: deflate.c:114
Path evaluation context.
Definition: libio.h:102
rtems_filesystem_location_info_t currentloc
Definition: libio.h:153
const char * path
Definition: libio.h:106
size_t pathlen
Definition: libio.h:111
size_t tokenlen
Definition: libio.h:123
const char * token
Definition: libio.h:117
int flags
Definition: libio.h:137
Global file system location.
Definition: fs.h:100
File system location.
Definition: fs.h:72
Mount table entry.
Definition: libio.h:1621
An open file data structure.
Definition: libio.h:1337
unsigned v
Definition: tte.h:0
User Environment Support.