--- Samuel,
I'm sending a new version of patch, which includes the required changes in both libnetfs and libdiskfs. On Sun, Jan 03, 2016 at 01:42:23AM +0100, Samuel Thibault wrote: > Flavio Cruz, on Sun 03 Jan 2016 01:35:55 +0100, wrote: > > On Sun, Jan 03, 2016 at 01:27:17AM +0100, Samuel Thibault wrote: > > > So you are making libc keep any heading slash, just dropping > > > double-heading-slash, right? > > > > Yes. > > I'm wondering why keeping this heading slash, it seems unnecessary, and > yet another thing that translators have to take care of. Perhaps it > would be not difficult to make sure to keep only the trailing slash, > without keeping the heading slash? (and just a slash when no path is to > be looked up). Done. See patch below. > > > > Does that work with current translators? > > > > It appears to work fine so far, but it might require more stress testing > > to be sure (like compiling a big project) > > I don't think compiling stuff would be problematic, since it'd just open > files. It's more corner cases which may pose problems (opening stuff in > httpfs and whatnot). I have tried it with hostmux/ftpfs and it seems to work fine so far. I'm also running the patch on my Debian Hurd VM and no problems yet. PS: there's a lot of code repetition all over libnetfs/libdiskfs. Maybe some of the dir_lookup code should move to libfshelp. Also, there's different formatting styles (spaces/tabs) in the same file. What about automatically running gnu indent or clang-format when a file is modified? This would help a lot when making modifications. > > Samuel diff --git a/hurd/lookup-retry.c b/hurd/lookup-retry.c index f633e57..a64aeea 100644 --- a/hurd/lookup-retry.c +++ b/hurd/lookup-retry.c @@ -62,8 +62,14 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port) error_t lookup_op (file_t startdir) { - while (file_name[0] == '/') - file_name++; + if (file_name[0] == '/' && file_name[1] != '\0') + { + while (file_name[1] == '/') + file_name++; /* Remove double leading slash. */ + /* Remove leading slash when we have more than the slash. */ + if (file_name[1] != '\0') + file_name++; + } return lookup_error ((*lookup) (startdir, file_name, flags, mode, &doretry, retryname, result)); -- --- Hurd patch starts here: diff --git a/libdiskfs/dir-lookup.c b/libdiskfs/dir-lookup.c index 75df9b8..25e84ab 100644 --- a/libdiskfs/dir-lookup.c +++ b/libdiskfs/dir-lookup.c @@ -161,7 +161,9 @@ diskfs_S_dir_lookup (struct protid *dircred, *retry = FS_RETRY_REAUTH; *returned_port = dircred->po->shadow_root_parent; *returned_port_poly = MACH_MSG_TYPE_COPY_SEND; - if (! lastcomp) + if (lastcomp && mustbedir) /* Trailing slash. */ + strcpy (retryname, "/"); + else if (!lastcomp) strcpy (retryname, nextname); err = 0; goto out; @@ -175,7 +177,9 @@ diskfs_S_dir_lookup (struct protid *dircred, *retry = FS_RETRY_REAUTH; *returned_port = dircred->po->root_parent; *returned_port_poly = MACH_MSG_TYPE_COPY_SEND; - if (!lastcomp) + if (lastcomp && mustbedir) /* Trailing slash. */ + strcpy (retryname, "/"); + else if (!lastcomp) strcpy (retryname, nextname); err = 0; goto out; @@ -213,7 +217,7 @@ diskfs_S_dir_lookup (struct protid *dircred, /* If this is translated, start the translator (if necessary) and return. */ - if ((((flags & O_NOTRANS) == 0) || !lastcomp) + if ((((flags & O_NOTRANS) == 0) || !lastcomp || mustbedir) && ((np->dn_stat.st_mode & S_IPTRANS) || S_ISFIFO (np->dn_stat.st_mode) || S_ISCHR (np->dn_stat.st_mode) @@ -304,11 +308,16 @@ diskfs_S_dir_lookup (struct protid *dircred, if (err != ENOENT) { *returned_port_poly = MACH_MSG_TYPE_MOVE_SEND; - if (!lastcomp && !err) - { + if (!err) + { char *end = strchr (retryname, '\0'); - *end++ = '/'; - strcpy (end, nextname); + if (mustbedir) + *end++ = '/'; /* Trailing slash. */ + else if (!lastcomp) { + if (end != retryname) + *end++ = '/'; + strcpy (end, nextname); + } } if (register_translator) diff --git a/libnetfs/dir-lookup.c b/libnetfs/dir-lookup.c index 8b8cd6e..0dcd3c3 100644 --- a/libnetfs/dir-lookup.c +++ b/libnetfs/dir-lookup.c @@ -128,7 +128,9 @@ netfs_S_dir_lookup (struct protid *diruser, *do_retry = FS_RETRY_REAUTH; *retry_port = diruser->po->shadow_root_parent; *retry_port_type = MACH_MSG_TYPE_COPY_SEND; - if (! lastcomp) + if (lastcomp && mustbedir) /* Trailing slash. */ + strcpy (retry_name, "/"); + else if (!lastcomp) strcpy (retry_name, nextname); error = 0; pthread_mutex_unlock (&dnp->lock); @@ -142,7 +144,9 @@ netfs_S_dir_lookup (struct protid *diruser, *do_retry = FS_RETRY_REAUTH; *retry_port = diruser->po->root_parent; *retry_port_type = MACH_MSG_TYPE_COPY_SEND; - if (!lastcomp) + if (lastcomp && mustbedir) /* Trailing slash. */ + strcpy (retry_name, "/"); + else if (!lastcomp) strcpy (retry_name, nextname); error = 0; pthread_mutex_unlock (&dnp->lock); @@ -194,7 +198,7 @@ netfs_S_dir_lookup (struct protid *diruser, if (error) goto out; - if ((((flags & O_NOTRANS) == 0) || !lastcomp) + if ((((flags & O_NOTRANS) == 0) || !lastcomp || mustbedir) && ((np->nn_translated & S_IPTRANS) || S_ISFIFO (np->nn_translated) || S_ISCHR (np->nn_translated) @@ -288,10 +292,16 @@ netfs_S_dir_lookup (struct protid *diruser, if (error != ENOENT) { *retry_port_type = MACH_MSG_TYPE_MOVE_SEND; - if (!lastcomp && !error) + if (!error) { - strcat (retry_name, "/"); - strcat (retry_name, nextname); + char *end = strchr (retry_name, '\0'); + if (mustbedir) + *end++ = '/'; /* Trailing slash. */ + else if (!lastcomp) { + if (end != retry_name) + *end++ = '/'; + strcpy (end, nextname); + } } if (register_translator)