change log for rtems (2011-05-17)

rtems-vc at rtems.org rtems-vc at rtems.org
Tue May 17 05:10:44 UTC 2011


 *ccj* (on branch rtems-4-10-branch):
2011-05-17      Chris Johns <chrisj at rtems.org>

        PR 1774/filesystem
        * libfs/src/imfs/imfs_eval.c: The previous change broke some of
        the tests. This has been fixed.

M 1.2346.2.88  cpukit/ChangeLog
M 1.26.2.3  cpukit/libfs/src/imfs/imfs_eval.c

diff -u rtems/cpukit/ChangeLog:1.2346.2.87 rtems/cpukit/ChangeLog:1.2346.2.88
--- rtems/cpukit/ChangeLog:1.2346.2.87	Wed May 11 03:29:16 2011
+++ rtems/cpukit/ChangeLog	Mon May 16 23:45:49 2011
@@ -1,3 +1,9 @@
+2011-05-17	Chris Johns <chrisj at rtems.org>
+
+	PR 1774/filesystem
+	* libfs/src/imfs/imfs_eval.c: The previous change broke some of
+	the tests. This has been fixed.
+	
 2011-05-11	Sebastian Huber <sebastian.huber at embedded-brains.de>
 
 	PR 1790/cpukit

diff -u rtems/cpukit/libfs/src/imfs/imfs_eval.c:1.26.2.2 rtems/cpukit/libfs/src/imfs/imfs_eval.c:1.26.2.3
--- rtems/cpukit/libfs/src/imfs/imfs_eval.c:1.26.2.2	Fri Apr 15 22:47:32 2011
+++ rtems/cpukit/libfs/src/imfs/imfs_eval.c	Mon May 16 23:45:52 2011
@@ -270,6 +270,22 @@
   return result;
 }
 
