diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2010-07-01 14:10:54 +0000 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2010-07-01 14:10:54 +0000 |
commit | 00bf6744f5afd9f44fe3a3dc05e9263152910938 (patch) | |
tree | 2dd17d531d77fb8ef66c01c250834599281a68f3 | |
parent | 2010-06-24 Bharath Suri <bharath.s.jois@gmail.com> (diff) | |
download | rtems-00bf6744f5afd9f44fe3a3dc05e9263152910938.tar.bz2 |
2010-06-07 Sebastian Huber <sebastian.huber@embedded-brains.de>
* libcsupport/include/rtems/libio_.h: Declare
rtems_filesystem_mount_table_control.
* libcsupport/include/rtems/libio.h: Removed
rtems_filesystem_table_first(), rtems_filesystem_table_next() and
rtems_filesystem_table_node_t declarations. Declare
rtems_per_filesystem_routine, rtems_filesystem_iterate() and
rtems_filesystem_get_mount_handler().
* libcsupport/src/mount.c: Added rtems_filesystem_mounts_first() and
rtems_filesystem_mounts_next(). Simplify mount(). Removed
rtems_filesystem_mount_table_control_init. Use
rtems_filesystem_get_mount_handler().
* libcsupport/src/mount-mgr.c: Removed rtems_filesystem_mounts_first() and
rtems_filesystem_mounts_next(). Added rtems_filesystem_iterate() and
rtems_filesystem_get_mount_handler(). Use rtems_libio_lock() and
rtems_libio_unlock();
* sapi/include/confdefs.h, libmisc/shell/main_mount.c: Update for
mount API changes.
2010-06-07 Bharath Suri <bharath.s.jois@gmail.com>
* libcsupport/include/rtems/libio_.h: Removed macros
rtems_filesystem_is_separator
rtems_filesystem_get_start_loc
rtems_filesystem_get_sym_start_loc
and added them as files under libcsupport/src/
* libcsupport/src/: Added new files
libcsupport/src/sup_fs_get_start_loc.c
libcsupport/src/sup_fs_get_sym_start_loc.c
libcsupport/src/sup_fs_is_separator.c
* libcsupport/Makefile.am: Changes to accommodate new
files under libcsupport/src/
-rw-r--r-- | cpukit/ChangeLog | 36 | ||||
-rw-r--r-- | cpukit/libcsupport/Makefile.am | 2 | ||||
-rw-r--r-- | cpukit/libcsupport/include/rtems/libio.h | 49 | ||||
-rw-r--r-- | cpukit/libcsupport/include/rtems/libio_.h | 69 | ||||
-rw-r--r-- | cpukit/libcsupport/src/mount-mgr.c | 217 | ||||
-rw-r--r-- | cpukit/libcsupport/src/mount.c | 230 | ||||
-rw-r--r-- | cpukit/libcsupport/src/sup_fs_get_start_loc.c | 48 | ||||
-rw-r--r-- | cpukit/libcsupport/src/sup_fs_get_sym_start_loc.c | 47 | ||||
-rw-r--r-- | cpukit/libcsupport/src/sup_fs_is_separator.c | 30 | ||||
-rw-r--r-- | cpukit/libmisc/shell/main_mount.c | 14 | ||||
-rw-r--r-- | cpukit/sapi/include/confdefs.h | 5 |
11 files changed, 437 insertions, 310 deletions
diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog index d1823cd5d5..d4f85dda52 100644 --- a/cpukit/ChangeLog +++ b/cpukit/ChangeLog @@ -207,6 +207,42 @@ * configure.ac: Remove c4x (dead port). * score/cpu/Makefile.am: Remove c4x (dead port). +2010-06-07 Sebastian Huber <sebastian.huber@embedded-brains.de> + + * libcsupport/include/rtems/libio_.h: Declare + rtems_filesystem_mount_table_control. + * libcsupport/include/rtems/libio.h: Removed + rtems_filesystem_table_first(), rtems_filesystem_table_next() and + rtems_filesystem_table_node_t declarations. Declare + rtems_per_filesystem_routine, rtems_filesystem_iterate() and + rtems_filesystem_get_mount_handler(). + * libcsupport/src/mount.c: Added rtems_filesystem_mounts_first() and + rtems_filesystem_mounts_next(). Simplify mount(). Removed + rtems_filesystem_mount_table_control_init. Use + rtems_filesystem_get_mount_handler(). + * libcsupport/src/mount-mgr.c: Removed rtems_filesystem_mounts_first() and + rtems_filesystem_mounts_next(). Added rtems_filesystem_iterate() and + rtems_filesystem_get_mount_handler(). Use rtems_libio_lock() and + rtems_libio_unlock(); + * sapi/include/confdefs.h, libmisc/shell/main_mount.c: Update for + mount API changes. + +2010-06-07 Bharath Suri <bharath.s.jois@gmail.com> + + * libcsupport/include/rtems/libio_.h: Removed macros + rtems_filesystem_is_separator + rtems_filesystem_get_start_loc + rtems_filesystem_get_sym_start_loc + and added them as files under libcsupport/src/ + + * libcsupport/src/: Added new files + libcsupport/src/sup_fs_get_start_loc.c + libcsupport/src/sup_fs_get_sym_start_loc.c + libcsupport/src/sup_fs_is_separator.c + + * libcsupport/Makefile.am: Changes to accommodate new + files under libcsupport/src/ + 2010-06-03 Chris Johns <chrisj@rtems.org> * sapi/include/confdefs.h: PR 1543. Make default file system when diff --git a/cpukit/libcsupport/Makefile.am b/cpukit/libcsupport/Makefile.am index c9729c289b..6b74f0e052 100644 --- a/cpukit/libcsupport/Makefile.am +++ b/cpukit/libcsupport/Makefile.am @@ -110,6 +110,8 @@ BSD_LIBC_C_FILES = src/strlcpy.c src/strlcat.c src/issetugid.c libcsupport_a_SOURCES = src/gxx_wrappers.c src/getchark.c src/printk.c \ src/printk_plugin.c src/putk.c src/vprintk.c \ + src/sup_fs_is_separator.c src/sup_fs_get_start_loc.c \ + src/sup_fs_get_sym_start_loc.c \ $(BSD_LIBC_C_FILES) $(BASE_FS_C_FILES) $(MALLOC_C_FILES) \ $(ERROR_C_FILES) $(ASSOCIATION_C_FILES) diff --git a/cpukit/libcsupport/include/rtems/libio.h b/cpukit/libcsupport/include/rtems/libio.h index dadc446ead..da9fa884a0 100644 --- a/cpukit/libcsupport/include/rtems/libio.h +++ b/cpukit/libcsupport/include/rtems/libio.h @@ -289,32 +289,51 @@ struct _rtems_filesystem_operations_table { rtems_filesystem_statvfs_t statvfs_h; }; -/* - * File system table used by mount to manage file systems. +/** + * @brief File system table entry. */ typedef struct rtems_filesystem_table_t { const char *type; rtems_filesystem_fsmount_me_t mount_h; } rtems_filesystem_table_t; -/* - * File system table runtime loaded nodes. +/** + * @brief Static table of file systems. + * + * Externally defined by confdefs.h or the user. */ -typedef struct rtems_filesystem_table_node_t { - rtems_chain_node node; - rtems_filesystem_table_t entry; -} rtems_filesystem_table_node_t; +extern const rtems_filesystem_table_t rtems_filesystem_table []; -/* - * Get the first entry in the filesystem table. +/** + * @brief Per file system table entry routine type. + * + * Return @c true to continue the iteration, and @c false to stop. */ -const rtems_filesystem_table_t* rtems_filesystem_table_first( void ); +typedef bool (*rtems_per_filesystem_routine)( + const rtems_filesystem_table_t *entry, + void *arg +); -/* - * Get the next entry in the file system table. +/** + * @brief Iterates over the file system table. + * + * For each file system table entry the @a routine will be called with the + * table entry and the @a routine_arg parameter. */ -const rtems_filesystem_table_t* -rtems_filesystem_table_next( const rtems_filesystem_table_t *entry ); +void +rtems_filesystem_iterate( + rtems_per_filesystem_routine routine, + void *routine_arg +); + +/** + * @brief Returns the file system mount handler associated with the @a type, or + * @c NULL if no such association exists. + */ +rtems_filesystem_fsmount_me_t +rtems_filesystem_get_mount_handler( + const char *type +); /* * Get the first entry in the mount table. diff --git a/cpukit/libcsupport/include/rtems/libio_.h b/cpukit/libcsupport/include/rtems/libio_.h index 22f498b98a..3f897885bb 100644 --- a/cpukit/libcsupport/include/rtems/libio_.h +++ b/cpukit/libcsupport/include/rtems/libio_.h @@ -1,4 +1,4 @@ -/** +/* * @file rtems/libio_.h */ @@ -40,6 +40,11 @@ extern rtems_id rtems_libio_semaphore; extern const rtems_filesystem_file_handlers_r rtems_filesystem_null_handlers; /* + * Mount table list. + */ +extern rtems_chain_control rtems_filesystem_mount_table_control; + +/* * File descriptor Table Information */ @@ -90,7 +95,7 @@ extern rtems_libio_t *rtems_libio_iop_freelist; #define rtems_libio_check_fd(_fd) \ do { \ - if ((uint32_t) (_fd) >= rtems_libio_number_iops) { \ + if ((uint32_t) (_fd) >= rtems_libio_number_iops) { \ errno = EBADF; \ return -1; \ } \ @@ -129,12 +134,12 @@ extern rtems_libio_t *rtems_libio_iop_freelist; * 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) { \ +#define rtems_libio_check_permissions(_iop, _flag) \ + do { \ + if (((_iop)->flags & (_flag)) == 0) { \ rtems_set_errno_and_return_minus_one( EINVAL ); \ - return -1; \ - } \ + return -1; \ + } \ } while (0) /* @@ -150,44 +155,6 @@ extern rtems_libio_t *rtems_libio_iop_freelist; (*(_node)->ops->freenod_h)( (_node) ); \ } 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 @@ -271,6 +238,18 @@ int rtems_filesystem_prefix_separators( void rtems_filesystem_initialize(void); +int init_fs_mount_table(void); + +int rtems_filesystem_is_separator(char ch); + +void rtems_filesystem_get_start_loc(const char *path, + int *index, + rtems_filesystem_location_info_t *loc); + +void rtems_filesystem_get_sym_start_loc(const char *path, + int *index, + rtems_filesystem_location_info_t *loc); + #ifdef __cplusplus } #endif diff --git a/cpukit/libcsupport/src/mount-mgr.c b/cpukit/libcsupport/src/mount-mgr.c index 68180a699d..03ead45c9b 100644 --- a/cpukit/libcsupport/src/mount-mgr.c +++ b/cpukit/libcsupport/src/mount-mgr.c @@ -6,6 +6,8 @@ * * COPYRIGHT (c) Chris Johns <chrisj@rtems.org> 2010. * + * Copyright (c) 2010 embedded brains GmbH. + * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.com/license/LICENSE. @@ -30,158 +32,139 @@ #include <rtems/libio_.h> -/* - * External defined by confdefs.h or the user. - */ -extern const rtems_filesystem_table_t configuration_filesystem_table[]; - -/* - * Points to a list of filesystems added at runtime. - */ -extern rtems_chain_control *rtems_filesystem_table; +typedef struct { + rtems_chain_node node; + rtems_filesystem_table_t entry; +} filesystem_node; -/* - * Mount table list. - */ -extern rtems_chain_control rtems_filesystem_mount_table_control; -extern bool rtems_filesystem_mount_table_control_init; +RTEMS_CHAIN_DEFINE_EMPTY(filesystem_chain); -/* - * Get the first entry in the filesystem table. - */ -const rtems_filesystem_table_t* -rtems_filesystem_table_first( - void +void +rtems_filesystem_iterate( + rtems_per_filesystem_routine routine, + void *routine_arg ) { - /* - * We can assume this because it is the root file system. - */ - return &configuration_filesystem_table[0]; -} + const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0]; + rtems_chain_node *node = NULL; -/* - * Get the next entry in the file system table. - */ -const rtems_filesystem_table_t* -rtems_filesystem_table_next( - const rtems_filesystem_table_t *entry -) -{ - const rtems_filesystem_table_t* fs; - - fs = rtems_filesystem_table_first( ); - - while ( fs->type && ( fs != entry ) ) - ++fs; - - if ( fs->type ) { - ++fs; - if ( fs->type ) - return fs; + while ( table_entry->type ) { + if ( !(*routine)( table_entry, routine_arg ) ) { + break; + } + + ++table_entry; } - if ( rtems_filesystem_table ) { - rtems_chain_node* node; - for (node = rtems_chain_first( rtems_filesystem_table ); - !rtems_chain_is_tail( rtems_filesystem_table, node); - node = rtems_chain_next( node )) { - rtems_filesystem_table_node_t* tnode; - tnode = (rtems_filesystem_table_node_t*) node; - if ( entry == &tnode->entry ) { - node = rtems_chain_next( node ); - if ( !rtems_chain_is_tail( rtems_filesystem_table, node ) ) { - tnode = (rtems_filesystem_table_node_t*) node; - return &tnode->entry; - } - } + rtems_libio_lock(); + for ( + node = rtems_chain_first( &filesystem_chain ); + !rtems_chain_is_tail( &filesystem_chain, node ); + node = rtems_chain_next( node ) + ) { + const filesystem_node *fsn = (filesystem_node *) node; + + if ( !(*routine)( &fsn->entry, routine_arg ) ) { + break; } } - - return NULL; + rtems_libio_unlock(); } -/* - * Get the first entry in the mount table. - */ -rtems_filesystem_mount_table_entry_t* -rtems_filesystem_mounts_first( - void -) +typedef struct { + const char *type; + rtems_filesystem_fsmount_me_t mount_h; +} find_arg; + +static bool find_handler(const rtems_filesystem_table_t *entry, void *arg) { - rtems_filesystem_mount_table_entry_t* entry = NULL; - if ( rtems_filesystem_mount_table_control_init ) { - if ( !rtems_chain_is_empty( &rtems_filesystem_mount_table_control ) ) - entry = (rtems_filesystem_mount_table_entry_t*) - rtems_chain_first( &rtems_filesystem_mount_table_control ); + find_arg *fa = arg; + + if ( strcmp( entry->type, fa->type ) != 0 ) { + return true; + } else { + fa->mount_h = entry->mount_h; + + return true; } - return entry; } -/* - * Get the next entry in the mount table. - */ -rtems_filesystem_mount_table_entry_t* -rtems_filesystem_mounts_next( - rtems_filesystem_mount_table_entry_t *entry +rtems_filesystem_fsmount_me_t +rtems_filesystem_get_mount_handler( + const char *type ) { - if ( !rtems_filesystem_mount_table_control_init || !entry ) - return NULL; - return (rtems_filesystem_mount_table_entry_t*) rtems_chain_next( &entry->Node ); + find_arg fa = { + .type = type, + .mount_h = NULL + }; + + if ( type != NULL ) { + rtems_filesystem_iterate( find_handler, &fa ); + } + + return fa.mount_h; } -/* - * Register a file system. - */ int rtems_filesystem_register( const char *type, rtems_filesystem_fsmount_me_t mount_h ) { - rtems_filesystem_table_node_t *fs; - if ( !rtems_filesystem_table ) { - rtems_filesystem_table = malloc( sizeof( rtems_chain_control ) ); - if ( !rtems_filesystem_table ) - rtems_set_errno_and_return_minus_one( ENOMEM ); - rtems_chain_initialize_empty ( rtems_filesystem_table ); - } - fs = malloc( sizeof( rtems_filesystem_table_node_t ) ); - if ( !fs ) - rtems_set_errno_and_return_minus_one( ENOMEM ); - fs->entry.type = strdup( type ); - if ( !fs->entry.type ) { - free( fs ); + size_t fsn_size = sizeof( filesystem_node ) + strlen(type) + 1; + filesystem_node *fsn = malloc( fsn_size ); + char *type_storage = (char *) fsn + sizeof( filesystem_node ); + + if ( fsn == NULL ) rtems_set_errno_and_return_minus_one( ENOMEM ); - } - fs->entry.mount_h = mount_h; - rtems_chain_append( rtems_filesystem_table, &fs->node ); + + strcpy(type_storage, type); + fsn->entry.type = type_storage; + fsn->entry.mount_h = mount_h; + + rtems_libio_lock(); + if ( rtems_filesystem_get_mount_handler( type ) == NULL ) { + rtems_chain_append( &filesystem_chain, &fsn->node ); + } else { + rtems_libio_unlock(); + free( fsn ); + + rtems_set_errno_and_return_minus_one( EINVAL ); + } + rtems_libio_unlock(); + return 0; } -/* - * Unregister a file system. - */ int rtems_filesystem_unregister( const char *type ) { - if ( rtems_filesystem_table ) { - rtems_chain_node *node; - for (node = rtems_chain_first( rtems_filesystem_table ); - !rtems_chain_is_tail( rtems_filesystem_table, node ); - node = rtems_chain_next( node ) ) { - rtems_filesystem_table_node_t *fs; - fs = (rtems_filesystem_table_node_t*) node; - if ( strcmp( fs->entry.type, type ) == 0 ) { - rtems_chain_extract( node ); - free( (void*) fs->entry.type ); - free( fs ); - return 0; - } + rtems_chain_node *node = NULL; + + if ( type == NULL ) { + rtems_set_errno_and_return_minus_one( EINVAL ); + } + + rtems_libio_lock(); + for ( + node = rtems_chain_first( &filesystem_chain ); + !rtems_chain_is_tail( &filesystem_chain, node ); + node = rtems_chain_next( node ) + ) { + filesystem_node *fsn = (filesystem_node *) node; + + if ( strcmp( fsn->entry.type, type ) == 0 ) { + rtems_chain_extract( node ); + free( fsn ); + rtems_libio_unlock(); + + return 0; } } + rtems_libio_unlock(); + rtems_set_errno_and_return_minus_one( ENOENT ); } diff --git a/cpukit/libcsupport/src/mount.c b/cpukit/libcsupport/src/mount.c index 3e3c47166d..07f41f2ee4 100644 --- a/cpukit/libcsupport/src/mount.c +++ b/cpukit/libcsupport/src/mount.c @@ -10,6 +10,8 @@ * COPYRIGHT (c) 1989-1999. * On-Line Applications Research Corporation (OAR). * + * Copyright (c) 2010 embedded brains GmbH. + * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.com/license/LICENSE. @@ -24,6 +26,7 @@ #include <sys/types.h> #include <sys/stat.h> #include <rtems/chain.h> +#include <rtems/seterr.h> #include <fcntl.h> #include <unistd.h> #include <errno.h> @@ -34,20 +37,9 @@ #include <rtems/libio_.h> /* - * External defined by confdefs.h or the user. - */ -extern const rtems_filesystem_table_t configuration_filesystem_table[]; - -/* - * Points to a list of filesystems added at runtime. - */ -rtems_chain_control *rtems_filesystem_table; - -/* * Mount table list. */ -rtems_chain_control rtems_filesystem_mount_table_control; -bool rtems_filesystem_mount_table_control_init; +RTEMS_CHAIN_DEFINE_EMPTY(rtems_filesystem_mount_table_control); /* * Default pathconfs. @@ -79,27 +71,64 @@ const rtems_filesystem_limits_and_options_t rtems_filesystem_default_pathconf = */ static bool Is_node_fs_root( - rtems_filesystem_location_info_t *loc + rtems_filesystem_location_info_t *loc ) { - rtems_chain_node *the_node; - rtems_filesystem_mount_table_entry_t *the_mount_entry; + rtems_chain_node *node = NULL; /* * For each mount table entry */ - if ( rtems_filesystem_mount_table_control_init ) { - for ( the_node = rtems_chain_first( &rtems_filesystem_mount_table_control ); - !rtems_chain_is_tail( &rtems_filesystem_mount_table_control, the_node ); - the_node = rtems_chain_next( the_node ) ) { - the_mount_entry = (rtems_filesystem_mount_table_entry_t *) the_node; - if ( the_mount_entry->mt_fs_root.node_access == loc->node_access ) - return true; - } + for ( node = rtems_chain_first( &rtems_filesystem_mount_table_control ); + !rtems_chain_is_tail( &rtems_filesystem_mount_table_control, node ); + node = rtems_chain_next( node ) ) { + rtems_filesystem_mount_table_entry_t *mount_table_entry = + (rtems_filesystem_mount_table_entry_t *) node; + + if ( mount_table_entry->mt_fs_root.node_access == loc->node_access ) + return true; } + return false; } +static rtems_filesystem_mount_table_entry_t *alloc_mount_table_entry( + const char *source, + const char *target, + const char *filesystemtype, + size_t *target_length_ptr +) +{ + const char *target_str = target ? target : "/"; + size_t filesystemtype_size = strlen( filesystemtype ) + 1; + size_t source_size = source ? strlen( source ) + 1 : 0; + size_t target_length = strlen( target_str ); + size_t size = sizeof( rtems_filesystem_mount_table_entry_t ) + + filesystemtype_size + source_size + target_length + 1; + rtems_filesystem_mount_table_entry_t *mt_entry = calloc( 1, size ); + + if ( mt_entry ) { + char *str = (char *) mt_entry + sizeof( *mt_entry ); + + mt_entry->type = str; + strcpy( str, filesystemtype ); + + if ( source ) { + str += filesystemtype_size; + mt_entry->dev = str; + strcpy( str, source ); + } + + str += source_size; + mt_entry->target = str; + strcpy( str, target ); + } + + *target_length_ptr = target_length; + + return mt_entry; +} + /* * mount * @@ -121,114 +150,54 @@ int mount( const char *filesystemtype, rtems_filesystem_options_t options, const void *data - ) +) { - const rtems_filesystem_table_t *entry; + rtems_filesystem_fsmount_me_t mount_h = NULL; rtems_filesystem_location_info_t loc; rtems_filesystem_mount_table_entry_t *mt_entry = NULL; rtems_filesystem_location_info_t *loc_to_free = NULL; - size_t size; - - /* - * If mount is ever called we allocate the mount table control structure. - */ - if ( !rtems_filesystem_mount_table_control_init ) { - rtems_filesystem_mount_table_control_init = true; - rtems_chain_initialize_empty ( &rtems_filesystem_mount_table_control ); - } + bool has_target = target != NULL; + size_t target_length = 0; /* * Are the file system options valid? */ if ( options != RTEMS_FILESYSTEM_READ_ONLY && - options != RTEMS_FILESYSTEM_READ_WRITE ) { - errno = EINVAL; - return -1; - } - - /* - * Check the type. - */ - if (!filesystemtype) { - errno = EINVAL; - return -1; - } + options != RTEMS_FILESYSTEM_READ_WRITE ) + rtems_set_errno_and_return_minus_one( EINVAL ); - if (strlen(filesystemtype) >= 128) { - errno = EINVAL; - return -1; - } - /* - * Check the configuration table filesystems then check any runtime added - * file systems. + * Get mount handler */ - entry = &configuration_filesystem_table[0]; - while (entry->type) { - if (strcmp (filesystemtype, entry->type) == 0) - break; - ++entry; - } - - if (!entry->type) { - entry = NULL; - if (rtems_filesystem_table) { - rtems_chain_node *the_node; - for (the_node = rtems_chain_first(rtems_filesystem_table); - !rtems_chain_is_tail(rtems_filesystem_table, the_node); - the_node = rtems_chain_next(the_node)) { - entry = &(((rtems_filesystem_table_node_t*) the_node)->entry); - if (strcmp (filesystemtype, entry->type) == 0) - break; - entry = NULL; - } - } - } + mount_h = rtems_filesystem_get_mount_handler( filesystemtype ); + if ( !mount_h ) + rtems_set_errno_and_return_minus_one( EINVAL ); - if (!entry) - { - errno = EINVAL; - return -1; - } - /* * Allocate a mount table entry */ + mt_entry = alloc_mount_table_entry( + source, + target, + filesystemtype, + &target_length + ); + if ( !mt_entry ) + rtems_set_errno_and_return_minus_one( ENOMEM ); - size = sizeof(rtems_filesystem_mount_table_entry_t); - if ( source ) - size += strlen( source ) + 1; - - mt_entry = malloc( size ); - if ( !mt_entry ) { - errno = ENOMEM; - return -1; - } - - memset( mt_entry, 0, size ); - mt_entry->mt_fs_root.mt_entry = mt_entry; - mt_entry->type = entry->type; mt_entry->options = options; mt_entry->pathconf_limits_and_options = rtems_filesystem_default_pathconf; - - if ( source ) { - mt_entry->dev = - (char *)mt_entry + sizeof( rtems_filesystem_mount_table_entry_t ); - strcpy( mt_entry->dev, source ); - } else - mt_entry->dev = 0; /* * The mount_point should be a directory with read/write/execute * permissions in the existing tree. */ - if ( target ) { - + if ( has_target ) { if ( rtems_filesystem_evaluate_path( - target, strlen( target ), RTEMS_LIBIO_PERMS_RWX, &loc, true ) == -1 ) + target, target_length, RTEMS_LIBIO_PERMS_RWX, &loc, true ) == -1 ) goto cleanup_and_bail; loc_to_free = &loc; @@ -272,7 +241,7 @@ int mount( mt_entry->mt_point_node.handlers = loc.handlers; mt_entry->mt_point_node.ops = loc.ops; mt_entry->mt_point_node.mt_entry = loc.mt_entry; - + /* * This link to the parent is only done when we are dealing with system * below the base file system @@ -286,10 +255,7 @@ int mount( if ( loc.ops->mount_h( mt_entry ) ) { goto cleanup_and_bail; } - - mt_entry->target = strdup( target ); } else { - /* * Do we already have a base file system ? */ @@ -297,26 +263,15 @@ int mount( errno = EINVAL; goto cleanup_and_bail; } - + /* * This is a mount of the base file system --> The - * mt_point_node.node_access will be set to null to indicate that this + * mt_point_node.node_access will be left to null to indicate that this * is the root of the entire file system. */ - - mt_entry->mt_fs_root.node_access = NULL; - mt_entry->mt_fs_root.handlers = NULL; - mt_entry->mt_fs_root.ops = NULL; - - mt_entry->mt_point_node.node_access = NULL; - mt_entry->mt_point_node.handlers = NULL; - mt_entry->mt_point_node.ops = NULL; - mt_entry->mt_point_node.mt_entry = NULL; - - mt_entry->target = "/"; } - if ( entry->mount_h( mt_entry, data ) ) { + if ( (*mount_h)( mt_entry, data ) ) { /* * Try to undo the mount operation */ @@ -332,14 +287,13 @@ int mount( rtems_chain_append( &rtems_filesystem_mount_table_control, &mt_entry->Node ); - if ( !target ) + if ( !has_target ) rtems_filesystem_root = mt_entry->mt_fs_root; return 0; cleanup_and_bail: - free( (void*) mt_entry->target ); free( mt_entry ); if ( loc_to_free ) @@ -348,3 +302,33 @@ cleanup_and_bail: return -1; } +/* + * Get the first entry in the mount table. + */ +rtems_filesystem_mount_table_entry_t * +rtems_filesystem_mounts_first( + void +) +{ + rtems_filesystem_mount_table_entry_t *entry = NULL; + + if ( !rtems_chain_is_empty( &rtems_filesystem_mount_table_control ) ) + entry = (rtems_filesystem_mount_table_entry_t *) + rtems_chain_first( &rtems_filesystem_mount_table_control ); + + return entry; +} + +/* + * Get the next entry in the mount table. + */ +rtems_filesystem_mount_table_entry_t * +rtems_filesystem_mounts_next( + rtems_filesystem_mount_table_entry_t *entry +) +{ + if ( !entry ) + return NULL; + return (rtems_filesystem_mount_table_entry_t *) + rtems_chain_next( &entry->Node ); +} diff --git a/cpukit/libcsupport/src/sup_fs_get_start_loc.c b/cpukit/libcsupport/src/sup_fs_get_start_loc.c new file mode 100644 index 0000000000..89f7efbb0d --- /dev/null +++ b/cpukit/libcsupport/src/sup_fs_get_start_loc.c @@ -0,0 +1,48 @@ + /** + * @file src/sup_fs_get_start_loc.c + */ + +/* + * + * COPYRIGHT (c) 1989-1999. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +/* + * rtems_filesystem_get_start_loc + * + * Function to determine if path is absolute or relative + * + * Parameters: + * + * path : IN - path to be checked + * index: OUT - 0, if relative, 1 if absolute + * loc : OUT - location info of root fs if absolute + * location info of current fs if relative + * + * Returns: void + */ + +/* Includes */ + +#include "rtems/libio_.h" + +void rtems_filesystem_get_start_loc(const char *path, + int *index, + rtems_filesystem_location_info_t *loc) +{ + if (rtems_filesystem_is_separator(path[0])) { + *loc = rtems_filesystem_root; + *index = 1; + } + else { + *loc = rtems_filesystem_current; + *index = 0; + } +} diff --git a/cpukit/libcsupport/src/sup_fs_get_sym_start_loc.c b/cpukit/libcsupport/src/sup_fs_get_sym_start_loc.c new file mode 100644 index 0000000000..4bcc964a46 --- /dev/null +++ b/cpukit/libcsupport/src/sup_fs_get_sym_start_loc.c @@ -0,0 +1,47 @@ + /** + * @file src/sup_fs_get_sym_start_loc.c + */ + +/* + * + * COPYRIGHT (c) 1989-1999. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +/* + * rtems_filesystem_get_sym_start_loc + * + * Function to determine if path is absolute or relative + * + * Parameters: + * + * path : IN - path to be checked + * index: OUT - 0, if relative, 1 if absolute + * loc : OUT - location info of root fs if absolute + * location info of current fs if relative + * + * Returns: void + */ + +/* Includes */ + +#include "rtems/libio_.h" + +void rtems_filesystem_get_sym_start_loc(const char *path, + int *index, + rtems_filesystem_location_info_t *loc) +{ + if (rtems_filesystem_is_separator(path[0])) { + *loc = rtems_filesystem_root; + *index = 1; + } + else { + *index = 0; + } +} diff --git a/cpukit/libcsupport/src/sup_fs_is_separator.c b/cpukit/libcsupport/src/sup_fs_is_separator.c new file mode 100644 index 0000000000..affd606271 --- /dev/null +++ b/cpukit/libcsupport/src/sup_fs_is_separator.c @@ -0,0 +1,30 @@ +/** + * @file src/sup_fs_is_separator.c + */ + +/* + * + * COPYRIGHT (c) 1989-1999. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + + +/* + * rtems_filesystem_is_separator + * + * Function to determine if a character is a path name separator. + * This was originally a macro in libio_.h + * + * NOTE: This function handles MS-DOS and UNIX style names. + */ + +int rtems_filesystem_is_separator(char ch) +{ + return ((ch == '/') || (ch == '\\') || (ch == '\0')); +} diff --git a/cpukit/libmisc/shell/main_mount.c b/cpukit/libmisc/shell/main_mount.c index 8062001d6a..44a9c42665 100644 --- a/cpukit/libmisc/shell/main_mount.c +++ b/cpukit/libmisc/shell/main_mount.c @@ -27,6 +27,13 @@ #include <rtems/libio.h> #include "internal.h" +static bool print_filesystem(const rtems_filesystem_table_t *entry, void *arg) +{ + printf("%s ", entry->type); + + return true; +} + int rtems_shell_main_mount( int argc, char *argv[] @@ -55,13 +62,8 @@ int rtems_shell_main_mount( } else if (argv[arg][1] == 'r') { options = RTEMS_FILESYSTEM_READ_ONLY; } else if (argv[arg][1] == 'L') { - const rtems_filesystem_table_t* fs; - fs = rtems_filesystem_table_first(); printf ("File systems: "); - while (fs) { - printf ("%s ", fs->type); - fs = rtems_filesystem_table_next(fs); - } + rtems_filesystem_iterate(print_filesystem, NULL); printf ("\n"); return 0; } else if (argv[arg][1] == 'o') { diff --git a/cpukit/sapi/include/confdefs.h b/cpukit/sapi/include/confdefs.h index ab5c7a3155..d826c27e86 100644 --- a/cpukit/sapi/include/confdefs.h +++ b/cpukit/sapi/include/confdefs.h @@ -384,12 +384,9 @@ rtems_fs_init_functions_t rtems_fs_init_helper = /** * The default file system table. Must be terminated with the NULL entry if * you provide your own. - * - * The extern is needed to stop the table being removed by the optimizer. */ - extern const rtems_filesystem_table_t configuration_filesystem_table[]; #ifndef CONFIGURE_HAS_OWN_FILESYSTEM_TABLE - const rtems_filesystem_table_t configuration_filesystem_table[] = { + const rtems_filesystem_table_t rtems_filesystem_table[] = { #if defined(CONFIGURE_FILESYSTEM_miniIMFS) && \ defined(CONFIGURE_FILESYSTEM_ENTRY_miniIMFS) CONFIGURE_FILESYSTEM_ENTRY_miniIMFS, |