]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
hurd: Support AT_EMPTY_PATH
authorSamuel Thibault <samuel.thibault@ens-lyon.org>
Tue, 22 Jan 2019 22:38:36 +0000 (23:38 +0100)
committerSamuel Thibault <samuel.thibault@ens-lyon.org>
Tue, 22 Jan 2019 22:41:13 +0000 (23:41 +0100)
* 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.

ChangeLog
hurd/lookup-at.c

index 8bffe5035b7d25c9a06e7ad75ecf6bdcfa280f02..fed239cf3cd2dccbeeebfa79bc08a7ea53728bac 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
 
index 813ebee8e5e25b0f32960d00196d4abf85e5e464..3e6980f949ff084404756754f4e7e8fa3b6d6dc8 100644 (file)
@@ -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))
     {