[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