From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1792) id F2C513858D33; Wed, 1 Feb 2023 19:06:16 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org F2C513858D33 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1675278376; bh=sBhytMS0ebYvM2fKGEnmnmH+tWt+uitKSU/ipEgbI/w=; h=From:To:Subject:Date:From; b=xSdlNqc815DXUdYJuvcsA6hYYwZH6ygGRloj6Hi68BgP7KPMWACvq3bC36Dag5nOI gUhBVSGexscCmh1SrvtEWhtvHxqYEsYmVem3oSNd4ckRwIZI6sVJv0vVAls7FbRXNh NQkEpby0vbg0ctvrYJbtldRms79MJyNxl9oNkupE= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Samuel Thibault To: glibc-cvs@sourceware.org Subject: [glibc] hurd: Consolidate file_name_lookup implementation X-Act-Checkin: glibc X-Git-Author: Sergey Bugaev X-Git-Refname: refs/heads/master X-Git-Oldrev: 98f9435f336cbee5d57a1a16373331ca1bc648db X-Git-Newrev: d011ab5708c2be4e2cc7eb8851c9e2c614410bd3 Message-Id: <20230201190616.F2C513858D33@sourceware.org> Date: Wed, 1 Feb 2023 19:06:16 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=d011ab5708c2be4e2cc7eb8851c9e2c614410bd3 commit d011ab5708c2be4e2cc7eb8851c9e2c614410bd3 Author: Sergey Bugaev Date: Mon Jan 30 15:52:14 2023 +0300 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 Message-Id: <20230130125216.6254-2-bugaevc@gmail.com> Diff: --- 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 49eac4439e..3cfe444f5e 100644 --- a/hurd/hurdlookup.c +++ b/hurd/hurdlookup.c @@ -16,6 +16,7 @@ . */ #include +#include #include #include #include @@ -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 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