diff options
Diffstat (limited to 'hurd/lookup-at.c')
-rw-r--r-- | hurd/lookup-at.c | 51 |
1 files changed, 35 insertions, 16 deletions
diff --git a/hurd/lookup-at.c b/hurd/lookup-at.c index 6f30a067e8..25dab5a16b 100644 --- a/hurd/lookup-at.c +++ b/hurd/lookup-at.c @@ -36,9 +36,6 @@ __file_name_lookup_at (int fd, int at_flags, if (err) return (__hurd_fail (err), MACH_PORT_NULL); - if (fd == AT_FDCWD || file_name[0] == '/') - return __file_name_lookup (file_name, flags, mode); - if (empty != 0 && file_name[0] == '\0') { enum retry_type doretry; @@ -56,22 +53,44 @@ __file_name_lookup_at (int fd, int at_flags, return err ? (__hurd_dfail (fd, err), MACH_PORT_NULL) : result; } - file_t startdir; - error_t use_init_port (int which, error_t (*operate) (mach_port_t)) + if (fd == AT_FDCWD || file_name[0] == '/') { - return (which == INIT_PORT_CWDIR ? (*operate) (startdir) - : _hurd_ports_use (which, operate)); + err = __hurd_file_name_lookup (&_hurd_ports_use, &__getdport, 0, + file_name, flags, mode & ~_hurd_umask, + &result); + if (err) + { + __hurd_fail (err); + return MACH_PORT_NULL; + } + } + else + { + file_t startdir; + /* We need to look the file up relative to the given directory (and + not our cwd). For this to work, we supply our own wrapper for + _hurd_ports_use, which replaces cwd with our startdir. */ + error_t use_init_port (int which, error_t (*operate) (mach_port_t)) + { + return (which == INIT_PORT_CWDIR ? (*operate) (startdir) + : _hurd_ports_use (which, operate)); + } + + err = HURD_DPORT_USE (fd, (startdir = port, + __hurd_file_name_lookup (&use_init_port, + &__getdport, NULL, + file_name, + flags, + mode & ~_hurd_umask, + &result))); + if (err) + { + __hurd_dfail (fd, err); + return MACH_PORT_NULL; + } } - err = HURD_DPORT_USE (fd, (startdir = port, - __hurd_file_name_lookup (&use_init_port, - &__getdport, NULL, - file_name, - flags, - mode & ~_hurd_umask, - &result))); - - return err ? (__hurd_dfail (fd, err), MACH_PORT_NULL) : result; + return result; } file_t |