<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>change log for rtems (2011-05-17)</title>
</head>
<body text='#000000' bgcolor='#ffffff'>
<a name='cs1'></a>
<table border='0' cellspacing='0' cellpadding='5' width='100%' bgcolor='#eeeeee'>
<tr><td colspan='3' bgcolor='#dddddd'>
<font color='#bb2222'><strong>ccj</strong></font>
<font color='#225522'><em>(on branch rtems-4-10-branch)</em></font>
</td></tr>
<tr><td colspan='3' bgcolor='#dddddd'><pre>2011-05-17 Chris Johns <chrisj@rtems.org>
PR 1774/filesystem
* libfs/src/imfs/imfs_eval.c: The previous change broke some of
the tests. This has been fixed.
</pre></td></tr>
<tr><td width='1%'><a href="http://www.rtems.com/cgi-bin/viewcvs.cgi//rtems/cpukit/ChangeLog.diff?r1=text&tr1=1.2346.2.87&r2=text&tr2=1.2346.2.88&diff_format=h">M</a></td><td width='1%'>1.2346.2.88</td><td width='100%'>cpukit/ChangeLog</td></tr>
<tr><td width='1%'><a href="http://www.rtems.com/cgi-bin/viewcvs.cgi//rtems/cpukit/libfs/src/imfs/imfs_eval.c.diff?r1=text&tr1=1.26.2.2&r2=text&tr2=1.26.2.3&diff_format=h">M</a></td><td width='1%'>1.26.2.3</td><td width='100%'>cpukit/libfs/src/imfs/imfs_eval.c</td></tr>
</table>
<pre>
<font color='#006600'>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
</font><font color='#997700'>@@ -1,3 +1,9 @@
</font><font color='#000088'>+2011-05-17 Chris Johns <chrisj@rtems.org>
+
+ PR 1774/filesystem
+ * libfs/src/imfs/imfs_eval.c: The previous change broke some of
+ the tests. This has been fixed.
+<span style="background-color: #FF0000"> </span>
</font> 2011-05-11 Sebastian Huber <sebastian.huber@embedded-brains.de>
PR 1790/cpukit
<font color='#006600'>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
</font><font color='#997700'>@@ -270,6 +270,22 @@
</font> return result;
}
<font color='#000088'>+/*
+ * 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);
+ }
+}
</font>
/*
* IMFS_evaluate_for_make
<font color='#997700'>@@ -281,20 +297,19 @@
</font> */
int IMFS_evaluate_for_make(
<font color='#880000'>- const char *path, /* IN */
- rtems_filesystem_location_info_t *pathloc, /* IN/OUT */
- const char **name /* OUT */
-)
</font><font color='#000088'>+ const char *path, /* IN */
+ rtems_filesystem_location_info_t *pathloc, /* IN/OUT */
+ const char **name /* OUT */
+ )
</font> {
<font color='#880000'>- 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;
</font><font color='#000088'>+ 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;
</font>
/*
* This was filled in by the caller and is valid in the
<font color='#997700'>@@ -346,8 +361,7 @@
</font> * Am I at the root of this mounted filesystem?
*/
<font color='#880000'>- if (pathloc->node_access ==
- pathloc->mt_entry->mt_fs_root.node_access){
</font><font color='#000088'>+ if (pathloc->node_access == pathloc->mt_entry->mt_fs_root.node_access){
</font>
/*
* Am I at the root of all filesystems?
<font color='#997700'>@@ -355,10 +369,10 @@
</font>
if ( pathloc->node_access == rtems_filesystem_root.node_access ) {
break;
<font color='#000088'>+
</font> } else {
<font color='#880000'>- newloc = pathloc->mt_entry->mt_point_node;
- *pathloc = newloc;
- return (*pathloc->ops->evalformake_h)( &path[i], pathloc, name );
</font><font color='#000088'>+ *pathloc = pathloc->mt_entry->mt_point_node;
+ return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name );
</font> }
} else {
if ( !node->Parent )
<font color='#997700'>@@ -401,7 +415,7 @@
</font> rtems_set_errno_and_return_minus_one( ENOTDIR );
/*
<font color='#880000'>- * Otherwise find the token name in the present location.
</font><font color='#000088'>+ * Find the token name in the present location.
</font> */
node = IMFS_find_match_in_dir( node, token );
<font color='#997700'>@@ -414,15 +428,17 @@
</font> if ( ! node )
done = true;
else {
<font color='#880000'>- /*
- * 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 );
</font><font color='#000088'>+ 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;
</font> }
pathloc->node_access = node;
<font color='#997700'>@@ -493,13 +509,12 @@
</font> rtems_filesystem_location_info_t *pathloc /* IN/OUT */
)
{
<font color='#880000'>- 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;
</font><font color='#000088'>+ int i = 0;
+ int len;
+ IMFS_token_types type = IMFS_CURRENT_DIR;
+ char token[ IMFS_NAME_MAX + 1 ];
+ IMFS_jnode_t *node;
+ int result;
</font>
if ( !rtems_libio_is_valid_perms( flags ) ) {
assert( 0 );
<font color='#997700'>@@ -559,10 +574,9 @@
</font> if ( pathloc->node_access == rtems_filesystem_root.node_access ) {
break; /* Throw out the .. in this case */
} else {
<font color='#880000'>- newloc = pathloc->mt_entry->mt_point_node;
- *pathloc = newloc;
- return (*pathloc->ops->evalpath_h)(&(pathname[i]),
- pathnamelen,
</font><font color='#000088'>+ *pathloc = pathloc->mt_entry->mt_point_node;
+ return (*pathloc->ops->evalpath_h)(&(pathname[i-len]),
+ pathnamelen+len,
</font> flags,pathloc);
}
} else {
<font color='#997700'>@@ -605,7 +619,7 @@
</font> rtems_set_errno_and_return_minus_one( ENOTDIR );
/*
<font color='#880000'>- * Otherwise find the token name in the present location.
</font><font color='#000088'>+ * Find the token name in the current node.
</font> */
node = IMFS_find_match_in_dir( node, token );
<font color='#997700'>@@ -613,25 +627,38 @@
</font> if ( !node )
rtems_set_errno_and_return_minus_one( ENOENT );
<font color='#000088'>+ /*
+ * 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;
+ }
</font>
/*
* Set the node access to the point we have found.
*/
pathloc->node_access = node;
<font color='#880000'>-<span style="background-color: #FF0000"> </span>
- /*
- * 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 );
- }
</font> break;
case IMFS_NO_MORE_PATH:
<font color='#997700'>@@ -656,8 +683,7 @@
</font>
if ( node->type == IMFS_DIRECTORY ) {
if ( node->info.directory.mt_fs != NULL ) {
<font color='#880000'>- newloc = node->info.directory.mt_fs->mt_fs_root;
- *pathloc = newloc;
</font><font color='#000088'>+ *pathloc = node->info.directory.mt_fs->mt_fs_root;
</font> return (*pathloc->ops->evalpath_h)( &pathname[i-len],
pathnamelen+len,
flags, pathloc );
</pre>
<p> </p>
<p>--<br />
<small>Generated by <a href="http://www.codewiz.org/projects/index.html#loginfo">Deluxe Loginfo</a> 2.122 by Bernardo Innocenti <bernie@develer.com></small></p>
</body>
</html>