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:
parent
2948fc64a6
commit
924b9ff68d
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue