* 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