summaryrefslogtreecommitdiff
path: root/libdiskfs/fsys-get-children.c
diff options
context:
space:
mode:
authorJustus Winter <justus@gnupg.org>2017-08-29 23:35:55 +0200
committerJustus Winter <justus@gnupg.org>2017-09-12 11:32:29 +0200
commit86ecc3fc9aa88091ac77ec35688d08634567d169 (patch)
tree44dfc7818e0523fe4db3069ae9bbc7fe993f48d0 /libdiskfs/fsys-get-children.c
parente08859424e01697fe556e277283e8e1905327ce7 (diff)
Traverse translator hierarchies using the fsys protocol.
Previously, we used the fs protocol to traverse the translator hierarchies. This, however, is conceptually flawed, because translators are bound to nodes, and a node can have zero or more links in the file system. Therefore, the previous method of returning a list of paths to the client and expecting them to be able to follow these to reach the child translators was always unreliable. Fix this by using the fsys protocol to traverse the hierarchy, and returning the control ports of all children. This is more robust, and also conceptually cleaner, because the fsys protocol is about translator linkage, hence this is the point to implement traversal. Also move the get source routine over. A per-node source really does not fit the reality of most translators, while a per-translator source makes sense in many cases. * hurd/fs.defs (file_get_children): Drop routine. (file_get_source): Likewise. * hurd/fsys.defs (fsys_get_children): New routine. (fsys_get_source): Likewise. * libdiskfs/Makefile (FSYSSRCS): Remove files, add files. * libdiskfs/file-get-children.c: Remove file. * libdiskfs/fsys-get-children.c: New file. * libdiskfs/file-get-source.c: Remove file. * libdiskfs/fsys-get-source.c: New file. * libfshelp/fshelp.h (fshelp_filter): Remove type. (fshelp_get_active_translators): Remove filter and prefix argument, return list of control ports. * libfshelp/translator-list.c (fshelp_get_active_translators): Likewise. * libnetfs/Makefile (FSSRCS): Move 'get-source.c' too OTHERSRCS. (FSYSSRCS): Remove files, add files. * libnetfs/file-get-children.c: Remove file. * libnetfs/fsys-get-children.c: New file. * libnetfs/file-get-source.c: Remove file. * libnetfs/fsys-get-source.c: New file. * libtrivfs/Makefile: Move 'get-source.c' too OTHERSRCS. (FSYSSRCS): Remove files, add files. * libtrivfs/file-get-children.c: Remove file. * libtrivfs/fsys-get-children.c: New file. * libtrivfs/file-get-source.c: Remove file. * libtrivfs/fsys-get-source.c: Add file. * trans/Makefile (mtab): Build client stubs until the libc has caught on. * trans/mtab.c (target_control): New variable. (insecure): Drop variable. (all_translators): Likewise. (MAX_DEPTH): New macro. (max_depth): New variable. (options): Remove '--insecure' and '--all-translators', add '--depth'. (parse_opt): Adapt accordingly. (trivsfs_append_args): Likewise. (main): Get the control port of the target translator, then drop privileges. (is_filesystem_translator): Remove function. (mtab_mark_as_seen): Simplify. Just check if the control port is known. (mtab_populate): Limit depth of recursion, adapt to traversing over the control ports, simplify. (open_hook): Remove scary comment, it is not applicable anymore because we no longer dir_lookup child translators.
Diffstat (limited to 'libdiskfs/fsys-get-children.c')
-rw-r--r--libdiskfs/fsys-get-children.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/libdiskfs/fsys-get-children.c b/libdiskfs/fsys-get-children.c
new file mode 100644
index 00000000..7e2a37b1
--- /dev/null
+++ b/libdiskfs/fsys-get-children.c
@@ -0,0 +1,74 @@
+/* fsys_get_children
+
+ Copyright (C) 2017 Free Software Foundation, Inc.
+
+ This file is part of the GNU Hurd.
+
+ The GNU Hurd is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ The GNU Hurd is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with the GNU Hurd. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "priv.h"
+#include "fsys_S.h"
+
+#include <argz.h>
+
+/* Return any active child translators. NAMES is an argz vector
+ containing file names relative to the root of the translator.
+ CONTROLS is an array containing the corresponding control ports.
+ Note that translators are bound to nodes, and nodes can have zero
+ or more links in the file system, therefore there is no guarantee
+ that a translators name refers to an existing link in the file
+ system. */
+error_t
+diskfs_S_fsys_get_children (struct diskfs_control *fsys,
+ mach_port_t reply,
+ mach_msg_type_name_t replytype,
+ char **names,
+ mach_msg_type_number_t *names_len,
+ mach_port_t **controls,
+ mach_msg_type_name_t *controlsPoly,
+ mach_msg_type_number_t *controlsCnt)
+{
+ error_t err;
+ char *n = NULL;
+ size_t n_len = 0;
+ mach_port_t *c;
+ size_t c_count;
+
+ if (! fsys)
+ return EOPNOTSUPP;
+
+
+ err = fshelp_get_active_translators (&n, &n_len, &c, &c_count);
+ if (err)
+ goto errout;
+
+ err = iohelp_return_malloced_buffer (n, n_len, names, names_len);
+ if (err)
+ goto errout;
+ n = NULL; /* n was freed by iohelp_return_malloced_buffer. */
+
+ err = iohelp_return_malloced_buffer ((char *) c, c_count * sizeof *c,
+ (char **) controls, controlsCnt);
+ if (err)
+ goto errout;
+ c = NULL; /* c was freed by iohelp_return_malloced_buffer. */
+
+ *controlsPoly = MACH_MSG_TYPE_MOVE_SEND;
+ *controlsCnt = c_count;
+
+ errout:
+ free (n);
+ free (c);
+ return err;
+}