about summary refs log tree commit diff
path: root/sysdeps/mach
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1995-10-16 07:29:08 +0000
committerRoland McGrath <roland@gnu.org>1995-10-16 07:29:08 +0000
commit924b9ff68db26697e50a298c3ae12159de259c2f (patch)
tree2374009a4bcd22360f0380b4974255461ab660fa /sysdeps/mach
parent2948fc64a6dd7aa23757daf2c5256dfe07f4c61a (diff)
downloadglibc-924b9ff68db26697e50a298c3ae12159de259c2f.tar.gz
glibc-924b9ff68db26697e50a298c3ae12159de259c2f.tar.xz
glibc-924b9ff68db26697e50a298c3ae12159de259c2f.zip
Mon Oct 16 03:22:37 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu> cvs/libc-951016
	* sysdeps/mach/hurd/getcwd.c: Use __file_name_lookup_under.
	* sysdeps/mach/hurd/bind.c: Likewise.
	* sysdeps/mach/hurd/access.c: Use new __hurd_file_name_lookup
	calling convention.

	* hurd/hurdexec.c: Undo last change (10 Oct 95).
Diffstat (limited to 'sysdeps/mach')
-rw-r--r--sysdeps/mach/hurd/access.c89
-rw-r--r--sysdeps/mach/hurd/bind.c34
-rw-r--r--sysdeps/mach/hurd/fchdir.c1
-rw-r--r--sysdeps/mach/hurd/getcwd.c34
4 files changed, 73 insertions, 85 deletions
diff --git a/sysdeps/mach/hurd/access.c b/sysdeps/mach/hurd/access.c
index 90938060e0..d347463426 100644
--- a/sysdeps/mach/hurd/access.c
+++ b/sysdeps/mach/hurd/access.c
@@ -21,6 +21,7 @@ Cambridge, MA 02139, USA.  */
 #include <hurd.h>
 #include <hurd/port.h>
 #include <hurd/id.h>
+#include <hurd/lookup.h>
 #include <fcntl.h>
 
 /* Test for access to FILE by our real user and group IDs.  */
@@ -28,10 +29,48 @@ int
 DEFUN(__access, (file, type), CONST char *file AND int type)
 {
   error_t err;
-  file_t crdir, cwdir, rcrdir, rcwdir, io;
-  struct hurd_userlink crdir_ulink, cwdir_ulink;
+  file_t rcrdir, rcwdir, io;
   int flags, allowed;
-  mach_port_t ref;
+
+  error_t reauthenticate (int which, file_t *result)
+    {
+      /* Get a port to our root directory, authenticated with the real IDs.  */
+      error_t err;
+      mach_port_t ref;
+      ref = __mach_reply_port ();
+      err = HURD_PORT_USE
+	(&_hurd_ports[which],
+	 ({
+	   err = __io_reauthenticate (port, ref, MACH_MSG_TYPE_MAKE_SEND);
+	   if (!err)
+	     err = __auth_user_authenticate (_hurd_id.rid_auth,
+					     port,
+					     ref, MACH_MSG_TYPE_MAKE_SEND,
+					     result);
+	   err;
+	 }));
+      __mach_port_destroy (__mach_task_self (), ref);
+      return err;
+    }
+
+  error_t init_port (int which, error_t (*operate) (mach_port_t))
+    {
+      switch (which)
+	{
+	case INIT_PORT_AUTH:
+	  return (*operate) (_hurd_id.rid_auth);
+	case INIT_PORT_CRDIR:
+	  return (reauthenticate (INIT_PORT_CRDIR, &rcrdir) ?:
+		  (*operate) (rcrdir));
+	case INIT_PORT_CWDIR:
+	  return (reauthenticate (INIT_PORT_CWDIR, &rcwdir) ?:
+		  (*operate) (rcwdir));
+	default:
+	  return _hurd_ports_use (which, operate);
+	}
+    }
+
+  rcrdir = rcwdir = MACH_PORT_NULL;
 
   HURD_CRITICAL_BEGIN;
 
@@ -67,34 +106,11 @@ DEFUN(__access, (file, type), CONST char *file AND int type)
 					    &_hurd_id.rid_auth)))
 	goto lose;
     }
-
-  /* Get a port to our root directory, authenticated with the real IDs.  */
-  crdir = _hurd_port_get (&_hurd_ports[INIT_PORT_CRDIR], &crdir_ulink);
-  ref = __mach_reply_port ();
-  err = __io_reauthenticate (crdir, ref, MACH_MSG_TYPE_MAKE_SEND);
+  
   if (!err)
