bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[RFC PATCH 1/3] hurd: Consolidate file_name_lookup implementation


From: Sergey Bugaev
Subject: [RFC PATCH 1/3] hurd: Consolidate file_name_lookup implementation
Date: Mon, 12 Dec 2022 14:46:34 +0300

Instead of __file_name_lookup_at delegating to __file_name_lookup
in simple cases, make __file_name_lookup_at deal with both cases, and
have __file_name_lookup simply wrap __file_name_lookup_at.
---
 hurd/hurdlookup.c | 10 ++--------
 hurd/lookup-at.c  | 51 ++++++++++++++++++++++++++++++++---------------
 2 files changed, 37 insertions(+), 24 deletions(-)

diff --git a/hurd/hurdlookup.c b/hurd/hurdlookup.c
index 7babac7d..08166a2c 100644
--- a/hurd/hurdlookup.c
+++ b/hurd/hurdlookup.c
@@ -16,6 +16,7 @@
    <https://www.gnu.org/licenses/>.  */
 
 #include <hurd.h>
+#include <hurd/fd.h>
 #include <hurd/lookup.h>
 #include <string.h>
 #include <fcntl.h>
@@ -220,14 +221,7 @@ weak_alias (__hurd_directory_name_split, 
hurd_directory_name_split)
 file_t
 __file_name_lookup (const char *file_name, int flags, mode_t mode)
 {
-  error_t err;
-  file_t result;
-
-  err = __hurd_file_name_lookup (&_hurd_ports_use, &__getdport, 0,
-                                file_name, flags, mode & ~_hurd_umask,
-                                &result);
-
-  return err ? (__hurd_fail (err), MACH_PORT_NULL) : result;
+  return __file_name_lookup_at (AT_FDCWD, 0, file_name, flags, mode);
 }
 weak_alias (__file_name_lookup, file_name_lookup)
 
diff --git a/hurd/lookup-at.c b/hurd/lookup-at.c
index 0c247a64..2b84dfd6 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
-- 
2.38.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]