Mon Oct 16 03:22:37 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu> cvs/libc-951016
authorRoland McGrath <roland@gnu.org>
Mon, 16 Oct 1995 07:29:08 +0000 (07:29 +0000)
committerRoland McGrath <roland@gnu.org>
Mon, 16 Oct 1995 07:29:08 +0000 (07:29 +0000)
* 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).

ChangeLog
hurd/fchroot.c
hurd/hurdexec.c
stdlib/gmp-impl.h
sysdeps/mach/hurd/access.c
sysdeps/mach/hurd/bind.c
sysdeps/mach/hurd/fchdir.c
sysdeps/mach/hurd/getcwd.c

index 0f09756..20cc80e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Mon Oct 16 03:22:37 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+
+       * 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).
+
 Sun Oct 15 21:04:13 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
 
        * hurd/hurd/lookup.h: New file.
index 37163c0..26ff6d9 100644 (file)
@@ -20,6 +20,7 @@ Cambridge, MA 02139, USA.  */
 #include <unistd.h>
 #include <hurd.h>
 #include <hurd/fd.h>
+#include <fcntl.h>
 
 /* Change the current root directory to FD.  */
 int
index 2f38679..0ac18e4 100644 (file)
@@ -217,14 +217,14 @@ _hurd_exec (task_t task, file_t file,
          *pdp++ = dtable[i];
       }
 
-    err = __file_exec (file, task, MACH_MSG_TYPE_COPY_SEND,
+    err = __file_exec (file, task,
                       _hurd_exec_flags & EXEC_INHERITED,
-                      args, argslen, 0, env, envlen, 0,
-                      dtable, MACH_MSG_TYPE_COPY_SEND, dtablesize,  0,
-                      ports, MACH_MSG_TYPE_COPY_SEND, _hurd_nports, 0,
-                      ints, INIT_INT_MAX, 0,
-                      please_dealloc, pdp - please_dealloc, 0,
-                      NULL, 0, 0);
+                      args, argslen, env, envlen,
+                      dtable, MACH_MSG_TYPE_COPY_SEND, dtablesize,
+                      ports, MACH_MSG_TYPE_COPY_SEND, _hurd_nports,
+                      ints, INIT_INT_MAX,
+                      please_dealloc, pdp - please_dealloc,
+                      NULL, 0);
   }
 
   /* Release references to the standard ports.  */
index 48d3af9..0d2a8fc 100644 (file)
@@ -174,7 +174,6 @@ void _mp_default_free ();
     else                                                               \
       ____mpn_sqr_n (prodp, up, size, tspace);                         \
   } while (0);
-#define assert(trueval) do {if (!(trueval)) abort ();} while (0)
 
 /* Structure for conversion between internal binary format and
    strings in base 2..36.  */
index 9093806..d347463 100644 (file)
@@ -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);
 
index 2e3f5bf..907f445 100644 (file)
@@ -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);
 
index f643092..7c1be4f 100644 (file)
@@ -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
index caed104..b42e097 100644 (file)
@@ -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;