bug-hurd
[Top][All Lists]
Advanced

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

[PATCH] hurd: Handle `proc/self' magical lookup retry


From: Justus Winter
Subject: [PATCH] hurd: Handle `proc/self' magical lookup retry
Date: Mon, 22 Sep 2014 11:41:13 +0200

        * hurd/lookup-retry.c: Handle `proc/self' magical lookup
        retry.
---
 hurd/lookup-retry.c | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

diff --git a/hurd/lookup-retry.c b/hurd/lookup-retry.c
index f633e57..b18ad3b 100644
--- a/hurd/lookup-retry.c
+++ b/hurd/lookup-retry.c
@@ -25,6 +25,7 @@
 #include <string.h>
 #include <_itoa.h>
 #include <eloop-threshold.h>
+#include <unistd.h>
 
 /* Translate the error from dir_lookup into the error the user sees.  */
 static inline error_t
@@ -59,6 +60,7 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
   error_t err;
   char *file_name;
   int nloops;
+  file_t lastdir = MACH_PORT_NULL;
 
   error_t lookup_op (file_t startdir)
     {
@@ -299,6 +301,29 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
                goto bad_magic;
              break;
 
+           case 'p':
+             if (retryname[1] == 'r' && retryname[2] == 'o' &&
+                 retryname[3] == 'c' && retryname[4] == '/' &&
+                 retryname[5] == 's' && retryname[6] == 'e' &&
+                 retryname[7] == 'l' && retryname[8] == 'f' &&
+                 (retryname[9] == '/' || retryname[9] == 0))
+               {
+                 char *p, buf[1024];  /* XXX */
+                 size_t len;
+                 p = _itoa (__getpid (), &buf[sizeof buf], 10, 0);
+                 len = &buf[sizeof buf] - p;
+                 memcpy (buf, p, len);
+                 strcpy (buf + len, &retryname[9]);
+                 strcpy (retryname, buf);
+
+                 /* Do a normal retry on the remaining components.  */
+                 startdir = lastdir;
+                 file_name = retryname;
+               }
+             else
+               goto bad_magic;
+             break;
+
            default:
            bad_magic:
              return EGRATUITOUS;
@@ -309,6 +334,16 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
          return EGRATUITOUS;
        }
 
+      if (MACH_PORT_VALID (*result) && *result != lastdir)
+       {
+         if (MACH_PORT_VALID (lastdir))
+           __mach_port_deallocate (__mach_task_self (), lastdir);
+
+         lastdir = *result;
+         __mach_port_mod_refs (__mach_task_self (), lastdir,
+                               MACH_PORT_RIGHT_SEND, 1);
+       }
+
       if (startdir != MACH_PORT_NULL)
        {
          err = lookup_op (startdir);
@@ -319,6 +354,9 @@ __hurd_file_name_lookup_retry (error_t (*use_init_port)
        err = (*use_init_port) (dirport, &lookup_op);
     } while (! err);
 
+  if (MACH_PORT_VALID (lastdir))
+    __mach_port_deallocate (__mach_task_self (), lastdir);
+
   return err;
 }
 weak_alias (__hurd_file_name_lookup_retry, hurd_file_name_lookup_retry)
-- 
2.1.0




reply via email to

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