forked from Imagelibrary/rtems
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/
This commit is contained in:
@@ -207,6 +207,42 @@
|
|||||||
* configure.ac: Remove c4x (dead port).
|
* configure.ac: Remove c4x (dead port).
|
||||||
* score/cpu/Makefile.am: 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>
|
2010-06-03 Chris Johns <chrisj@rtems.org>
|
||||||
|
|
||||||
* sapi/include/confdefs.h: PR 1543. Make default file system when
|
* sapi/include/confdefs.h: PR 1543. Make default file system when
|
||||||
|
|||||||
@@ -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 \
|
libcsupport_a_SOURCES = src/gxx_wrappers.c src/getchark.c src/printk.c \
|
||||||
src/printk_plugin.c src/putk.c src/vprintk.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) \
|
$(BSD_LIBC_C_FILES) $(BASE_FS_C_FILES) $(MALLOC_C_FILES) \
|
||||||
$(ERROR_C_FILES) $(ASSOCIATION_C_FILES)
|
$(ERROR_C_FILES) $(ASSOCIATION_C_FILES)
|
||||||
|
|
||||||
|
|||||||
@@ -289,32 +289,51 @@ struct _rtems_filesystem_operations_table {
|
|||||||
rtems_filesystem_statvfs_t statvfs_h;
|
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 {
|
typedef struct rtems_filesystem_table_t {
|
||||||
const char *type;
|
const char *type;
|
||||||
rtems_filesystem_fsmount_me_t mount_h;
|
rtems_filesystem_fsmount_me_t mount_h;
|
||||||
} rtems_filesystem_table_t;
|
} 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 {
|
extern const rtems_filesystem_table_t rtems_filesystem_table [];
|
||||||
rtems_chain_node node;
|
|
||||||
rtems_filesystem_table_t entry;
|
|
||||||
} rtems_filesystem_table_node_t;
|
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* 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*
|
void
|
||||||
rtems_filesystem_table_next( const rtems_filesystem_table_t *entry );
|
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.
|
* Get the first entry in the mount table.
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/**
|
/*
|
||||||
* @file rtems/libio_.h
|
* @file rtems/libio_.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -39,6 +39,11 @@ extern "C" {
|
|||||||
extern rtems_id rtems_libio_semaphore;
|
extern rtems_id rtems_libio_semaphore;
|
||||||
extern const rtems_filesystem_file_handlers_r rtems_filesystem_null_handlers;
|
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
|
* File descriptor Table Information
|
||||||
*/
|
*/
|
||||||
@@ -90,7 +95,7 @@ extern rtems_libio_t *rtems_libio_iop_freelist;
|
|||||||
|
|
||||||
#define rtems_libio_check_fd(_fd) \
|
#define rtems_libio_check_fd(_fd) \
|
||||||
do { \
|
do { \
|
||||||
if ((uint32_t) (_fd) >= rtems_libio_number_iops) { \
|
if ((uint32_t) (_fd) >= rtems_libio_number_iops) { \
|
||||||
errno = EBADF; \
|
errno = EBADF; \
|
||||||
return -1; \
|
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.
|
* Macro to check if a file descriptor is open for this operation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define rtems_libio_check_permissions(_iop, _flag) \
|
#define rtems_libio_check_permissions(_iop, _flag) \
|
||||||
do { \
|
do { \
|
||||||
if (((_iop)->flags & (_flag)) == 0) { \
|
if (((_iop)->flags & (_flag)) == 0) { \
|
||||||
rtems_set_errno_and_return_minus_one( EINVAL ); \
|
rtems_set_errno_and_return_minus_one( EINVAL ); \
|
||||||
return -1; \
|
return -1; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -150,44 +155,6 @@ extern rtems_libio_t *rtems_libio_iop_freelist;
|
|||||||
(*(_node)->ops->freenod_h)( (_node) ); \
|
(*(_node)->ops->freenod_h)( (_node) ); \
|
||||||
} while (0)
|
} 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
|
* External structures
|
||||||
@@ -271,6 +238,18 @@ int rtems_filesystem_prefix_separators(
|
|||||||
|
|
||||||
void rtems_filesystem_initialize(void);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
*
|
*
|
||||||
* COPYRIGHT (c) Chris Johns <chrisj@rtems.org> 2010.
|
* COPYRIGHT (c) Chris Johns <chrisj@rtems.org> 2010.
|
||||||
*
|
*
|
||||||
|
* Copyright (c) 2010 embedded brains GmbH.
|
||||||
|
*
|
||||||
* The license and distribution terms for this file may be
|
* The license and distribution terms for this file may be
|
||||||
* found in the file LICENSE in this distribution or at
|
* found in the file LICENSE in this distribution or at
|
||||||
* http://www.rtems.com/license/LICENSE.
|
* http://www.rtems.com/license/LICENSE.
|
||||||
@@ -30,158 +32,139 @@
|
|||||||
|
|
||||||
#include <rtems/libio_.h>
|
#include <rtems/libio_.h>
|
||||||
|
|
||||||
/*
|
typedef struct {
|
||||||
* External defined by confdefs.h or the user.
|
rtems_chain_node node;
|
||||||
*/
|
rtems_filesystem_table_t entry;
|
||||||
extern const rtems_filesystem_table_t configuration_filesystem_table[];
|
} filesystem_node;
|
||||||
|
|
||||||
/*
|
RTEMS_CHAIN_DEFINE_EMPTY(filesystem_chain);
|
||||||
* Points to a list of filesystems added at runtime.
|
|
||||||
*/
|
|
||||||
extern rtems_chain_control *rtems_filesystem_table;
|
|
||||||
|
|
||||||
/*
|
void
|
||||||
* Mount table list.
|
rtems_filesystem_iterate(
|
||||||
*/
|
rtems_per_filesystem_routine routine,
|
||||||
extern rtems_chain_control rtems_filesystem_mount_table_control;
|
void *routine_arg
|
||||||
extern bool rtems_filesystem_mount_table_control_init;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the first entry in the filesystem table.
|
|
||||||
*/
|
|
||||||
const rtems_filesystem_table_t*
|
|
||||||
rtems_filesystem_table_first(
|
|
||||||
void
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
/*
|
const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0];
|
||||||
* We can assume this because it is the root file system.
|
rtems_chain_node *node = NULL;
|
||||||
*/
|
|
||||||
return &configuration_filesystem_table[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
while ( table_entry->type ) {
|
||||||
* Get the next entry in the file system table.
|
if ( !(*routine)( table_entry, routine_arg ) ) {
|
||||||
*/
|
break;
|
||||||
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( );
|
++table_entry;
|
||||||
|
|
||||||
while ( fs->type && ( fs != entry ) )
|
|
||||||
++fs;
|
|
||||||
|
|
||||||
if ( fs->type ) {
|
|
||||||
++fs;
|
|
||||||
if ( fs->type )
|
|
||||||
return fs;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( rtems_filesystem_table ) {
|
rtems_libio_lock();
|
||||||
rtems_chain_node* node;
|
for (
|
||||||
for (node = rtems_chain_first( rtems_filesystem_table );
|
node = rtems_chain_first( &filesystem_chain );
|
||||||
!rtems_chain_is_tail( rtems_filesystem_table, node);
|
!rtems_chain_is_tail( &filesystem_chain, node );
|
||||||
node = rtems_chain_next( node )) {
|
node = rtems_chain_next( node )
|
||||||
rtems_filesystem_table_node_t* tnode;
|
) {
|
||||||
tnode = (rtems_filesystem_table_node_t*) node;
|
const filesystem_node *fsn = (filesystem_node *) node;
|
||||||
if ( entry == &tnode->entry ) {
|
|
||||||
node = rtems_chain_next( node );
|
if ( !(*routine)( &fsn->entry, routine_arg ) ) {
|
||||||
if ( !rtems_chain_is_tail( rtems_filesystem_table, node ) ) {
|
break;
|
||||||
tnode = (rtems_filesystem_table_node_t*) node;
|
|
||||||
return &tnode->entry;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
rtems_libio_unlock();
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
typedef struct {
|
||||||
* Get the first entry in the mount table.
|
const char *type;
|
||||||
*/
|
rtems_filesystem_fsmount_me_t mount_h;
|
||||||
rtems_filesystem_mount_table_entry_t*
|
} find_arg;
|
||||||
rtems_filesystem_mounts_first(
|
|
||||||
void
|
static bool find_handler(const rtems_filesystem_table_t *entry, void *arg)
|
||||||
)
|
|
||||||
{
|
{
|
||||||
rtems_filesystem_mount_table_entry_t* entry = NULL;
|
find_arg *fa = arg;
|
||||||
if ( rtems_filesystem_mount_table_control_init ) {
|
|
||||||
if ( !rtems_chain_is_empty( &rtems_filesystem_mount_table_control ) )
|
if ( strcmp( entry->type, fa->type ) != 0 ) {
|
||||||
entry = (rtems_filesystem_mount_table_entry_t*)
|
return true;
|
||||||
rtems_chain_first( &rtems_filesystem_mount_table_control );
|
} else {
|
||||||
|
fa->mount_h = entry->mount_h;
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return entry;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
rtems_filesystem_fsmount_me_t
|
||||||
* Get the next entry in the mount table.
|
rtems_filesystem_get_mount_handler(
|
||||||
*/
|
const char *type
|
||||||
rtems_filesystem_mount_table_entry_t*
|
|
||||||
rtems_filesystem_mounts_next(
|
|
||||||
rtems_filesystem_mount_table_entry_t *entry
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if ( !rtems_filesystem_mount_table_control_init || !entry )
|
find_arg fa = {
|
||||||
return NULL;
|
.type = type,
|
||||||
return (rtems_filesystem_mount_table_entry_t*) rtems_chain_next( &entry->Node );
|
.mount_h = NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
if ( type != NULL ) {
|
||||||
|
rtems_filesystem_iterate( find_handler, &fa );
|
||||||
|
}
|
||||||
|
|
||||||
|
return fa.mount_h;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Register a file system.
|
|
||||||
*/
|
|
||||||
int
|
int
|
||||||
rtems_filesystem_register(
|
rtems_filesystem_register(
|
||||||
const char *type,
|
const char *type,
|
||||||
rtems_filesystem_fsmount_me_t mount_h
|
rtems_filesystem_fsmount_me_t mount_h
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
rtems_filesystem_table_node_t *fs;
|
size_t fsn_size = sizeof( filesystem_node ) + strlen(type) + 1;
|
||||||
if ( !rtems_filesystem_table ) {
|
filesystem_node *fsn = malloc( fsn_size );
|
||||||
rtems_filesystem_table = malloc( sizeof( rtems_chain_control ) );
|
char *type_storage = (char *) fsn + sizeof( filesystem_node );
|
||||||
if ( !rtems_filesystem_table )
|
|
||||||
rtems_set_errno_and_return_minus_one( ENOMEM );
|
if ( fsn == NULL )
|
||||||
rtems_chain_initialize_empty ( rtems_filesystem_table );
|
rtems_set_errno_and_return_minus_one( ENOMEM );
|
||||||
|
|
||||||
|
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 );
|
||||||
}
|
}
|
||||||
fs = malloc( sizeof( rtems_filesystem_table_node_t ) );
|
rtems_libio_unlock();
|
||||||
if ( !fs )
|
|
||||||
rtems_set_errno_and_return_minus_one( ENOMEM );
|
|
||||||
fs->entry.type = strdup( type );
|
|
||||||
if ( !fs->entry.type ) {
|
|
||||||
free( fs );
|
|
||||||
rtems_set_errno_and_return_minus_one( ENOMEM );
|
|
||||||
}
|
|
||||||
fs->entry.mount_h = mount_h;
|
|
||||||
rtems_chain_append( rtems_filesystem_table, &fs->node );
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Unregister a file system.
|
|
||||||
*/
|
|
||||||
int
|
int
|
||||||
rtems_filesystem_unregister(
|
rtems_filesystem_unregister(
|
||||||
const char *type
|
const char *type
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if ( rtems_filesystem_table ) {
|
rtems_chain_node *node = NULL;
|
||||||
rtems_chain_node *node;
|
|
||||||
for (node = rtems_chain_first( rtems_filesystem_table );
|
if ( type == NULL ) {
|
||||||
!rtems_chain_is_tail( rtems_filesystem_table, node );
|
rtems_set_errno_and_return_minus_one( EINVAL );
|
||||||
node = rtems_chain_next( node ) ) {
|
}
|
||||||
rtems_filesystem_table_node_t *fs;
|
|
||||||
fs = (rtems_filesystem_table_node_t*) node;
|
rtems_libio_lock();
|
||||||
if ( strcmp( fs->entry.type, type ) == 0 ) {
|
for (
|
||||||
rtems_chain_extract( node );
|
node = rtems_chain_first( &filesystem_chain );
|
||||||
free( (void*) fs->entry.type );
|
!rtems_chain_is_tail( &filesystem_chain, node );
|
||||||
free( fs );
|
node = rtems_chain_next( node )
|
||||||
return 0;
|
) {
|
||||||
}
|
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 );
|
rtems_set_errno_and_return_minus_one( ENOENT );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,8 @@
|
|||||||
* COPYRIGHT (c) 1989-1999.
|
* COPYRIGHT (c) 1989-1999.
|
||||||
* On-Line Applications Research Corporation (OAR).
|
* On-Line Applications Research Corporation (OAR).
|
||||||
*
|
*
|
||||||
|
* Copyright (c) 2010 embedded brains GmbH.
|
||||||
|
*
|
||||||
* The license and distribution terms for this file may be
|
* The license and distribution terms for this file may be
|
||||||
* found in the file LICENSE in this distribution or at
|
* found in the file LICENSE in this distribution or at
|
||||||
* http://www.rtems.com/license/LICENSE.
|
* http://www.rtems.com/license/LICENSE.
|
||||||
@@ -24,6 +26,7 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <rtems/chain.h>
|
#include <rtems/chain.h>
|
||||||
|
#include <rtems/seterr.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@@ -33,21 +36,10 @@
|
|||||||
|
|
||||||
#include <rtems/libio_.h>
|
#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.
|
* Mount table list.
|
||||||
*/
|
*/
|
||||||
rtems_chain_control rtems_filesystem_mount_table_control;
|
RTEMS_CHAIN_DEFINE_EMPTY(rtems_filesystem_mount_table_control);
|
||||||
bool rtems_filesystem_mount_table_control_init;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Default pathconfs.
|
* Default pathconfs.
|
||||||
@@ -79,27 +71,64 @@ const rtems_filesystem_limits_and_options_t rtems_filesystem_default_pathconf =
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static bool Is_node_fs_root(
|
static bool Is_node_fs_root(
|
||||||
rtems_filesystem_location_info_t *loc
|
rtems_filesystem_location_info_t *loc
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
rtems_chain_node *the_node;
|
rtems_chain_node *node = NULL;
|
||||||
rtems_filesystem_mount_table_entry_t *the_mount_entry;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For each mount table entry
|
* For each mount table entry
|
||||||
*/
|
*/
|
||||||
if ( rtems_filesystem_mount_table_control_init ) {
|
for ( node = rtems_chain_first( &rtems_filesystem_mount_table_control );
|
||||||
for ( the_node = rtems_chain_first( &rtems_filesystem_mount_table_control );
|
!rtems_chain_is_tail( &rtems_filesystem_mount_table_control, node );
|
||||||
!rtems_chain_is_tail( &rtems_filesystem_mount_table_control, the_node );
|
node = rtems_chain_next( node ) ) {
|
||||||
the_node = rtems_chain_next( the_node ) ) {
|
rtems_filesystem_mount_table_entry_t *mount_table_entry =
|
||||||
the_mount_entry = (rtems_filesystem_mount_table_entry_t *) the_node;
|
(rtems_filesystem_mount_table_entry_t *) node;
|
||||||
if ( the_mount_entry->mt_fs_root.node_access == loc->node_access )
|
|
||||||
return true;
|
if ( mount_table_entry->mt_fs_root.node_access == loc->node_access )
|
||||||
}
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
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
|
* mount
|
||||||
*
|
*
|
||||||
@@ -121,114 +150,54 @@ int mount(
|
|||||||
const char *filesystemtype,
|
const char *filesystemtype,
|
||||||
rtems_filesystem_options_t options,
|
rtems_filesystem_options_t options,
|
||||||
const void *data
|
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_location_info_t loc;
|
||||||
rtems_filesystem_mount_table_entry_t *mt_entry = NULL;
|
rtems_filesystem_mount_table_entry_t *mt_entry = NULL;
|
||||||
rtems_filesystem_location_info_t *loc_to_free = NULL;
|
rtems_filesystem_location_info_t *loc_to_free = NULL;
|
||||||
size_t size;
|
bool has_target = target != NULL;
|
||||||
|
size_t target_length = 0;
|
||||||
/*
|
|
||||||
* 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 );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Are the file system options valid?
|
* Are the file system options valid?
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if ( options != RTEMS_FILESYSTEM_READ_ONLY &&
|
if ( options != RTEMS_FILESYSTEM_READ_ONLY &&
|
||||||
options != RTEMS_FILESYSTEM_READ_WRITE ) {
|
options != RTEMS_FILESYSTEM_READ_WRITE )
|
||||||
errno = EINVAL;
|
rtems_set_errno_and_return_minus_one( EINVAL );
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check the type.
|
* Get mount handler
|
||||||
*/
|
*/
|
||||||
if (!filesystemtype) {
|
mount_h = rtems_filesystem_get_mount_handler( filesystemtype );
|
||||||
errno = EINVAL;
|
if ( !mount_h )
|
||||||
return -1;
|
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.
|
|
||||||
*/
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!entry)
|
|
||||||
{
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocate a mount table entry
|
* 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->mt_fs_root.mt_entry = mt_entry;
|
||||||
mt_entry->type = entry->type;
|
|
||||||
mt_entry->options = options;
|
mt_entry->options = options;
|
||||||
mt_entry->pathconf_limits_and_options = rtems_filesystem_default_pathconf;
|
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
|
* The mount_point should be a directory with read/write/execute
|
||||||
* permissions in the existing tree.
|
* permissions in the existing tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if ( target ) {
|
if ( has_target ) {
|
||||||
|
|
||||||
if ( rtems_filesystem_evaluate_path(
|
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;
|
goto cleanup_and_bail;
|
||||||
|
|
||||||
loc_to_free = &loc;
|
loc_to_free = &loc;
|
||||||
@@ -272,7 +241,7 @@ int mount(
|
|||||||
mt_entry->mt_point_node.handlers = loc.handlers;
|
mt_entry->mt_point_node.handlers = loc.handlers;
|
||||||
mt_entry->mt_point_node.ops = loc.ops;
|
mt_entry->mt_point_node.ops = loc.ops;
|
||||||
mt_entry->mt_point_node.mt_entry = loc.mt_entry;
|
mt_entry->mt_point_node.mt_entry = loc.mt_entry;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This link to the parent is only done when we are dealing with system
|
* This link to the parent is only done when we are dealing with system
|
||||||
* below the base file system
|
* below the base file system
|
||||||
@@ -286,10 +255,7 @@ int mount(
|
|||||||
if ( loc.ops->mount_h( mt_entry ) ) {
|
if ( loc.ops->mount_h( mt_entry ) ) {
|
||||||
goto cleanup_and_bail;
|
goto cleanup_and_bail;
|
||||||
}
|
}
|
||||||
|
|
||||||
mt_entry->target = strdup( target );
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Do we already have a base file system ?
|
* Do we already have a base file system ?
|
||||||
*/
|
*/
|
||||||
@@ -297,26 +263,15 @@ int mount(
|
|||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
goto cleanup_and_bail;
|
goto cleanup_and_bail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is a mount of the base file system --> The
|
* 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.
|
* 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
|
* Try to undo the mount operation
|
||||||
*/
|
*/
|
||||||
@@ -332,14 +287,13 @@ int mount(
|
|||||||
rtems_chain_append( &rtems_filesystem_mount_table_control,
|
rtems_chain_append( &rtems_filesystem_mount_table_control,
|
||||||
&mt_entry->Node );
|
&mt_entry->Node );
|
||||||
|
|
||||||
if ( !target )
|
if ( !has_target )
|
||||||
rtems_filesystem_root = mt_entry->mt_fs_root;
|
rtems_filesystem_root = mt_entry->mt_fs_root;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
cleanup_and_bail:
|
cleanup_and_bail:
|
||||||
|
|
||||||
free( (void*) mt_entry->target );
|
|
||||||
free( mt_entry );
|
free( mt_entry );
|
||||||
|
|
||||||
if ( loc_to_free )
|
if ( loc_to_free )
|
||||||
@@ -348,3 +302,33 @@ cleanup_and_bail:
|
|||||||
return -1;
|
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 );
|
||||||
|
}
|
||||||
|
|||||||
48
cpukit/libcsupport/src/sup_fs_get_start_loc.c
Normal file
48
cpukit/libcsupport/src/sup_fs_get_start_loc.c
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
47
cpukit/libcsupport/src/sup_fs_get_sym_start_loc.c
Normal file
47
cpukit/libcsupport/src/sup_fs_get_sym_start_loc.c
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
30
cpukit/libcsupport/src/sup_fs_is_separator.c
Normal file
30
cpukit/libcsupport/src/sup_fs_is_separator.c
Normal file
@@ -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'));
|
||||||
|
}
|
||||||
@@ -27,6 +27,13 @@
|
|||||||
#include <rtems/libio.h>
|
#include <rtems/libio.h>
|
||||||
#include "internal.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 rtems_shell_main_mount(
|
||||||
int argc,
|
int argc,
|
||||||
char *argv[]
|
char *argv[]
|
||||||
@@ -55,13 +62,8 @@ int rtems_shell_main_mount(
|
|||||||
} else if (argv[arg][1] == 'r') {
|
} else if (argv[arg][1] == 'r') {
|
||||||
options = RTEMS_FILESYSTEM_READ_ONLY;
|
options = RTEMS_FILESYSTEM_READ_ONLY;
|
||||||
} else if (argv[arg][1] == 'L') {
|
} else if (argv[arg][1] == 'L') {
|
||||||
const rtems_filesystem_table_t* fs;
|
|
||||||
fs = rtems_filesystem_table_first();
|
|
||||||
printf ("File systems: ");
|
printf ("File systems: ");
|
||||||
while (fs) {
|
rtems_filesystem_iterate(print_filesystem, NULL);
|
||||||
printf ("%s ", fs->type);
|
|
||||||
fs = rtems_filesystem_table_next(fs);
|
|
||||||
}
|
|
||||||
printf ("\n");
|
printf ("\n");
|
||||||
return 0;
|
return 0;
|
||||||
} else if (argv[arg][1] == 'o') {
|
} else if (argv[arg][1] == 'o') {
|
||||||
|
|||||||
@@ -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
|
* The default file system table. Must be terminated with the NULL entry if
|
||||||
* you provide your own.
|
* 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
|
#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) && \
|
#if defined(CONFIGURE_FILESYSTEM_miniIMFS) && \
|
||||||
defined(CONFIGURE_FILESYSTEM_ENTRY_miniIMFS)
|
defined(CONFIGURE_FILESYSTEM_ENTRY_miniIMFS)
|
||||||
CONFIGURE_FILESYSTEM_ENTRY_miniIMFS,
|
CONFIGURE_FILESYSTEM_ENTRY_miniIMFS,
|
||||||
|
|||||||
Reference in New Issue
Block a user