bug-hurd
[Top][All Lists]
Advanced

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

[PATCH 8/8] libnetfs: register passive translator startups


From: Justus Winter
Subject: [PATCH 8/8] libnetfs: register passive translator startups
Date: Sun, 12 Jan 2014 20:08:45 +0100

Detect passive translator startup and add the resulting active
translator to the list of active translators.

* libnetfs/dir-lookup.c (netfs_S_dir_lookup): Detect and register
  passive translator startup.
---
 libnetfs/dir-lookup.c | 43 +++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 41 insertions(+), 2 deletions(-)

diff --git a/libnetfs/dir-lookup.c b/libnetfs/dir-lookup.c
index 74351fa..99a8746 100644
--- a/libnetfs/dir-lookup.c
+++ b/libnetfs/dir-lookup.c
@@ -1,5 +1,5 @@
 /*
-   Copyright (C) 1995,96,97,98,99,2000,01,02,13
+   Copyright (C) 1995,96,97,98,99,2000,01,02,13,14
      Free Software Foundation, Inc.
    Written by Michael I. Bushnell, p/BSG.
 
@@ -67,6 +67,10 @@ netfs_S_dir_lookup (struct protid *diruser,
   if (! relpath)
     return ENOMEM;
 
+  /* Keep a pointer to the start of the filename for length
+     calculations.  */
+  char *filename_start = filename;
+
   *retry_port_type = MACH_MSG_TYPE_MAKE_SEND;
   *do_retry = FS_RETRY_NORMAL;
   *retry_name = '\0';
@@ -256,10 +260,16 @@ netfs_S_dir_lookup (struct protid *diruser,
                }
            }
 
+         boolean_t register_translator;
          if (! error)
            {
              dirport = ports_get_send_right (newpi);
-             ports_port_deref (newpi);
+
+             /* Check if an active translator is currently running.  If
+                not, fshelp_fetch_root will start one.  In that case, we
+                need to register it in the list of active
+                translators.  */
+             register_translator = np->transbox.active == MACH_PORT_NULL;
 
              error = fshelp_fetch_root (&np->transbox, diruser->po,
                                         dirport,
@@ -283,9 +293,38 @@ netfs_S_dir_lookup (struct protid *diruser,
                  strcat (retry_name, "/");
                  strcat (retry_name, nextname);
                }
+
+             if (register_translator)
+               {
+                 char *translator_path = strdupa (relpath);
+                 if (nextname != NULL)
+                   {
+                     /* This was not the last path component.
+                        NEXTNAME points to the next component, locate
+                        the end of the current component and use it
+                        to trim TRANSLATOR_PATH.  */
+                     char *end = nextname;
+                     while (*end != 0)
+                       end--;
+                     translator_path[end - filename_start] = '\0';
+                   }
+
+                 error = fshelp_set_active_translator (&newpi->pi,
+                                                       translator_path,
+                                                       np->transbox.active);
+                 if (error)
+                   {
+                     ports_port_deref (newpi);
+                     goto out;
+                   }
+               }
+
+             ports_port_deref (newpi);
              goto out;
            }
 
+         ports_port_deref (newpi);
+
          /* ENOENT means there was a hiccup, and the translator vanished
             while NP was unlocked inside fshelp_fetch_root; continue as 
normal. */
          error = 0;
-- 
1.8.5.2




reply via email to

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