summaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps')
-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;