diff options
Diffstat (limited to 'hurd')
-rw-r--r-- | hurd/Makefile | 3 | ||||
-rw-r--r-- | hurd/fchroot.c | 23 | ||||
-rw-r--r-- | hurd/hurd.h | 13 | ||||
-rw-r--r-- | hurd/hurdchdir.c | 56 | ||||
-rw-r--r-- | hurd/hurdfchdir.c | 43 |
5 files changed, 116 insertions, 22 deletions
diff --git a/hurd/Makefile b/hurd/Makefile index 07e22eb..a9e63b9 100644 --- a/hurd/Makefile +++ b/hurd/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98 Free Software Foundation, Inc. +# Copyright (C) 1991,92,93,94,95,96,97,98,99 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 @@ -48,6 +48,7 @@ routines = hurdstartup hurdinit \ pid2task task2pid \ geteuids seteuids getumask fchroot \ hurdsock hurdauth \ + hurdchdir hurdfchdir \ privports \ msgportdemux \ fopenport \ diff --git a/hurd/fchroot.c b/hurd/fchroot.c index 143ea23..cfb8ae3 100644 --- a/hurd/fchroot.c +++ b/hurd/fchroot.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc. +/* Copyright (C) 1999 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 @@ -25,23 +25,6 @@ int fchroot (int fd) { - error_t err; - file_t dir; - - err = HURD_DPORT_USE (fd, - ({ - dir = __file_name_lookup_under (port, "", O_EXEC, 0); - dir == MACH_PORT_NULL ? errno : 0; - })); - - if (! err) - { - file_t root; - err = __file_reparent (dir, MACH_PORT_NULL, &root); - __mach_port_deallocate (__mach_task_self (), dir); - if (! err) - _hurd_port_set (&_hurd_ports[INIT_PORT_CRDIR], root); - } - - return err ? __hurd_fail (err) : 0; + return _hurd_change_directory_port_from_fd (&_hurd_ports[INIT_PORT_CRDIR], + fd); } diff --git a/hurd/hurd.h b/hurd/hurd.h index 10036a9..9ef6834 100644 --- a/hurd/hurd.h +++ b/hurd/hurd.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 94, 95, 96, 97, 98 Free Software Foundation, Inc. +/* Copyright (C) 1993,94,95,96,97,98,99 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 @@ -155,6 +155,17 @@ extern int setcttyid (mach_port_t); extern int __setauth (auth_t), setauth (auth_t); +/* Modify a port cell by looking up a directory name. + This verifies that it is a directory and that we have search permission. */ +extern int _hurd_change_directory_port_from_name (struct hurd_port *portcell, + const char *name); +/* Same thing, but using an open file descriptor. + Also verifies that it is a directory and that we have search permission. */ +extern int _hurd_change_directory_port_from_fd (struct hurd_port *portcell, + int fd); + + + /* Get and set the effective UID set. */ extern int geteuids (int __n, uid_t *__uidset); extern int seteuids (int __n, const uid_t *__uidset); diff --git a/hurd/hurdchdir.c b/hurd/hurdchdir.c new file mode 100644 index 0000000..ce839a1 --- /dev/null +++ b/hurd/hurdchdir.c @@ -0,0 +1,56 @@ +/* Change a port cell to a directory by looking up a name. + Copyright (C) 1999 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 + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <errno.h> +#include <unistd.h> +#include <hurd.h> +#include <hurd/port.h> +#include <hurd/fd.h> +#include <fcntl.h> + +int +_hurd_change_directory_port_from_name (struct hurd_port *portcell, + const char *name) +{ + size_t len; + const char *lookup; + file_t dir; + + /* Append trailing "/." to directory name to force ENOTDIR if it's not a + directory and EACCES if we don't have search permission. */ + len = strlen (name); + if (name[len - 2] == '/' && name[len - 1] == '.') + lookup = name; + else + { + char *n = alloca (len + 2); + memcpy (n, name, len); + n[len] = '/'; + n[len + 1] = '.'; + n[len + 2] = '\0'; + lookup = n; + } + + dir = __file_name_lookup (lookup, 0, 0); + if (dir == MACH_PORT_NULL) + return -1; + + _hurd_port_set (portcell, dir); + return 0; +} diff --git a/hurd/hurdfchdir.c b/hurd/hurdfchdir.c new file mode 100644 index 0000000..efb7053 --- /dev/null +++ b/hurd/hurdfchdir.c @@ -0,0 +1,43 @@ +/* Change a port cell to a directory in an open file descriptor. + Copyright (C) 1999 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 + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <errno.h> +#include <unistd.h> +#include <hurd.h> +#include <hurd/port.h> +#include <hurd/fd.h> +#include <fcntl.h> + +int +_hurd_change_directory_port_from_fd (struct hurd_port *portcell, int fd) +{ + error_t err; + file_t dir; + + err = HURD_DPORT_USE (fd, + ({ + dir = __file_name_lookup_under (port, ".", 0, 0); + dir == MACH_PORT_NULL ? errno : 0; + })); + + if (! err) + _hurd_port_set (portcell, dir); + + return err ? __hurd_fail (err) : 0; +} |