-    err = __auth_user_authenticate (_hurd_id.rid_auth,
-				    crdir,
-				    ref, MACH_MSG_TYPE_MAKE_SEND,
-				    &rcrdir);
-  _hurd_port_free (&_hurd_ports[INIT_PORT_CRDIR], &crdir_ulink, crdir);
-  __mach_port_destroy (__mach_task_self (), ref);
-
-  if (!err)
-    {
-      /* Get a port to our current working directory, authenticated with
-         the real IDs.  */
-      cwdir = _hurd_port_get (&_hurd_ports[INIT_PORT_CWDIR], &cwdir_ulink);
-      ref = __mach_reply_port ();
-      err = __io_reauthenticate (cwdir, ref, MACH_MSG_TYPE_MAKE_SEND);
-      if (!err)
-	err = __auth_user_authenticate (_hurd_id.rid_auth,
-					cwdir,
-					ref, MACH_MSG_TYPE_MAKE_SEND,
-					&rcwdir);
-      _hurd_port_free (&_hurd_ports[INIT_PORT_CWDIR], &cwdir_ulink, cwdir);
-      __mach_port_destroy (__mach_task_self (), ref);
-    }
+    /* Look up the file name using the modified init ports.  */
+    err = __hurd_file_name_lookup (&init_port, &__getdport,
+				   file, 0, 0, &io);
 
   /* We are done with _hurd_id.rid_auth now.  */
  lose:
@@ -102,15 +118,10 @@ DEFUN(__access, (file, type), CONST char *file AND int type)
 
   HURD_CRITICAL_END;
 
-  if (err)
-    return __hurd_fail (err);
-
-  /* Now do a path lookup on FILE, using the crdir and cwdir
-     reauthenticated with _hurd_id.rid_auth.  */
-
-  err = __hurd_file_name_lookup (rcrdir, rcwdir, file, 0, 0, &io);
-  __mach_port_deallocate (__mach_task_self (), rcrdir);
-  __mach_port_deallocate (__mach_task_self (), rcwdir);
+  if (rcrdir != MACH_PORT_NULL)
+    __mach_port_deallocate (__mach_task_self (), rcrdir);
+  if (rcwdir != MACH_PORT_NULL)
+    __mach_port_deallocate (__mach_task_self (), rcwdir);
   if (err)
     return __hurd_fail (err);
 
diff --git a/sysdeps/mach/hurd/bind.c b/sysdeps/mach/hurd/bind.c
index 2e3f5bfb36..907f445751 100644
--- a/sysdeps/mach/hurd/bind.c
+++ b/sysdeps/mach/hurd/bind.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992, 1994 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 1994, 1995 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
@@ -65,40 +65,22 @@ DEFUN(bind, (fd, addr, len),
 	  if (! err)
 	    /* Link the node, now a socket, into the target directory.  */
 	    err = __dir_link (node, dir, n);
+	  __mach_port_deallocate (__mach_task_self (), node);
 	  if (! err)
-	    /* Get a port to the ifsock translator.  */
 	    {
-	      retry_type retry;
-	      string_t retry_name;
-
-	      err = __dir_lookup (dir, n, 0, 0, &retry, retry_name, &ifsock);
-
-	      if (! err && (retry != FS_RETRY_NORMAL || retry_name[0]))
-		/* Either someone has fucked with our new node, or the ifsock
-		   translator is acting very oddly.  */
+	      /* Get a port to the ifsock translator.  */
+	      ifsock = __file_name_lookup_under (dir, n, 0, 0);
+	      if (ifsock == MACH_PORT_NULL)
 		{
-		  struct hurd_userlink crdir_ulink;
-		  file_t crdir =
-		    _hurd_port_get (&_hurd_ports[INIT_PORT_CRDIR],
-				    &crdir_ulink);
-
-		  err = __hurd_file_name_lookup_retry (crdir,
-						       retry, retry_name, 0, 0,
-						       &ifsock);
-
-		  _hurd_port_free (&_hurd_ports[INIT_PORT_CRDIR],
-				   &crdir_ulink, crdir);
+		  err = errno;
+		  /* If we failed, get rid of the node we created.  */
+		  __dir_unlink (dir, n);
 		}
-
-	      if (err)
-		/* If we failed, get rid of the node we created.  */
-		__dir_unlink  (dir, n);
 	    }
 	  if (! err)
 	    /* Get the address port.  */
 	    err = __ifsock_getsockaddr (ifsock, &aport);
 	  __mach_port_deallocate (__mach_task_self (), ifsock);
-	  __mach_port_deallocate (__mach_task_self (), node);
 	}
       __mach_port_deallocate (__mach_task_self (), dir);
 
