From 924b9ff68db26697e50a298c3ae12159de259c2f Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Mon, 16 Oct 1995 07:29:08 +0000 Subject: Mon Oct 16 03:22:37 1995 Roland McGrath * 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 | 9 +++++ hurd/fchroot.c | 1 + hurd/hurdexec.c | 14 ++++---- stdlib/gmp-impl.h | 1 - sysdeps/mach/hurd/access.c | 89 ++++++++++++++++++++++++++-------------------- sysdeps/mach/hurd/bind.c | 34 +++++------------- sysdeps/mach/hurd/fchdir.c | 1 + sysdeps/mach/hurd/getcwd.c | 34 ++++++++---------- 8 files changed, 90 insertions(+), 93 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0f09756245..20cc80e688 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Mon Oct 16 03:22:37 1995 Roland McGrath + + * 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 * hurd/hurd/lookup.h: New file. diff --git a/hurd/fchroot.c b/hurd/fchroot.c index 37163c0277..26ff6d9081 100644 --- a/hurd/fchroot.c +++ b/hurd/fchroot.c @@ -20,6 +20,7 @@ Cambridge, MA 02139, USA. */ #include #include #include +#include /* Change the current root directory to FD. */ int diff --git a/hurd/hurdexec.c b/hurd/hurdexec.c index 2f38679ff2..0ac18e42da 100644 --- a/hurd/hurdexec.c +++ b/hurd/hurdexec.c @@ -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. */ diff --git a/stdlib/gmp-impl.h b/stdlib/gmp-impl.h index 48d3af9761..0d2a8fcede 100644 --- a/stdlib/gmp-impl.h +++ b/stdlib/gmp-impl.h @@ -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. */ 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 #include #include +#include #include /* 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 #include #include +#include /* 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; -- cgit v1.2.3