diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2019-01-22 23:38:36 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2019-01-22 23:41:13 +0100 |
commit | ee4d79026da2c21c75cccd5795cb4357643f4f5c (patch) | |
tree | 971a8e4bf2ec1e97e19b03bcee473bf30693f953 | |
parent | a95dc01c9e55bef6b48a762e26f15d93100ab9e5 (diff) | |
download | glibc-ee4d79026da2c21c75cccd5795cb4357643f4f5c.tar.gz |
hurd: Support AT_EMPTY_PATH
* hurd/lookup-at.c (__file_name_lookup_at): When at_flags contains
AT_EMPTY_PATH, call __dir_lookup and __hurd_file_name_lookup_retry
directly instead of __hurd_file_name_lookup.
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | hurd/lookup-at.c | 20 |
2 files changed, 23 insertions, 0 deletions
@@ -2,6 +2,9 @@ * sysdeps/mach/hurd/faccessat.c (__faccessat_common): Check for errors returned by __hurd_at_flags. + * hurd/lookup-at.c (__file_name_lookup_at): When at_flags contains + AT_EMPTY_PATH, call __dir_lookup and __hurd_file_name_lookup_retry + directly instead of __hurd_file_name_lookup. 2019-01-21 Joseph Myers <joseph@codesourcery.com> diff --git a/hurd/lookup-at.c b/hurd/lookup-at.c index 813ebee8e5..3e6980f949 100644 --- a/hurd/lookup-at.c +++ b/hurd/lookup-at.c @@ -28,6 +28,9 @@ __file_name_lookup_at (int fd, int at_flags, { error_t err; file_t result; + int empty = at_flags & AT_EMPTY_PATH; + + at_flags &= ~AT_EMPTY_PATH; err = __hurd_at_flags (&at_flags, &flags); if (err) @@ -36,6 +39,23 @@ __file_name_lookup_at (int fd, int at_flags, 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; + char retryname[1024]; /* XXX string_t LOSES! */ + + err = HURD_DPORT_USE (fd, __dir_lookup (port, "", flags, mode, + &doretry, retryname, + &result)); + + if (! err) + err = __hurd_file_name_lookup_retry (&_hurd_ports_use, &__getdport, + NULL, doretry, retryname, + flags, mode, &result); + + 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)) { |