diff options
Diffstat (limited to 'debian/patches/fs_unification0004-YYY-Unify-the-short-circuit-translator-logic.patch')
-rw-r--r-- | debian/patches/fs_unification0004-YYY-Unify-the-short-circuit-translator-logic.patch | 331 |
1 files changed, 331 insertions, 0 deletions
diff --git a/debian/patches/fs_unification0004-YYY-Unify-the-short-circuit-translator-logic.patch b/debian/patches/fs_unification0004-YYY-Unify-the-short-circuit-translator-logic.patch new file mode 100644 index 00000000..d2652bcc --- /dev/null +++ b/debian/patches/fs_unification0004-YYY-Unify-the-short-circuit-translator-logic.patch @@ -0,0 +1,331 @@ +From 5507188abfeaf049bcf43f23613d8ce4df95bcf3 Mon Sep 17 00:00:00 2001 +From: Justus Winter <justus@gnupg.org> +Date: Mon, 18 Apr 2016 21:53:28 +0200 +Subject: [PATCH hurd 4/4] YYY Unify the short-circuit translator logic + +* libdiskfs/dir-lookup.c (short_circuited_callback1): Drop function. +* libdiskfs/trans-callback.c +* libfshelp/fetch-root.c +* libfshelp/fshelp.h +* libnetfs/dir-lookup.c +* libnetfs/trans-callback.c +--- + libdiskfs/dir-lookup.c | 61 ++++++++++++---------------------------------- + libdiskfs/trans-callback.c | 4 ++- + libfshelp/fetch-root.c | 39 +++++++++++++++++++++++++++++ + libfshelp/fshelp.h | 16 ++++++++++++ + libnetfs/dir-lookup.c | 53 +++++++--------------------------------- + libnetfs/trans-callback.c | 4 ++- + 6 files changed, 86 insertions(+), 91 deletions(-) + +diff --git a/libdiskfs/dir-lookup.c b/libdiskfs/dir-lookup.c +index 72ada0f..8b43e27 100644 +--- a/libdiskfs/dir-lookup.c ++++ b/libdiskfs/dir-lookup.c +@@ -20,6 +20,7 @@ + #include <fcntl.h> + #include <string.h> + #include <sys/file.h> ++#include <hurd/fshelp.h> + #include <hurd/fsys.h> + #include <hurd/paths.h> + +@@ -225,43 +226,6 @@ diskfs_S_dir_lookup (struct protid *dircred, + mach_port_t dirport; + struct iouser *user; + +- /* A callback function for short-circuited translators. +- S_ISLNK and S_IFSOCK are handled elsewhere. */ +- error_t short_circuited_callback1 (void *cookie1, void *cookie2, +- uid_t *uid, gid_t *gid, +- char **argz, size_t *argz_len) +- { +- struct node *node = cookie1; +- +- switch (node->dn_stat.st_mode & S_IFMT) +- { +- case S_IFCHR: +- case S_IFBLK: +- if (asprintf (argz, "%s%c%d%c%d", +- (S_ISCHR (node->dn_stat.st_mode) +- ? _HURD_CHRDEV : _HURD_BLKDEV), +- 0, major (node->dn_stat.st_rdev), +- 0, minor (node->dn_stat.st_rdev)) < 0) +- return ENOMEM; +- *argz_len = strlen (*argz) + 1; +- *argz_len += strlen (*argz + *argz_len) + 1; +- *argz_len += strlen (*argz + *argz_len) + 1; +- break; +- case S_IFIFO: +- if (asprintf (argz, "%s", _HURD_FIFO) < 0) +- return ENOMEM; +- *argz_len = strlen (*argz) + 1; +- break; +- default: +- return ENOENT; +- } +- +- *uid = node->dn_stat.st_uid; +- *gid = node->dn_stat.st_gid; +- +- return 0; +- } +- + /* Create an unauthenticated port for DNP, and then + unlock it. */ + err = iohelp_create_empty_iouser (&user); +@@ -292,14 +256,21 @@ diskfs_S_dir_lookup (struct protid *dircred, + boolean_t register_translator = + np->transbox.active == MACH_PORT_NULL; + +- err = fshelp_fetch_root (&np->transbox, dircred->po, +- dirport, dircred->user, +- lastcomp ? flags : 0, +- ((np->dn_stat.st_mode & S_IPTRANS) +- ? _diskfs_translator_callback1 +- : short_circuited_callback1), +- _diskfs_translator_callback2, +- do_retry, retry_name, retry_port); ++ struct fshelp_stat_cookie2 cookie = { ++ .statp = &np->dn_stat, ++ .modep = &np->dn_stat.st_mode, ++ .next = dircred->po, ++ }; ++ err = fshelp_fetch_root (&np->transbox, ++ &cookie, ++ dirport, ++ dircred->user, ++ lastcomp ? flags : 0, ++ ((np->dn_stat.st_mode & S_IPTRANS) ++ ? _diskfs_translator_callback1 ++ : fshelp_short_circuited_callback1), ++ _diskfs_translator_callback2, ++ do_retry, retry_name, retry_port); + + /* fetch_root copies DIRPORT for success, so we always should + deallocate our send right. */ +diff --git a/libdiskfs/trans-callback.c b/libdiskfs/trans-callback.c +index 283b184..15e8f9a 100644 +--- a/libdiskfs/trans-callback.c ++++ b/libdiskfs/trans-callback.c +@@ -20,6 +20,7 @@ + + #include "priv.h" + #include <fcntl.h> ++#include <hurd/fshelp.h> + + /* Callback function needed for calls to fshelp_fetch_root. See + <hurd/fshelp.h> for the interface description. */ +@@ -56,6 +57,7 @@ _diskfs_translator_callback2_fn (void *cookie1, void *cookie2, + mach_msg_type_name_t *underlying_type) + { + struct node *np = cookie1; ++ struct fshelp_stat_cookie2 *statc = cookie2; + struct protid *cred; + struct peropen *po; + error_t err; +@@ -66,7 +68,7 @@ _diskfs_translator_callback2_fn (void *cookie1, void *cookie2, + if (err) + return err; + +- err = diskfs_make_peropen (np, flags, cookie2, &po); ++ err = diskfs_make_peropen (np, flags, statc->next, &po); + if (! err) + { + err = diskfs_create_protid (po, user, &cred); +diff --git a/libfshelp/fetch-root.c b/libfshelp/fetch-root.c +index cc9fa50..eb43993 100644 +--- a/libfshelp/fetch-root.c ++++ b/libfshelp/fetch-root.c +@@ -20,6 +20,7 @@ + + #include <assert.h> + #include <hurd/fsys.h> ++#include <hurd/paths.h> + #include <hurd/ports.h> + #include <stdlib.h> + #include <string.h> +@@ -197,3 +198,41 @@ fshelp_fetch_root (struct transbox *box, void *cookie, + + return err; + } ++ ++/* A callback function for short-circuited translators. S_ISLNK and ++ S_IFSOCK must be handled elsewhere. */ ++error_t ++fshelp_short_circuited_callback1 (void *cookie1, void *cookie2, ++ uid_t *uid, gid_t *gid, ++ char **argz, size_t *argz_len) ++{ ++ struct fshelp_stat_cookie2 *statc = cookie2; ++ ++ switch (*statc->modep & S_IFMT) ++ { ++ case S_IFCHR: ++ case S_IFBLK: ++ if (asprintf (argz, "%s%c%d%c%d", ++ (S_ISCHR (*statc->modep) ++ ? _HURD_CHRDEV : _HURD_BLKDEV), ++ 0, major (statc->statp->st_rdev), ++ 0, minor (statc->statp->st_rdev)) < 0) ++ return ENOMEM; ++ *argz_len = strlen (*argz) + 1; ++ *argz_len += strlen (*argz + *argz_len) + 1; ++ *argz_len += strlen (*argz + *argz_len) + 1; ++ break; ++ case S_IFIFO: ++ if (asprintf (argz, "%s", _HURD_FIFO) < 0) ++ return ENOMEM; ++ *argz_len = strlen (*argz) + 1; ++ break; ++ default: ++ return ENOENT; ++ } ++ ++ *uid = statc->statp->st_uid; ++ *gid = statc->statp->st_gid; ++ ++ return 0; ++} +diff --git a/libfshelp/fshelp.h b/libfshelp/fshelp.h +index d04c056..ecd9335 100644 +--- a/libfshelp/fshelp.h ++++ b/libfshelp/fshelp.h +@@ -148,6 +148,22 @@ typedef error_t (*fshelp_fetch_root_callback1_t) (void *cookie1, void *cookie2, + uid_t *uid, gid_t *gid, + char **argz, size_t *argz_len); + ++/* A cookie for fshelp_short_circuited_callback1. Such a structure ++ must be passed to the call to fshelp_fetch_root. */ ++struct fshelp_stat_cookie2 ++{ ++ io_statbuf_t *statp; ++ mode_t *modep; ++ void *next; ++}; ++ ++/* A callback function for short-circuited translators. S_ISLNK and ++ S_IFSOCK must be handled elsewhere. */ ++error_t fshelp_short_circuited_callback1 (void *cookie1, void *cookie2, ++ uid_t *uid, gid_t *gid, ++ char **argz, size_t *argz_len); ++ ++ + /* This routine is called by fshelp_fetch_root to fetch more information. + Return an unauthenticated node for the file itself in *UNDERLYING and + *UNDERLYING_TYPE (opened with FLAGS). COOKIE1 is the cookie passed in +diff --git a/libnetfs/dir-lookup.c b/libnetfs/dir-lookup.c +index caeb151..3bcc745 100644 +--- a/libnetfs/dir-lookup.c ++++ b/libnetfs/dir-lookup.c +@@ -207,48 +207,6 @@ netfs_S_dir_lookup (struct protid *dircred, + { + mach_port_t dirport; + +- /* A callback function for short-circuited translators. +- S_ISLNK and S_IFSOCK are handled elsewhere. */ +- error_t short_circuited_callback1 (void *cookie1, void *cookie2, +- uid_t *uid, gid_t *gid, +- char **argz, size_t *argz_len) +- { +- struct node *np = cookie1; +- error_t err; +- +- err = netfs_validate_stat (np, dircred->user); +- if (err) +- return err; +- +- switch (np->nn_translated & S_IFMT) +- { +- case S_IFCHR: +- case S_IFBLK: +- if (asprintf (argz, "%s%c%d%c%d", +- (S_ISCHR (np->nn_translated) +- ? _HURD_CHRDEV : _HURD_BLKDEV), +- 0, major (np->nn_stat.st_rdev), +- 0, minor (np->nn_stat.st_rdev)) < 0) +- return ENOMEM; +- *argz_len = strlen (*argz) + 1; +- *argz_len += strlen (*argz + *argz_len) + 1; +- *argz_len += strlen (*argz + *argz_len) + 1; +- break; +- case S_IFIFO: +- if (asprintf (argz, "%s", _HURD_FIFO) < 0) +- return ENOMEM; +- *argz_len = strlen (*argz) + 1; +- break; +- default: +- return ENOENT; +- } +- +- *uid = np->nn_stat.st_uid; +- *gid = np->nn_stat.st_gid; +- +- return 0; +- } +- + /* Create an unauthenticated port for DNP, and then + unlock it. */ + err = iohelp_create_empty_iouser (&user); +@@ -267,6 +225,12 @@ netfs_S_dir_lookup (struct protid *dircred, + boolean_t register_translator = 0; + if (! err) + { ++ struct fshelp_stat_cookie2 cookie = { ++ .statp = &np->nn_stat, ++ .modep = &np->nn_translated, ++ .next = dircred->po, ++ }; ++ + dirport = ports_get_send_right (newpi); + + /* Check if an active translator is currently running. If +@@ -275,13 +239,14 @@ netfs_S_dir_lookup (struct protid *dircred, + translators. */ + register_translator = np->transbox.active == MACH_PORT_NULL; + +- err = fshelp_fetch_root (&np->transbox, dircred->po, ++ err = fshelp_fetch_root (&np->transbox, ++ &cookie, + dirport, + dircred->user, + lastcomp ? flags : 0, + ((np->nn_translated & S_IPTRANS) + ? _netfs_translator_callback1 +- : short_circuited_callback1), ++ : fshelp_short_circuited_callback1), + _netfs_translator_callback2, + do_retry, retry_name, retry_port); + /* fetch_root copies DIRPORT for success, so we always should +diff --git a/libnetfs/trans-callback.c b/libnetfs/trans-callback.c +index ed21aa2..99f4dc0 100644 +--- a/libnetfs/trans-callback.c ++++ b/libnetfs/trans-callback.c +@@ -20,6 +20,7 @@ + + #include "priv.h" + #include <fcntl.h> ++#include <hurd/fshelp.h> + + /* Callback function needed for calls to fshelp_fetch_root. See + <hurd/fshelp.h> for the interface description. */ +@@ -57,6 +58,7 @@ _netfs_translator_callback2_fn (void *cookie1, void *cookie2, int flags, + error_t err; + struct protid *cred; + struct node *node = cookie1; ++ struct fshelp_stat_cookie2 *statc = cookie2; + struct iouser *user; + struct peropen *po; + +@@ -65,7 +67,7 @@ _netfs_translator_callback2_fn (void *cookie1, void *cookie2, int flags, + if (err) + return err; + +- po = netfs_make_peropen (node, flags, cookie2); ++ po = netfs_make_peropen (node, flags, statc->next); + if (! po) + { + err = errno; +-- +2.1.4 + |