diff options
Diffstat (limited to 'cpukit/libcsupport/include')
-rw-r--r-- | cpukit/libcsupport/include/rtems/libio.h | 551 | ||||
-rw-r--r-- | cpukit/libcsupport/include/rtems/libio_.h | 248 |
2 files changed, 738 insertions, 61 deletions
diff --git a/cpukit/libcsupport/include/rtems/libio.h b/cpukit/libcsupport/include/rtems/libio.h index dcdda85aec..76a90954b0 100644 --- a/cpukit/libcsupport/include/rtems/libio.h +++ b/cpukit/libcsupport/include/rtems/libio.h @@ -1,11 +1,18 @@ /* - * General purpose communication channel for RTEMS to allow UNIX/POSIX - * system call behavior on top of RTEMS IO devices. + * System call and file system interface definition * - * TODO - * stat(2) - * unlink(2) - * rename(2) + * General purpose communication channel for RTEMS to allow UNIX/POSIX + * system call behavior under RTEMS. Initially this supported only + * IO to devices but has since been enhanced to support networking + * and support for mounted file systems. + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. * * $Id$ */ @@ -15,36 +22,342 @@ #include <sys/stat.h> -typedef unsigned32 rtems_libio_offset_t; +/* + * Define data types which must be constructed using forward references. + */ + +typedef struct rtems_libio_tt rtems_libio_t; + +struct rtems_filesystem_location_info_tt; +typedef struct rtems_filesystem_location_info_tt + rtems_filesystem_location_info_t; + +struct rtems_filesystem_mount_table_entry_tt; +typedef struct rtems_filesystem_mount_table_entry_tt + rtems_filesystem_mount_table_entry_t; + +/* + * Valid RTEMS file types. + */ +typedef enum { + RTEMS_FILESYSTEM_DIRECTORY, + RTEMS_FILESYSTEM_DEVICE, + RTEMS_FILESYSTEM_HARD_LINK, + RTEMS_FILESYSTEM_SYM_LINK, + RTEMS_FILESYSTEM_MEMORY_FILE +} rtems_filesystem_node_types_t; + +/* + * File Handler Operations Table + */ + +typedef int (*rtems_filesystem_open_t)( + rtems_libio_t *iop, + const char *pathname, + unsigned32 flag, + unsigned32 mode +); + +typedef int (*rtems_filesystem_close_t)( + rtems_libio_t *iop +); + +typedef int (*rtems_filesystem_read_t)( + rtems_libio_t *iop, + void *buffer, + unsigned32 count +); + +typedef int (*rtems_filesystem_write_t)( + rtems_libio_t *iop, + const void *buffer, + unsigned32 count +); + +typedef int (*rtems_filesystem_ioctl_t)( + rtems_libio_t *iop, + unsigned32 command, + void *buffer +); + +typedef int (*rtems_filesystem_lseek_t)( + rtems_libio_t *iop, + off_t length, + int whence +); + +typedef int (*rtems_filesystem_fstat_t)( + rtems_filesystem_location_info_t *loc, + struct stat *buf +); + +typedef int (*rtems_filesystem_fchmod_t)( + rtems_filesystem_location_info_t *loc, + mode_t mode +); + +typedef int (*rtems_filesystem_ftruncate_t)( + rtems_libio_t *iop, + off_t length +); + +typedef int (*rtems_filesystem_fpathconf_t)( + rtems_libio_t *iop, + int name +); + +typedef int (*rtems_filesystem_fsync_t)( + rtems_libio_t *iop +); + +typedef int (*rtems_filesystem_fdatasync_t)( + rtems_libio_t *iop +); + +typedef struct { + rtems_filesystem_open_t open; + rtems_filesystem_close_t close; + rtems_filesystem_read_t read; + rtems_filesystem_write_t write; + rtems_filesystem_ioctl_t ioctl; + rtems_filesystem_lseek_t lseek; + rtems_filesystem_fstat_t fstat; + rtems_filesystem_fchmod_t fchmod; + rtems_filesystem_ftruncate_t ftruncate; + rtems_filesystem_fpathconf_t fpathconf; + rtems_filesystem_fsync_t fsync; + rtems_filesystem_fdatasync_t fdatasync; +} rtems_filesystem_file_handlers_r; + +/* + * File System Operations Table + */ + +/* + * XXX + * This routine does not allocate any space and rtems_filesystem_freenode_t + * is not called by the generic after calling this routine. + * ie. node_access does not have to contain valid data when the + * routine returns. + */ + +typedef int (*rtems_filesystem_mknod_t)( + const char *path, /* IN */ + mode_t mode, /* IN */ + dev_t dev, /* IN */ + rtems_filesystem_location_info_t *pathloc /* IN/OUT */ +); + +/* + * rtems_filesystem_freenode_t must be called by the generic after + * calling this routine + */ + +typedef int (*rtems_filesystem_evalpath_t)( + const char *pathname, /* IN */ + int flags, /* IN */ + rtems_filesystem_location_info_t *pathloc /* IN/OUT */ +); + +typedef int (*rtems_filesystem_evalmake_t)( + const char *path, /* IN */ + rtems_filesystem_location_info_t *pathloc, /* IN/OUT */ + const char **name /* OUT */ +); + +typedef int (*rtems_filesystem_link_t)( + rtems_filesystem_location_info_t *to_loc, /* IN */ + rtems_filesystem_location_info_t *parent_loc, /* IN */ + const char *name /* IN */ +); + +typedef int (*rtems_filesystem_unlink_t)( + rtems_filesystem_location_info_t *pathloc /* IN */ +); + +typedef int (*rtems_filesystem_chown_t)( + rtems_filesystem_location_info_t *pathloc, /* IN */ + uid_t owner, /* IN */ + gid_t group /* IN */ +); + +typedef int (*rtems_filesystem_freenode_t)( + rtems_filesystem_location_info_t *pathloc /* IN */ +); + +typedef int (*rtems_filesystem_rmnod_t)( + rtems_filesystem_location_info_t *pathloc /* IN */ +); + +typedef int (* rtems_filesystem_mount_t ) ( + rtems_filesystem_mount_table_entry_t *mt_entry /* in */ +); + +typedef int (* rtems_filesystem_fsmount_me_t )( + rtems_filesystem_mount_table_entry_t *mt_entry +); + +typedef int (* rtems_filesystem_unmount_t ) ( + rtems_filesystem_mount_table_entry_t *mt_entry /* in */ +); + +typedef int (* rtems_filesystem_fsunmount_me_t ) ( + rtems_filesystem_mount_table_entry_t *mt_entry /* in */ +); + +typedef rtems_filesystem_node_types_t (* rtems_filesystem_node_type_t) ( + rtems_filesystem_location_info_t *pathloc /* in */ +); + +typedef int (* rtems_filesystem_utime_t)( + rtems_filesystem_location_info_t *pathloc, /* IN */ + time_t actime, /* IN */ + time_t modtime /* IN */ +); + +typedef int (*rtems_filesystem_evaluate_link_t)( + rtems_filesystem_location_info_t *pathloc, /* IN/OUT */ + int flags /* IN */ +); + +typedef int (*rtems_filesystem_symlink_t)( + rtems_filesystem_location_info_t *loc, /* IN */ + const char *link_name, /* IN */ + const char *node_name +); + +typedef int (*rtems_filesystem_readlink_t)( + rtems_filesystem_location_info_t *loc, /* IN */ + char *buf, /* OUT */ + size_t bufsize +); + +/* + * operations table that must be defined for every file system. + */ + +/* + * File system types + */ +typedef struct { + rtems_filesystem_evalpath_t evalpath; + rtems_filesystem_evalmake_t evalformake; + rtems_filesystem_link_t link; + rtems_filesystem_unlink_t unlink; + rtems_filesystem_node_type_t node_type; + rtems_filesystem_mknod_t mknod; + rtems_filesystem_rmnod_t rmnod; + rtems_filesystem_chown_t chown; + rtems_filesystem_freenode_t freenod; + rtems_filesystem_mount_t mount; + rtems_filesystem_fsmount_me_t fsmount_me; + rtems_filesystem_unmount_t unmount; + rtems_filesystem_fsunmount_me_t fsunmount_me; + rtems_filesystem_utime_t utime; + rtems_filesystem_evaluate_link_t eval_link; + rtems_filesystem_symlink_t symlink; + rtems_filesystem_readlink_t readlink; +} rtems_filesystem_operations_table; + +#define IMFS_FILE_SYSTEM IMFS_ops +extern rtems_filesystem_operations_table IMFS_ops; + /* - * An open file data structure, indexed by 'fd' - * TODO: - * should really have a separate per/file data structure that this - * points to (eg: size, offset, driver, pathname should be in that) + * Structure used to determine a location/filesystem in the tree. + */ + +struct rtems_filesystem_location_info_tt +{ + void *node_access; + rtems_filesystem_file_handlers_r *handlers; + rtems_filesystem_operations_table *ops; + rtems_filesystem_mount_table_entry_t *mt_entry; +}; + +/* + * Structure used to contain file system specific information which + * is required to support fpathconf(). */ typedef struct { - rtems_driver_name_t *driver; - rtems_libio_offset_t size; /* size of file */ - rtems_libio_offset_t offset; /* current offset into the file */ - unsigned32 flags; - char *pathname; /* opened pathname */ - Objects_Id sem; - unsigned32 data0; /* private to "driver" */ - void *data1; /* ... */ -} rtems_libio_t; + int link_max; + int max_canon; + int max_input; + int name_max; + int path_max; + int pipe_buf; + int posix_async_io; + int posix_chown_restrictions; + int posix_no_trunc; + int posix_prio_io; + int posix_sync_io; + int posix_vdisable; +} rtems_filesystem_limits_and_options_t; + +/* + * Structure for a mount table entry. + */ + +struct rtems_filesystem_mount_table_entry_tt{ + Chain_Node Node; + rtems_filesystem_location_info_t mt_point_node; + rtems_filesystem_location_info_t mt_fs_root; + int options; + void *fs_info; + + rtems_filesystem_limits_and_options_t pathconf_limits_and_options; + /* + * When someone adds a mounted filesystem on a real device, + * this will need to be used. + * + * The best option long term for this is probably an open file descriptor. + */ + char *dev; +}; /* - * param block for read/write - * Note: it must include 'offset' instead of using iop's offset since - * we can have multiple outstanding i/o's on a device. + * Valid RTEMS file systems options + */ + +typedef enum +{ + RTEMS_FILESYSTEM_READ_ONLY, + RTEMS_FILESYSTEM_READ_WRITE_ONLY, + RTEMS_FILESYSTEM_BAD_OPTIONS +} rtems_filesystem_options_t; + + +/* + * An open file data structure, indexed by 'fd' + * TODO: + * should really have a separate per/file data structure that this + * points to (eg: size, offset, driver, pathname should be in that) + */ + +struct rtems_libio_tt { + rtems_driver_name_t *driver; + off_t size; /* size of file */ + off_t offset; /* current offset into file */ + unsigned32 flags; + rtems_filesystem_location_info_t pathinfo; + Objects_Id sem; + unsigned32 data0; /* private to "driver" */ + void *data1; /* ... */ + void *file_info; /* used by file handlers */ + rtems_filesystem_file_handlers_r *handlers; /* type specific handlers */ +}; + +/* + * param block for read/write + * Note: it must include 'offset' instead of using iop's offset since + * we can have multiple outstanding i/o's on a device. */ typedef struct { rtems_libio_t *iop; - rtems_libio_offset_t offset; + off_t offset; unsigned8 *buffer; unsigned32 count; unsigned32 flags; @@ -52,7 +365,7 @@ typedef struct { } rtems_libio_rw_args_t; /* - * param block for open/close + * param block for open/close */ typedef struct { @@ -62,7 +375,7 @@ typedef struct { } rtems_libio_open_close_args_t; /* - * param block for ioctl + * param block for ioctl */ typedef struct { @@ -72,9 +385,8 @@ typedef struct { unsigned32 ioctl_return; } rtems_libio_ioctl_args_t; - /* - * Values for 'flag' + * Values for 'flag' */ #define LIBIO_FLAGS_NO_DELAY 0x0001 /* return immediately if no data */ @@ -84,33 +396,72 @@ typedef struct { #define LIBIO_FLAGS_OPEN 0x0100 /* device is open */ #define LIBIO_FLAGS_APPEND 0x0200 /* all writes append */ #define LIBIO_FLAGS_CREATE 0x0400 /* create file */ +#define LIBIO_FLAGS_CLOSE_ON_EXEC 0x0800 /* close on process exec() */ #define LIBIO_FLAGS_READ_WRITE (LIBIO_FLAGS_READ | LIBIO_FLAGS_WRITE) -void rtems_libio_init(void); -int __rtems_open(const char *pathname, unsigned32 flag, unsigned32 mode); -int __rtems_close(int fd); -int __rtems_read(int fd, void *buffer, unsigned32 count); -int __rtems_write(int fd, const void *buffer, unsigned32 count); -int __rtems_ioctl(int fd, unsigned32 command, void *buffer); -int __rtems_lseek(int fd, rtems_libio_offset_t offset, int whence); -int __rtems_fstat(int _fd, struct stat* _sbuf); +void rtems_libio_init(void); /* - * External I/O handlers + * External I/O handlers */ + +typedef int (*rtems_libio_open_t)( + const char *pathname, + unsigned32 flag, + unsigned32 mode +); + +typedef int (*rtems_libio_close_t)( + int fd +); + +typedef int (*rtems_libio_read_t)( + int fd, + void *buffer, + unsigned32 count +); + +typedef int (*rtems_libio_write_t)( + int fd, + const void *buffer, + unsigned32 count +); + +typedef int (*rtems_libio_ioctl_t)( + int fd, + unsigned32 command, + void *buffer +); + +typedef int (*rtems_libio_lseek_t)( + int fd, + off_t offset, + int whence +); + typedef struct { - int (*open)(const char *pathname, unsigned32 flag, unsigned32 mode); - int (*close)(int fd); - int (*read)(int fd, void *buffer, unsigned32 count); - int (*write)(int fd, const void *buffer, unsigned32 count); - int (*ioctl)(int fd, unsigned32 command, void *buffer); - int (*lseek)(int fd, rtems_libio_offset_t offset, int whence); + rtems_libio_open_t open; + rtems_libio_close_t close; + rtems_libio_read_t read; + rtems_libio_write_t write; + rtems_libio_ioctl_t ioctl; + rtems_libio_lseek_t lseek; } rtems_libio_handler_t; -void rtems_register_libio_handler(int handler_flag, - const rtems_libio_handler_t *handler); +/* + * Register a set of external handlers + */ + +void rtems_register_libio_handler( + int handler_flag, + const rtems_libio_handler_t *handler +); + +/* + * Macros to assist in management of external IO handlers. + */ #define RTEMS_FILE_DESCRIPTOR_TYPE_FILE 0x0000 #define RTEMS_FILE_DESCRIPTOR_TYPE_SOCKET 0x1000 @@ -128,39 +479,117 @@ void rtems_register_libio_handler(int handler_flag, #define RTEMS_IO_TCDRAIN 3 /* + * The following macros are used to build up the permissions sets + * used to check permissions. These are similar in style to the + * mode_t bits and should stay compatible with them. + */ + +#define RTEMS_LIBIO_PERMS_READ S_IROTH +#define RTEMS_LIBIO_PERMS_WRITE S_IWOTH +#define RTEMS_LIBIO_PERMS_RDWR (S_IROTH|S_IWOTH) +#define RTEMS_LIBIO_PERMS_EXEC S_IXOTH +#define RTEMS_LIBIO_PERMS_SEARCH RTEMS_LIBIO_PERMS_EXEC +#define RTEMS_LIBIO_PERMS_RWX S_IRWXO + +/* + * Macros + */ + +#define rtems_filesystem_make_dev_t( _major, _minor ) \ + ((((dev_t)(_major)) << 32) | (dev_t)(_minor)) + +#define rtems_filesystem_split_dev_t( _dev, _major, _minor ) \ + do { \ + (_major) = (rtems_device_major_number) ((_dev) >> 32); \ + (_minor) = (rtems_device_minor_number) ((_dev) & 0xFFFFFFFF); \ + } while(0) + +/* + * Verifies that the permission flag is valid. + */ +#define rtems_libio_is_valid_perms( _perm ) \ + (~ ((~RTEMS_LIBIO_PERMS_RWX) & _perm )) + + +/* + * Prototypes for filesystem + */ + +void rtems_filesystem_initialize( void ); + + +/* * Callbacks from TERMIOS routines to device-dependent code */ + #include <termios.h> + typedef struct rtems_termios_callbacks { - int (*firstOpen)(int major, int minor, void *arg); - int (*lastClose)(int major, int minor, void *arg); - int (*pollRead)(int minor); - int (*write)(int minor, const char *buf, int len); - int (*setAttributes)(int minor, const struct termios *t); - int (*stopRemoteTx)(int minor); - int (*startRemoteTx)(int minor); - int outputUsesInterrupts; + int (*firstOpen)(int major, int minor, void *arg); + int (*lastClose)(int major, int minor, void *arg); + int (*pollRead)(int minor); + int (*write)(int minor, const char *buf, int len); + int (*setAttributes)(int minor, const struct termios *t); + int (*stopRemoteTx)(int minor); + int (*startRemoteTx)(int minor); + int outputUsesInterrupts; } rtems_termios_callbacks; /* - * Device-independent TERMIOS routines + * Device-independent TERMIOS routines */ + void rtems_termios_initialize (void); + rtems_status_code rtems_termios_open ( rtems_device_major_number major, rtems_device_minor_number minor, void *arg, const rtems_termios_callbacks *callbacks - ); -rtems_status_code rtems_termios_close (void *arg); -rtems_status_code rtems_termios_read (void *arg); -rtems_status_code rtems_termios_write (void *arg); -rtems_status_code rtems_termios_ioctl (void *arg); -int rtems_termios_enqueue_raw_characters (void *ttyp, char *buf, int len); -int rtems_termios_dequeue_characters (void *ttyp, int len); +); + +rtems_status_code rtems_termios_close( + void *arg +); + +rtems_status_code rtems_termios_read( + void *arg +); + +rtems_status_code rtems_termios_write( + void *arg +); + +rtems_status_code rtems_termios_ioctl( + void *arg +); + +int rtems_termios_enqueue_raw_characters( + void *ttyp, + char *buf, + int len +); + +int rtems_termios_dequeue_characters( + void *ttyp, + int len +); + void rtems_termios_reserve_resources( rtems_configuration_table *configuration, rtems_unsigned32 number_of_devices ); +int unmount( + const char *mount_path +); + +int mount( + rtems_filesystem_mount_table_entry_t **mt_entry, + rtems_filesystem_operations_table *fs_ops, + char *fsoptions, + char *device, + char *mount_point +); + #endif /* _RTEMS_LIBIO_H */ diff --git a/cpukit/libcsupport/include/rtems/libio_.h b/cpukit/libcsupport/include/rtems/libio_.h new file mode 100644 index 0000000000..bb6f81f35a --- /dev/null +++ b/cpukit/libcsupport/include/rtems/libio_.h @@ -0,0 +1,248 @@ +/* + * Libio Internal Information + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#ifndef __LIBIO__h +#define __LIBIO__h + +#ifdef __cplusplus +extern "C" { +#endif + +#include <rtems.h> +#include <rtems/assoc.h> /* assoc.h not included by rtems.h */ +#include <rtems/libio.h> + +#include <stdio.h> /* O_RDONLY, et.al. */ +#include <fcntl.h> /* O_RDONLY, et.al. */ +#include <assert.h> +#include <stdarg.h> + +#if ! defined(O_NDELAY) +# if defined(solaris2) +# define O_NDELAY O_NONBLOCK +# elif defined(RTEMS_NEWLIB) +# define O_NDELAY _FNBIO +# endif +#endif + +#include <errno.h> +#include <string.h> /* strcmp */ +#include <unistd.h> +#include <stdlib.h> /* calloc() */ + +#include "libio.h" /* libio.h not pulled in by rtems */ + + +/* + * Semaphore to protect the io table + */ + +#define RTEMS_LIBIO_SEM rtems_build_name('L', 'B', 'I', 'O') +#define RTEMS_LIBIO_IOP_SEM(n) rtems_build_name('L', 'B', 'I', n) + +extern rtems_id rtems_libio_semaphore; + +/* + * File descriptor Table Information + */ + +extern unsigned32 rtems_libio_number_iops; +extern rtems_libio_t *rtems_libio_iops; +extern rtems_libio_t *rtems_libio_last_iop; + +/* + * External I/O Handlers Table + * + * Space for all possible handlers is preallocated + * to speed up dispatch to external handlers. + */ + +extern rtems_libio_handler_t rtems_libio_handlers[15]; + +/* + * Default mode for all files. + */ + +extern mode_t rtems_filesystem_umask; + +/* + * set_errno_and_return_minus_one + * + * Macro to ease common way to return an error. + */ + +#ifndef set_errno_and_return_minus_one +#define set_errno_and_return_minus_one( _error ) \ + do { errno = (_error); return -1; } while(0) +#endif + +/* + * rtems_libio_iop + * + * Macro to return the file descriptor pointer. + */ + +#define rtems_libio_iop(_fd) \ + ((((unsigned32)(_fd)) < rtems_libio_number_iops) ? \ + &rtems_libio_iops[_fd] : 0) + +/* + * rtems_libio_check_fd + * + * Macro to check if a file descriptor number is valid. + */ + +#define rtems_libio_check_fd(_fd) \ + do { \ + if ((unsigned32) (_fd) >= rtems_libio_number_iops) { \ + errno = EBADF; \ + return -1; \ + } \ + } while (0) + +/* + * rtems_libio_check_fd + * + * Macro to check if a buffer pointer is valid. + */ + +#define rtems_libio_check_buffer(_buffer) \ + do { \ + if ((_buffer) == 0) { \ + errno = EINVAL; \ + return -1; \ + } \ + } while (0) + +/* + * rtems_libio_check_count + * + * Macro to check if a count or length is valid. + */ + +#define rtems_libio_check_count(_count) \ + do { \ + if ((_count) == 0) { \ + return 0; \ + } \ + } while (0) + +/* + * rtems_libio_check_permissions + * + * Macro to check if a file descriptor is open for this operation. + */ + +#define rtems_libio_check_permissions(_iop, _flag) \ + do { \ + if (((_iop)->flags & (_flag)) == 0) { \ + set_errno_and_return_minus_one( EINVAL ); \ + return -1; \ + } \ + } while (0) + +/* + * rtems_filesystem_is_separator + * + * Macro to determine if a character is a path name separator. + * + * NOTE: This macro handles MS-DOS and UNIX style names. + */ + +#define rtems_filesystem_is_separator( _ch ) \ + ( ((_ch) == '/') || ((_ch) == '\\') || ((_ch) == '\0')) + +/* + * rtems_filesystem_get_start_loc + * + * Macro to determine if path is absolute or relative. + */ + +#define rtems_filesystem_get_start_loc( _path, _index, _loc ) \ + do { \ + if ( rtems_filesystem_is_separator( (_path)[ 0 ] ) ) { \ + *(_loc) = rtems_filesystem_root; \ + *(_index) = 1; \ + } else { \ + *(_loc) = rtems_filesystem_current; \ + *(_index) = 0; \ + } \ + } while (0) + +#define rtems_filesystem_get_sym_start_loc( _path, _index, _loc ) \ + do { \ + if ( rtems_filesystem_is_separator( (_path)[ 0 ] ) ) { \ + *(_loc) = rtems_filesystem_root; \ + *(_index) = 1; \ + } else { \ + *(_index) = 0; \ + } \ + } while (0) + + +/* + * External structures + */ + +extern rtems_filesystem_location_info_t rtems_filesystem_current; +extern rtems_filesystem_location_info_t rtems_filesystem_root; +extern nlink_t rtems_filesystem_link_counts; + + +/* + * File Descriptor Routine Prototypes + */ + +rtems_libio_t *rtems_libio_allocate(void); + +unsigned32 rtems_libio_fcntl_flags( + unsigned32 fcntl_flags +); + +void rtems_libio_free( + rtems_libio_t *iop +); + +int rtems_libio_is_open_files_in_fs( + rtems_filesystem_mount_table_entry_t *mt_entry +); + +int rtems_libio_is_file_open( + void *node_access +); + +/* + * File System Routine Prototypes + */ + +int rtems_filesystem_evaluate_path( + const char *pathname, + int flags, + rtems_filesystem_location_info_t *pathloc, + int follow_link +); + +void rtems_filesystem_initialize(); + +int init_fs_mount_table(); + +#ifdef __cplusplus +} +#endif + +#endif +/* end of include file */ + + + |