aboutsummaryrefslogtreecommitdiff
path: root/hurd/lookup-at.c
diff options
context:
space:
mode:
authorSergey Bugaev <bugaevc@gmail.com>2023-01-30 15:52:14 +0300
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2023-02-01 20:05:20 +0100
commitd011ab5708c2be4e2cc7eb8851c9e2c614410bd3 (patch)
tree8c1aa7b73463094193775917e2435391e7f2a966 /hurd/lookup-at.c
parent98f9435f336cbee5d57a1a16373331ca1bc648db (diff)
downloadglibc-d011ab5708c2be4e2cc7eb8851c9e2c614410bd3.zip
glibc-d011ab5708c2be4e2cc7eb8851c9e2c614410bd3.tar.gz
glibc-d011ab5708c2be4e2cc7eb8851c9e2c614410bd3.tar.bz2
hurd: Consolidate file_name_lookup implementation
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. This factorizes handling the empy name case. Signed-off-by: Sergey Bugaev <bugaevc@gmail.com> Message-Id: <20230130125216.6254-2-bugaevc@gmail.com>
Diffstat (limited to 'hurd/lookup-at.c')
-rw-r--r--hurd/lookup-at.c51
1 files changed, 35 insertions, 16 deletions
diff --git a/hurd/lookup-at.c b/hurd/lookup-at.c
index 6f30a06..25dab5a 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