+/*
+ * IMFS_skip_separator
+ *
+ * Skip the separator in the path.
+ */
+static void IMFS_skip_separator (
+   const char *path,       /* IN     */
+   size_t     *len,        /* IN/OUT */
+   int        *index       /* IN/OUT */
+)
+{
+  while ( IMFS_is_separator( path[*index] ) && path[*index] && *len ) {
+    ++(*index);
+    --(*len);
+  }
+}
 
 /*
  *  IMFS_evaluate_for_make
@@ -281,20 +297,19 @@
  */
 
 int IMFS_evaluate_for_make(
-   const char                         *path,       /* IN     */
-   rtems_filesystem_location_info_t   *pathloc,    /* IN/OUT */
-   const char                        **name        /* OUT    */
-)
+  const char                         *path,       /* IN     */
+  rtems_filesystem_location_info_t   *pathloc,    /* IN/OUT */
+  const char                        **name        /* OUT    */
+                           )
 {
-  int                                 i = 0;
-  int                                 len;
-  IMFS_token_types                    type;
-  char                                token[ IMFS_NAME_MAX + 1 ];
-  rtems_filesystem_location_info_t    newloc;
-  IMFS_jnode_t                       *node;
-  bool                                done = false;
-  int                                 pathlen;
-  int                                 result;
+  int               i = 0;
+  int               len;
+  IMFS_token_types  type;
+  char              token[ IMFS_NAME_MAX + 1 ];
+  IMFS_jnode_t     *node;
+  bool              done = false;
+  size_t            pathlen;
+  int               result;
 
   /*
    * This was filled in by the caller and is valid in the
@@ -346,8 +361,7 @@
         * Am I at the root of this mounted filesystem?
         */
 
-        if (pathloc->node_access ==
-            pathloc->mt_entry->mt_fs_root.node_access){
+        if (pathloc->node_access == pathloc->mt_entry->mt_fs_root.node_access){
 
           /*
            *  Am I at the root of all filesystems?
@@ -355,10 +369,10 @@
 
           if ( pathloc->node_access == rtems_filesystem_root.node_access ) {
             break;
+
           } else {
-            newloc = pathloc->mt_entry->mt_point_node;
-            *pathloc = newloc;
-            return (*pathloc->ops->evalformake_h)( &path[i], pathloc, name );
+            *pathloc = pathloc->mt_entry->mt_point_node;
+            return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name );
           }
         } else {
           if ( !node->Parent )
@@ -401,7 +415,7 @@
           rtems_set_errno_and_return_minus_one( ENOTDIR );
 
         /*
-         * Otherwise find the token name in the present location.
+         * Find the token name in the present location.
          */
 
         node = IMFS_find_match_in_dir( node, token );
@@ -414,15 +428,17 @@
         if ( ! node )
           done = true;
         else {
-          /*
-           * If we are at a node that is a mount point. Set loc to the
-           * new fs root node and let them finish evaluating the path.
-           */
-
-          if ( node->info.directory.mt_fs != NULL ) {
-            newloc  = node->info.directory.mt_fs->mt_fs_root;
-            *pathloc = newloc;
-            return (*pathloc->ops->evalformake_h)( &path[i], pathloc, name );
+        if (( node->type == IMFS_DIRECTORY ) && ( node->info.directory.mt_fs != NULL )) {
+            IMFS_skip_separator( path, &pathlen, &i);
+            if ((path[i] != '.') || (path[i + 1] != '.')) {
+              *pathloc = node->info.directory.mt_fs->mt_fs_root;
+              return (*pathloc->ops->evalformake_h)( &path[i],
+                                                     pathloc,
+                                                     name );
+            }
+            i += 2;
+            pathlen -= 2;
+            node = node->Parent;
           }
           
           pathloc->node_access = node;
@@ -493,13 +509,12 @@
   rtems_filesystem_location_info_t  *pathloc       /* IN/OUT */
                    )
 {
-  int                                 i = 0;
-  int                                 len;
-  IMFS_token_types                    type = IMFS_CURRENT_DIR;
-  char                                token[ IMFS_NAME_MAX + 1 ];
-  rtems_filesystem_location_info_t    newloc;
-  IMFS_jnode_t                       *node;
-  int                                 result;
+  int               i = 0;
+  int               len;
+  IMFS_token_types  type = IMFS_CURRENT_DIR;
+  char              token[ IMFS_NAME_MAX + 1 ];
+  IMFS_jnode_t     *node;
+  int               result;
 
   if ( !rtems_libio_is_valid_perms( flags ) ) {
     assert( 0 );
@@ -559,10 +574,9 @@
           if ( pathloc->node_access == rtems_filesystem_root.node_access ) {
             break;       /* Throw out the .. in this case */
           } else {
-            newloc = pathloc->mt_entry->mt_point_node;
-            *pathloc = newloc;
-            return (*pathloc->ops->evalpath_h)(&(pathname[i]),
-                                               pathnamelen,
+            *pathloc = pathloc->mt_entry->mt_point_node;
+            return (*pathloc->ops->evalpath_h)(&(pathname[i-len]),
+                                               pathnamelen+len,
                                                flags,pathloc);
           }
         } else {
@@ -605,7 +619,7 @@
           rtems_set_errno_and_return_minus_one( ENOTDIR );
 
         /*
-         *  Otherwise find the token name in the present location.
+         *  Find the token name in the current node.
          */
 
         node = IMFS_find_match_in_dir( node, token );
@@ -613,25 +627,38 @@
         if ( !node )
           rtems_set_errno_and_return_minus_one( ENOENT );
 
+        /*
+         *  If we are at a node that is a mount point so current directory
+         *  actually exists on the mounted file system and not in the node that
+         *  contains the mount point node. For example a stat of the mount
+         *  point should return the details of the root of the mounted file
+         *  system not the mount point node of parent file system.
+         *
+         *  If the node we have just moved to is a mount point do not loop and
+         *  get the token because the token may be suitable for the mounted
+         *  file system and not the IMFS. For example the IMFS length is
+         *  limited. If the token is a parent directory move back up otherwise
+         *  set loc to the new fs root node and let them finish evaluating the
+         *  path.
+         */
+        if (( node->type == IMFS_DIRECTORY ) && ( node->info.directory.mt_fs != NULL )) {
+          IMFS_skip_separator( pathname, &pathnamelen, &i);
+          if ((pathname[i] != '.') || (pathname[i + 1] != '.')) {
+            *pathloc = node->info.directory.mt_fs->mt_fs_root;
+            return (*pathloc->ops->evalpath_h)( &pathname[i],
+                                                pathnamelen,
+                                                flags, pathloc );
+          }
+          i += 2;
+          pathnamelen -= 2;
+          node = node->Parent;
+        }
 
         /*
          *  Set the node access to the point we have found.
          */
 
         pathloc->node_access = node;
-        
-        /*
-         *  If we are at a node that is a mount point. Set loc to the
-         *  new fs root node and let them finish evaluating the path.
-         */
-
-        if ( node->info.directory.mt_fs != NULL ) {
-          newloc   = node->info.directory.mt_fs->mt_fs_root;
-          *pathloc = newloc;
-          return (*pathloc->ops->evalpath_h)( &pathname[i],
-                                              pathnamelen,
-                                              flags, pathloc );
-        }
         break;
 
       case IMFS_NO_MORE_PATH:
@@ -656,8 +683,7 @@
 
   if ( node->type == IMFS_DIRECTORY ) {
     if ( node->info.directory.mt_fs != NULL ) {
-      newloc   = node->info.directory.mt_fs->mt_fs_root;
-      *pathloc = newloc;
+      *pathloc = node->info.directory.mt_fs->mt_fs_root;
       return (*pathloc->ops->evalpath_h)( &pathname[i-len],
                                           pathnamelen+len,
                                           flags, pathloc );



--

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/20110517/4e319897/attachment.html>


More information about the vc mailing list