[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
- Re: [PATCH 4/7] procfs: do not test whether /hurd/mtab exists, (continued)
- [PATCH 5/7] procfs: generalize the translator linkage code, Justus Winter, 2014/09/22
- Re: [PATCH 5/7] procfs: generalize the translator linkage code, Samuel Thibault, 2014/09/28
- [PATCH 6/7] procfs: reorganize rootdir.c, Justus Winter, 2014/09/22
- Re: [PATCH 6/7] procfs: reorganize rootdir.c, Samuel Thibault, 2014/09/28
- [PATCH 7/7] procfs: provide magic retry response for /proc/self, Justus Winter, 2014/09/22
- Re: [PATCH 7/7] procfs: provide magic retry response for /proc/self, Samuel Thibault, 2014/09/30
- And the libc patch, Justus Winter, 2014/09/22
- [PATCH] hurd: Handle `proc/self' magical lookup retry,
Justus Winter <=
- Re: [PATCH 1/7] procfs: implement /proc/N/maps, Samuel Thibault, 2014/09/28
- [PATCH 5/6] procfs: reorganize rootdir.c, Justus Winter, 2014/09/21
- [PATCH 6/6] procfs: provide magic retry response for /proc/self, Justus Winter, 2014/09/21