summary refs log tree commit diff
path: root/hurd
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2006-03-06 07:59:23 +0000
committerRoland McGrath <roland@gnu.org>2006-03-06 07:59:23 +0000
commit16a10468376803c5e48ac9c14cfa1a1dd2f7ec8f (patch)
tree2e014adc76adfee74ff4580a1568017f6eae9299 /hurd
parent7d013a64de1cada889f3db5da793a7b965e87ac1 (diff)
downloadglibc-16a10468376803c5e48ac9c14cfa1a1dd2f7ec8f.tar.gz
glibc-16a10468376803c5e48ac9c14cfa1a1dd2f7ec8f.tar.xz
glibc-16a10468376803c5e48ac9c14cfa1a1dd2f7ec8f.zip
* sysdeps/mach/hurd/faccessat.c: New file.
	* sysdeps/mach/hurd/fchmodat.c: New file.
	* sysdeps/mach/hurd/fchownat.c: New file.
	* sysdeps/mach/hurd/fxstatat.c: New file.
	* sysdeps/mach/hurd/fxstatat64.c: New file.
	* sysdeps/mach/hurd/linkat.c: New file.
	* sysdeps/mach/hurd/mkdirat.c: New file.
	* sysdeps/mach/hurd/openat.c: New file.
	* sysdeps/mach/hurd/openat64.c: New file.
	* sysdeps/mach/hurd/symlinkat.c: New file.
	* sysdeps/mach/hurd/unlinkat.c: New file.
	* sysdeps/mach/hurd/xmknod.c (__xmknod): Just call __xmknodat.
	Guts move to ...
	* sysdeps/mach/hurd/xmknodat.c: ... here, new file.

	* hurd/lookup-at.c: New file.
	* hurd/Makefile (routines): Add it.
	* hurd/hurd/fd.h: Declare __file_name_lookup_at,
	__file_name_split_at and __directory_name_split_at.

	* hurd/hurd/lookup.h: Declare {,__}hurd_directory_name_split.

	* hurd/hurdlookup.c (__hurd_directory_name_split): Use __memrchr
	unconditionally.

	* sysdeps/mach/hurd/open.c: Define {,__,__libc_,}open64 as aliases.
	* sysdeps/mach/hurd/open64.c: New file.
Diffstat (limited to 'hurd')
-rw-r--r--hurd/Makefile4
-rw-r--r--hurd/hurd/fd.h18
-rw-r--r--hurd/hurd/lookup.h34
-rw-r--r--hurd/hurdlookup.c14
-rw-r--r--hurd/lookup-at.c110
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;
+}