summaryrefslogtreecommitdiff
path: root/debian/patches/0003-hurd-fix-semantic-of-file_get_children.patch
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2014-08-31 17:16:27 +0200
committerJustus Winter <4winter@informatik.uni-hamburg.de>2014-08-31 17:16:27 +0200
commit50d6c2b273fbc0f1f40bcc2a01f2b36a40b64e15 (patch)
treebba7b641a79b5ccd7b55531b0dfefc45c9b92b0d /debian/patches/0003-hurd-fix-semantic-of-file_get_children.patch
parentcfe22ed15fc70a4aeb2a6ee2c57263fde0cbb204 (diff)
add patch series
Diffstat (limited to 'debian/patches/0003-hurd-fix-semantic-of-file_get_children.patch')
-rw-r--r--debian/patches/0003-hurd-fix-semantic-of-file_get_children.patch179
1 files changed, 179 insertions, 0 deletions
diff --git a/debian/patches/0003-hurd-fix-semantic-of-file_get_children.patch b/debian/patches/0003-hurd-fix-semantic-of-file_get_children.patch
new file mode 100644
index 00000000..318f2839
--- /dev/null
+++ b/debian/patches/0003-hurd-fix-semantic-of-file_get_children.patch
@@ -0,0 +1,179 @@
+From 19329e159a440398fbf2f342951b83855c0ddffb Mon Sep 17 00:00:00 2001
+From: Justus Winter <4winter@informatik.uni-hamburg.de>
+Date: Sun, 31 Aug 2014 14:47:42 +0200
+Subject: [PATCH 3/3] hurd: fix semantic of file_get_children
+
+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
+
+* 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..c3aba0b 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 (prefix && 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
+