diff --git a/sysdeps/mach/hurd/fchdir.c b/sysdeps/mach/hurd/fchdir.c
index f643092377..7c1be4fdd3 100644
--- a/sysdeps/mach/hurd/fchdir.c
+++ b/sysdeps/mach/hurd/fchdir.c
@@ -22,6 +22,7 @@ Cambridge, MA 02139, USA.  */
 #include <hurd.h>
 #include <hurd/port.h>
 #include <hurd/fd.h>
+#include <fcntl.h>
 
 /* Change the current directory to FD.  */
 int
diff --git a/sysdeps/mach/hurd/getcwd.c b/sysdeps/mach/hurd/getcwd.c
index caed104bce..b42e0979a6 100644
--- a/sysdeps/mach/hurd/getcwd.c
+++ b/sysdeps/mach/hurd/getcwd.c
@@ -47,12 +47,9 @@ __getcwd (char *buf, size_t size)
   file_t parent;
   char *dirbuf = NULL;
   unsigned int dirbufsize = 0;
-  file_t crdir;
-  struct hurd_userlink crdir_ulink;
 
   inline void cleanup (void)
     {
-      _hurd_port_free (&_hurd_ports[INIT_PORT_CRDIR], &crdir_ulink, crdir);
       __mach_port_deallocate (__mach_task_self (), parent);
 
       if (dirbuf != NULL)
@@ -86,12 +83,8 @@ __getcwd (char *buf, size_t size)
 
   /* Get a port to our root directory and stat it.  */
 
-  crdir = _hurd_port_get (&_hurd_ports[INIT_PORT_CRDIR], &crdir_ulink);
-  if (err = __io_stat (crdir, &st))
-    {
-      _hurd_port_free (&_hurd_ports[INIT_PORT_CRDIR], &crdir_ulink, crdir);
-      return __hurd_fail (err), NULL;
-    }
+  if (err = __USEPORT (CRDIR, __io_stat (port, &st)))
+    return __hurd_fail (err), NULL;
   rootdev = st.st_dev;
   rootino = st.st_ino;
 
@@ -101,10 +94,7 @@ __getcwd (char *buf, size_t size)
 						    (parent = port),
 						    MACH_PORT_RIGHT_SEND,
 						    1)))
-    {
-      _hurd_port_free (&_hurd_ports[INIT_PORT_CRDIR], &crdir_ulink, crdir);
-      return __hurd_fail (err), NULL;
-    }
+    return __hurd_fail (err), NULL;
   if (err = __io_stat (parent, &st))
     {
       cleanup ();
@@ -130,14 +120,15 @@ __getcwd (char *buf, size_t size)
       int direntry, nentries;
 
       /* Look at the parent directory.  */
-      if (err = __hurd_file_name_lookup (crdir, parent, "..", O_READ, 0, &newp))
+      newp = __file_name_lookup_under (parent, "..", O_READ, 0);
+      if (newp == MACH_PORT_NULL)
 	goto lose;
       __mach_port_deallocate (__mach_task_self (), parent);
       parent = newp;
 
       /* Figure out if this directory is a mount point.  */
       if (err = __io_stat (parent, &st))
-	goto lose;
+	goto errlose;
       dotdev = st.st_dev;
       dotino = st.st_ino;
       mount_point = dotdev != thisdev;
@@ -184,14 +175,14 @@ __getcwd (char *buf, size_t size)
 
 	      if (mount_point || d->d_ino == thisino)
 		{
-		  file_t try;
-		  if (err = __hurd_file_name_lookup (crdir, parent, d->d_name,
-						     O_NOLINK, 0, &try))
+		  file_t try = __file_name_lookup_under (parent, d->d_name,
+							 O_NOLINK, 0);
+		  if (try == MACH_PORT_NULL)
 		    goto lose;
 		  err = __io_stat (try, &st);
 		  __mach_port_deallocate (__mach_task_self (), try);
 		  if (err)
-		    goto lose;
+		    goto errlose;
 		  if (st.st_dev == thisdev && st.st_ino == thisino)
 		    break;
 		}
@@ -199,7 +190,7 @@ __getcwd (char *buf, size_t size)
 	}
 
       if (err)
-	goto lose;
+	goto errlose;
       else
 	{
 	  /* Prepend the directory name just discovered.  */
@@ -244,6 +235,9 @@ __getcwd (char *buf, size_t size)
   cleanup ();
   return file_name;
 
+ errlose:
+  /* Set errno.  */
+  (void) __hurd_fail (err);
  lose:
   cleanup ();
   return NULL;