commit-hurd
[Top][All Lists]
Advanced

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

[hurd] 11/14: Unify the short-circuit translator logic


From: Samuel Thibault
Subject: [hurd] 11/14: Unify the short-circuit translator logic
Date: Sun, 22 May 2016 01:15:22 +0000

This is an automated email from the git hooks/post-receive script.

sthibault pushed a commit to branch upstream
in repository hurd.

commit 13efe6721a370c38b65e0da3d33f310f42cfa05f
Author: Justus Winter <address@hidden>
Date:   Mon Apr 18 21:53:28 2016 +0200

    Unify the short-circuit translator logic
    
    * libdiskfs/dir-lookup.c (short_circuited_callback1): Move function to
    libfshelp.
    (diskfs_S_dir_lookup): Use the function from libfshelp instead.
    * libdiskfs/fsys-getroot.c (diskfs_S_fsys_getroot): Adapt accordingly.
    * libdiskfs/trans-callback.c (_diskfs_translator_callback2_fn): Likewise.
    * libfshelp/fetch-root.c (fshelp_short_circuited_callback1): New function.
    * libfshelp/fshelp.h (struct fshelp_stat_cookie): New definition.
    (fshelp_short_circuited_callback1): New prototype.
    * libnetfs/dir-lookup.c (short_circuited_callback1): Drop function.
    (netfs_S_dir_lookup): Use the function from libfshelp instead.
    * libnetfs/fsys-getroot.c (netfs_S_fsys_getroot): Adapt accordingly.
    * libnetfs/trans-callback.c (_netfs_translator_callback2_fn): Likewise.
---
 libdiskfs/dir-lookup.c     | 61 ++++++++++++----------------------------------
 libdiskfs/fsys-getroot.c   | 13 +++++++---
 libdiskfs/trans-callback.c |  4 ++-
 libfshelp/fetch-root.c     | 40 ++++++++++++++++++++++++++++++
 libfshelp/fshelp.h         | 16 ++++++++++++
 libnetfs/dir-lookup.c      | 53 +++++++---------------------------------
 libnetfs/fsys-getroot.c    |  7 +++++-
 libnetfs/trans-callback.c  |  4 ++-
 8 files changed, 102 insertions(+), 96 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/fsys-getroot.c b/libdiskfs/fsys-getroot.c
index 401f103..6f93888 100644
--- a/libdiskfs/fsys-getroot.c
+++ b/libdiskfs/fsys-getroot.c
@@ -21,6 +21,7 @@
 
 #include "priv.h"
 #include "fsys_S.h"
+#include <hurd/fshelp.h>
 #include <hurd/fsys.h>
 #include <fcntl.h>
 
@@ -78,11 +79,15 @@ diskfs_S_fsys_getroot (struct diskfs_control *pt,
        || fshelp_translated (&diskfs_root_node->transbox))
       && !(flags & O_NOTRANS))
     {
+      struct fshelp_stat_cookie2 cookie = {
+       .next = &peropen_context,
+      };
+
       err = fshelp_fetch_root (&diskfs_root_node->transbox,
-                                &peropen_context, dotdot, &user, flags,
-                                _diskfs_translator_callback1,
-                                _diskfs_translator_callback2,
-                                retry, retryname, returned_port);
+                              &cookie, dotdot, &user, flags,
+                              _diskfs_translator_callback1,
+                              _diskfs_translator_callback2,
+                              retry, retryname, returned_port);
       if (err != ENOENT)
        {
          pthread_mutex_unlock (&diskfs_root_node->lock);
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 eb0f315..75aa2d3 100644
--- a/libfshelp/fetch-root.c
+++ b/libfshelp/fetch-root.c
@@ -20,7 +20,9 @@
 
 #include <assert.h>
 #include <hurd/fsys.h>
+#include <hurd/paths.h>
 #include <hurd/ports.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
@@ -197,3 +199,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/fsys-getroot.c b/libnetfs/fsys-getroot.c
index 2d02120..d919110 100644
--- a/libnetfs/fsys-getroot.c
+++ b/libnetfs/fsys-getroot.c
@@ -23,6 +23,7 @@
 #include "misc.h"
 #include "callbacks.h"
 #include <fcntl.h>
+#include <hurd/fshelp.h>
 
 error_t
 netfs_S_fsys_getroot (struct netfs_control *pt,
@@ -67,8 +68,12 @@ netfs_S_fsys_getroot (struct netfs_control *pt,
        || fshelp_translated (&netfs_root_node->transbox))
       && !(flags & O_NOTRANS))
     {
+      struct fshelp_stat_cookie2 cookie = {
+       .next = &peropen_context,
+      };
+
       err = fshelp_fetch_root (&netfs_root_node->transbox,
-                              &peropen_context, dotdot, cred, flags,
+                              &cookie, dotdot, cred, flags,
                               _netfs_translator_callback1,
                               _netfs_translator_callback2,
                               do_retry, retry_name, retry_port);
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;

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-hurd/hurd.git



reply via email to

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