change log for rtems (2010-07-01)

rtems-vc at rtems.org rtems-vc at rtems.org
Thu Jul 1 14:18:32 UTC 2010


 *sh* (on branch rtems-4-10-branch):
2010-06-07	Sebastian Huber <sebastian.huber at 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 at 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/

M 1.2346.2.50  cpukit/ChangeLog
M 1.118.2.1  cpukit/libcsupport/Makefile.am
M 1.65.2.1  cpukit/libcsupport/include/rtems/libio.h
M 1.34.2.1  cpukit/libcsupport/include/rtems/libio_.h
M 1.2.2.1  cpukit/libcsupport/src/mount-mgr.c
M 1.33.2.1  cpukit/libcsupport/src/mount.c
M 1.1.2.2  cpukit/libcsupport/src/sup_fs_get_start_loc.c
M 1.1.2.2  cpukit/libcsupport/src/sup_fs_get_sym_start_loc.c
M 1.1.2.2  cpukit/libcsupport/src/sup_fs_is_separator.c
M 1.8.2.1  cpukit/libmisc/shell/main_mount.c
M 1.135.2.3  cpukit/sapi/include/confdefs.h

diff -u rtems/cpukit/ChangeLog:1.2346.2.49 rtems/cpukit/ChangeLog:1.2346.2.50
--- rtems/cpukit/ChangeLog:1.2346.2.49	Thu Jun 24 14:57:59 2010
+++ rtems/cpukit/ChangeLog	Thu Jul  1 09:10:47 2010
@@ -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 at 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 at 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 at rtems.org>
 
 	* sapi/include/confdefs.h: PR 1543. Make default file system when

diff -u rtems/cpukit/libcsupport/Makefile.am:1.118 rtems/cpukit/libcsupport/Makefile.am:1.118.2.1
--- rtems/cpukit/libcsupport/Makefile.am:1.118	Mon May 31 08:56:36 2010
+++ rtems/cpukit/libcsupport/Makefile.am	Thu Jul  1 09:10:50 2010
@@ -110,6 +110,8 @@
 
 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 -u rtems/cpukit/libcsupport/include/rtems/libio.h:1.65 rtems/cpukit/libcsupport/include/rtems/libio.h:1.65.2.1
--- rtems/cpukit/libcsupport/include/rtems/libio.h:1.65	Tue Jun  1 19:43:13 2010
+++ rtems/cpukit/libcsupport/include/rtems/libio.h	Thu Jul  1 09:10:51 2010
@@ -289,32 +289,51 @@
     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.
+ */
+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.
  */
-const rtems_filesystem_table_t* 
-rtems_filesystem_table_next( const rtems_filesystem_table_t *entry );
+rtems_filesystem_fsmount_me_t
+rtems_filesystem_get_mount_handler(
+  const char *type
+);
 
 /*
  * Get the first entry in the mount table.

diff -u rtems/cpukit/libcsupport/include/rtems/libio_.h:1.34 rtems/cpukit/libcsupport/include/rtems/libio_.h:1.34.2.1
--- rtems/cpukit/libcsupport/include/rtems/libio_.h:1.34	Mon May 31 08:56:36 2010
+++ rtems/cpukit/libcsupport/include/rtems/libio_.h	Thu Jul  1 09:10:51 2010
@@ -1,4 +1,4 @@
-/**
+/*
  * @file rtems/libio_.h
  */
 
@@ -40,6 +40,11 @@
 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 @@
 
 #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 @@
  *  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 @@
         (*(_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 @@
 
 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 -u rtems/cpukit/libcsupport/src/mount-mgr.c:1.2 rtems/cpukit/libcsupport/src/mount-mgr.c:1.2.2.1
--- rtems/cpukit/libcsupport/src/mount-mgr.c:1.2	Tue Jun  1 05:42:52 2010
+++ rtems/cpukit/libcsupport/src/mount-mgr.c	Thu Jul  1 09:10:51 2010
@@ -6,6 +6,8 @@
  *
  *  COPYRIGHT (c) Chris Johns <chrisj at 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[];
+typedef struct {
+  rtems_chain_node node;
+  rtems_filesystem_table_t entry;
+} filesystem_node;
 
-/*
- * Points to a list of filesystems added at runtime.
- */
-extern rtems_chain_control *rtems_filesystem_table;
-
-/*
- * 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;
+  while ( table_entry->type ) {
+    if ( !(*routine)( table_entry, routine_arg ) ) {
+      break;
+    }
+
+    ++table_entry;
+  }
 
-  fs = rtems_filesystem_table_first( );
-  
-  while ( fs->type && ( fs != entry ) )
-    ++fs;
-  
-  if ( fs->type ) {
-    ++fs;
-    if ( fs->type )
-      return fs;
-  }
-
-  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 -u rtems/cpukit/libcsupport/src/mount.c:1.33 rtems/cpukit/libcsupport/src/mount.c:1.33.2.1
--- rtems/cpukit/libcsupport/src/mount.c:1.33	Mon May 31 08:56:36 2010
+++ rtems/cpukit/libcsupport/src/mount.c	Thu Jul  1 09:10:52 2010
@@ -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 @@
  */
 
 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 @@
   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 @@
     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 @@
     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 @@
       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 @@
   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 @@
   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 -u /dev/null rtems/cpukit/libcsupport/src/sup_fs_get_start_loc.c:1.1.2.2
--- /dev/null	Thu Jul  1 09:18:31 2010
+++ rtems/cpukit/libcsupport/src/sup_fs_get_start_loc.c	Thu Jul  1 09:10:52 2010
@@ -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 -u /dev/null rtems/cpukit/libcsupport/src/sup_fs_get_sym_start_loc.c:1.1.2.2
--- /dev/null	Thu Jul  1 09:18:31 2010
+++ rtems/cpukit/libcsupport/src/sup_fs_get_sym_start_loc.c	Thu Jul  1 09:10:52 2010
@@ -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 -u /dev/null rtems/cpukit/libcsupport/src/sup_fs_is_separator.c:1.1.2.2
--- /dev/null	Thu Jul  1 09:18:32 2010
+++ rtems/cpukit/libcsupport/src/sup_fs_is_separator.c	Thu Jul  1 09:10:53 2010
@@ -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 -u rtems/cpukit/libmisc/shell/main_mount.c:1.8 rtems/cpukit/libmisc/shell/main_mount.c:1.8.2.1
--- rtems/cpukit/libmisc/shell/main_mount.c:1.8	Mon May 31 08:56:37 2010
+++ rtems/cpukit/libmisc/shell/main_mount.c	Thu Jul  1 09:10:53 2010
@@ -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 @@
       } 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 -u rtems/cpukit/sapi/include/confdefs.h:1.135.2.2 rtems/cpukit/sapi/include/confdefs.h:1.135.2.3
--- rtems/cpukit/sapi/include/confdefs.h:1.135.2.2	Mon Jun 21 16:13:30 2010
+++ rtems/cpukit/sapi/include/confdefs.h	Thu Jul  1 09:10:54 2010
@@ -384,12 +384,9 @@
   /**
    * 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,



--

Generated by Deluxe Loginfo [http://www.codewiz.org/projects/index.html#loginfo] 2.122 by Bernardo Innocenti <bernie at develer.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/vc/attachments/20100701/3ec654a9/attachment.html>


More information about the vc mailing list