bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 3/3] hurd: fix semantic of file_get_children


From: Samuel Thibault
Subject: Re: [PATCH 3/3] hurd: fix semantic of file_get_children
Date: Sun, 31 Aug 2014 16:32:35 +0200
User-agent: Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30)

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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]