Justus Winter, le Sun 31 Aug 2014 16:25:01 +0200, a écrit : > When first introduced as fsys_get_children, it made sense to return > the list of children using paths relative to the root of the > filesystem that was queried. Making the get_children method part of > the fsys protocol was a mistake that has since been corrected in > 9366d6b2. > > Instead of returning paths relative to the root of the translator, > return paths relative to the path of the receiving node. > > This fixes a problem with the mtab translator. Previously, the mtab > translator invoked on a target that was not the root directory of a > translator would compute invalid paths, e.g.: > > /hurd/mtab: /any/path/servers/socket/26 No such file or directory
Ack. > * hurd/fs.defs (file_get_children): Update comment. > * libfshelp/translator-list.c (fshelp_get_active_translators): Add > argument PREFIX. Filter entries not beginning with PREFIX if > non-NULL, and omit PREFIX from the returned paths. > * libfshelp/fshelp.h (fshelp_get_active_translators): Update comment > accordingly. Also clarify that both FILTER and PREFIX can be NULL. > * libdiskfs/file-get-children.c (diskfs_S_file_get_children): Update > comment, pass prefix to fshelp_get_active_translators. > * libnetfs/file-get-children.c (netfs_S_file_get_children): Likewise. > --- > hurd/fs.defs | 4 ++-- > libdiskfs/file-get-children.c | 9 +++++---- > libfshelp/fshelp.h | 9 ++++++--- > libfshelp/translator-list.c | 19 +++++++++++++++---- > libnetfs/file-get-children.c | 9 +++++---- > 5 files changed, 33 insertions(+), 17 deletions(-) > > diff --git a/hurd/fs.defs b/hurd/fs.defs > index 2452682..a4a48cc 100644 > --- a/hurd/fs.defs > +++ b/hurd/fs.defs > @@ -354,8 +354,8 @@ routine file_reparent ( > out new_file: mach_port_send_t); > > /* Return any active translators bound to nodes below FILE. CHILDREN > - is an argz vector containing file names relative to the root of the > - receiving translator. */ > + is an argz vector containing file names relative to the path of > + FILE. */ > routine file_get_children ( > file: file_t; > RPT > diff --git a/libdiskfs/file-get-children.c b/libdiskfs/file-get-children.c > index 4581e4e..98d5d60 100644 > --- a/libdiskfs/file-get-children.c > +++ b/libdiskfs/file-get-children.c > @@ -24,9 +24,9 @@ > > #include <argz.h> > > -/* Return any active translators bound to nodes of the receiving > - filesystem. CHILDREN is an argz vector containing file names > - relative to the root of the receiving translator. */ > +/* Return any active translators bound to nodes below CRED. CHILDREN > + is an argz vector containing file names relative to the path of > + CRED. */ > error_t > diskfs_S_file_get_children (struct protid *cred, > char **children, > @@ -79,7 +79,8 @@ diskfs_S_file_get_children (struct protid *cred, > char *c = NULL; > size_t c_len = 0; > > - err = fshelp_get_active_translators (&c, &c_len, check_access); > + err = fshelp_get_active_translators (&c, &c_len, check_access, > + cred->po->path); > if (err) > goto errout; > > diff --git a/libfshelp/fshelp.h b/libfshelp/fshelp.h > index 5d3a0ce..1c6f04a 100644 > --- a/libfshelp/fshelp.h > +++ b/libfshelp/fshelp.h > @@ -61,12 +61,15 @@ fshelp_remove_active_translator (mach_port_t active); > included in the list. */ > typedef error_t (*fshelp_filter) (const char *path); > > -/* Records the list of active translators into the argz vector > - specified by TRANSLATORS filtered by FILTER. */ > +/* Records the list of active translators below PREFIX into the argz > + vector specified by TRANSLATORS filtered by FILTER. If PREFIX is > + NULL, entries with any prefix are considered. If FILTER is NULL, > + no filter is applied. */ > error_t > fshelp_get_active_translators (char **translators, > size_t *translators_len, > - fshelp_filter filter); > + fshelp_filter filter, > + const char *prefix); > > > /* Passive translator linkage */ > diff --git a/libfshelp/translator-list.c b/libfshelp/translator-list.c > index 3ece711..db62575 100644 > --- a/libfshelp/translator-list.c > +++ b/libfshelp/translator-list.c > @@ -160,19 +160,30 @@ fshelp_remove_active_translator (mach_port_t active) > return err; > } > > -/* Records the list of active translators into the argz vector > - specified by TRANSLATORS filtered by FILTER. */ > +/* Records the list of active translators below PREFIX into the argz > + vector specified by TRANSLATORS filtered by FILTER. */ > error_t > fshelp_get_active_translators (char **translators, > size_t *translators_len, > - fshelp_filter filter) > + fshelp_filter filter, > + const char *prefix) > { > error_t err = 0; > pthread_mutex_lock (&translator_ihash_lock); > > + if (strlen (prefix) == 0) > + prefix = NULL; > + > HURD_IHASH_ITERATE (&translator_ihash, value) > { > struct translator *t = value; > + > + if (prefix != NULL > + && (strncmp (t->name, prefix, strlen (prefix)) != 0 > + || t->name[strlen (prefix)] != '/')) > + /* Skip this entry, as it is not below PREFIX. */ > + continue; > + > if (filter) > { > char *dir = strdup (t->name); > @@ -192,7 +203,7 @@ fshelp_get_active_translators (char **translators, > } > > err = argz_add (translators, translators_len, > - t->name); > + &t->name[prefix? strlen (prefix) + 1: 0]); > if (err) > break; > } > diff --git a/libnetfs/file-get-children.c b/libnetfs/file-get-children.c > index bd7e8fc..e8ceddf 100644 > --- a/libnetfs/file-get-children.c > +++ b/libnetfs/file-get-children.c > @@ -24,9 +24,9 @@ > > #include <argz.h> > > -/* Return any active translators bound to nodes of the receiving > - filesystem. CHILDREN is an argz vector containing file names > - relative to the root of the receiving translator. */ > +/* Return any active translators bound to nodes below CRED. CHILDREN > + is an argz vector containing file names relative to the path of > + CRED. */ > error_t > netfs_S_file_get_children (struct protid *cred, > char **children, > @@ -93,7 +93,8 @@ netfs_S_file_get_children (struct protid *cred, > char *c = NULL; > size_t c_len = 0; > > - err = fshelp_get_active_translators (&c, &c_len, check_access); > + err = fshelp_get_active_translators (&c, &c_len, check_access, > + cred->po->path); > if (err) > goto errout; > > -- > 2.1.0 > -- Samuel <b> il faut combien de chevaux pour tirer une doloréan à 88 morph ? ***b vient de remarque que 88 mph c'est 142 km/h <y> aaaaah <y> c'est pour ça qu'ils limitent à 130 km/h sur les autoroutes <y> c'est pour éviter que les gens voyagent dans le temps <b> probablement