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).
This commit is contained in:
Roland McGrath 1995-10-16 07:29:08 +00:00
parent 2948fc64a6
commit 924b9ff68d
8 changed files with 90 additions and 93 deletions

View File

@ -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.

View 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

View 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. */

View 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. */

View 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);

View 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);

View 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

View 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;