diff options
Diffstat (limited to 'hurd')
-rw-r--r-- | hurd/Makefile | 4 | ||||
-rw-r--r-- | hurd/hurd/fd.h | 18 | ||||
-rw-r--r-- | hurd/hurd/lookup.h | 34 | ||||
-rw-r--r-- | hurd/hurdlookup.c | 14 | ||||
-rw-r--r-- | hurd/lookup-at.c | 110 |
5 files changed, 159 insertions, 21 deletions
diff --git a/hurd/Makefile b/hurd/Makefile index 5d99429f79..ab5a8485a2 100644 --- a/hurd/Makefile +++ b/hurd/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1991,92,93,94,95,96,97,98,99,2001,2002,2004 +# Copyright (C) 1991,92,93,94,95,96,97,98,99,2001,2002,2004,2006 # Free Software Foundation, Inc. # This file is part of the GNU C Library. @@ -46,7 +46,7 @@ server-interfaces := hurd/msg faultexc routines = hurdstartup hurdinit \ hurdid hurdpid hurdrlimit hurdprio hurdexec hurdselect \ - hurdlookup lookup-retry \ + hurdlookup lookup-retry lookup-at \ get-host set-host \ path-lookup \ setauth \ diff --git a/hurd/hurd/fd.h b/hurd/hurd/fd.h index 198791b807..ad11367f3b 100644 --- a/hurd/hurd/fd.h +++ b/hurd/hurd/fd.h @@ -1,5 +1,5 @@ /* File descriptors. - Copyright (C) 1993,94,95,96,97,98,99,2000,01,02 + Copyright (C) 1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2006 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -240,5 +240,21 @@ extern int _hurd_select (int nfds, struct pollfd *pollfds, const struct timespec *timeout, const sigset_t *sigmask); +/* Variant of file_name_lookup used in *at function implementations. + AT_FLAGS should contain only AT_SYMLINK_NOFOLLOW; other bits + cause EINVAL. */ +extern file_t __file_name_lookup_at (int fd, int at_flags, + const char *file_name, + int flags, mode_t mode); + +/* Variant of file_name_split used in *at function implementations. */ +extern file_t __file_name_split_at (int fd, const char *file_name, + char **name); + +/* Variant of directory_name_split used in *at function implementations. */ +extern file_t __directory_name_split_at (int fd, const char *directory_name, + char **name); + + #endif /* hurd/fd.h */ diff --git a/hurd/hurd/lookup.h b/hurd/hurd/lookup.h index faa35e0bf6..1d013d9537 100644 --- a/hurd/hurd/lookup.h +++ b/hurd/hurd/lookup.h @@ -1,5 +1,5 @@ /* Declarations of file name translation functions for the GNU Hurd. - Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + Copyright (C) 1995, 1996, 1997, 2006 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -76,8 +76,8 @@ error_t __hurd_file_name_split (error_t (*use_init_port) (int which, error_t (*operate) (mach_port_t)), file_t (*get_dtable_port) (int fd), - error_t (*lookup) - (file_t dir, char *name, int flags, mode_t mode, + error_t (*lookup) (file_t dir, char *name, + int flags, mode_t mode, retry_type *do_retry, string_t retry_name, mach_port_t *result), const char *file_name, @@ -86,13 +86,37 @@ error_t hurd_file_name_split (error_t (*use_init_port) (int which, error_t (*operate) (mach_port_t)), file_t (*get_dtable_port) (int fd), - error_t (*lookup) - (file_t dir, char *name, int flags, mode_t mode, + error_t (*lookup) (file_t dir, char *name, + int flags, mode_t mode, retry_type *do_retry, string_t retry_name, mach_port_t *result), const char *file_name, file_t *dir, char **name); +/* Split DIRECTORY into a parent directory and a name within the directory. + This is the same as hurd_file_name_split, but ignores trailing slashes. */ + +error_t __hurd_directory_name_split (error_t (*use_init_port) + (int which, + error_t (*operate) (mach_port_t)), + file_t (*get_dtable_port) (int fd), + error_t (*lookup) (file_t dir, char *name, + int flags, mode_t mode, + retry_type *do_retry, string_t retry_name, + mach_port_t *result), + const char *directory_name, + file_t *dir, char **name); +error_t hurd_directory_name_split (error_t (*use_init_port) + (int which, + error_t (*operate) (mach_port_t)), + file_t (*get_dtable_port) (int fd), + error_t (*lookup) (file_t dir, char *name, + int flags, mode_t mode, + retry_type *do_retry, string_t retry_name, + mach_port_t *result), + const char *directory_name, + file_t *dir, char **name); + /* Process the values returned by `dir_lookup' et al, and loop doing `dir_lookup' calls until one returns FS_RETRY_NONE. The arguments diff --git a/hurd/hurdlookup.c b/hurd/hurdlookup.c index 77de27150a..8270132b90 100644 --- a/hurd/hurdlookup.c +++ b/hurd/hurdlookup.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1992,93,94,95,96,97,99,2001,2004 +/* Copyright (C) 1992,1993,1994,1995,1996,1997,1999,2001,2004,2006 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -184,19 +184,7 @@ __hurd_directory_name_split (error_t (*use_init_port) --lastslash; /* Find the last one earlier in the string, before the trailing ones. */ -#if __GLIBC__ > 2 || __GLIBC_MINOR__ >= 2 lastslash = __memrchr (file_name, '/', lastslash - file_name); -#else - /* Keep backing up, looking for a slash. */ - do - if (lastslash == file_name) - { - /* Hit the start with no slash. */ - lastslash = NULL; - break; - } - while (*lastslash-- != '/'); -#endif } if (lastslash != NULL) diff --git a/hurd/lookup-at.c b/hurd/lookup-at.c new file mode 100644 index 0000000000..a2d50cb192 --- /dev/null +++ b/hurd/lookup-at.c @@ -0,0 +1,110 @@ +/* Lookup helper function for Hurd implementation of *at functions. + Copyright (C) 2006 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <hurd.h> +#include <hurd/lookup.h> +#include <hurd/fd.h> +#include <string.h> +#include <fcntl.h> + +file_t +__file_name_lookup_at (int fd, int at_flags, + const char *file_name, int flags, mode_t mode) +{ + error_t err; + file_t result; + + flags |= (at_flags & AT_SYMLINK_NOFOLLOW) ? O_NOLINK : 0; + at_flags &= ~AT_SYMLINK_NOFOLLOW; + if (at_flags != 0) + return __hurd_fail (EINVAL); + + if (fd == AT_FDCWD || file_name[0] == '/') + return __file_name_lookup (file_name, flags, mode); + + file_t 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))); + + return err ? (__hurd_dfail (fd, err), MACH_PORT_NULL) : result; +} + +file_t +__file_name_split_at (int fd, const char *file_name, char **name) +{ + error_t err; + file_t result; + + if (fd == AT_FDCWD || file_name[0] == '/') + return __file_name_split (file_name, name); + + err = __hurd_file_name_split (&_hurd_ports_use, &__getdport, 0, + file_name, &result, name); + + file_t 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_split (&use_init_port, + &__getdport, 0, + file_name, + &result, name))); + + return err ? (__hurd_dfail (fd, err), MACH_PORT_NULL) : result; +} + +file_t +__directory_name_split_at (int fd, const char *directory_name, char **name) +{ + error_t err; + file_t result; + + if (fd == AT_FDCWD || directory_name[0] == '/') + return __directory_name_split (directory_name, name); + + file_t 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_directory_name_split (&use_init_port, + &__getdport, 0, + directory_name, + &result, name))); + + return err ? (__hurd_dfail (fd, err), MACH_PORT_NULL) : result; +} |