From e8f51d56d4c4b5839fee6af97b068f9fa02efd09 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Sat, 27 Feb 1999 20:06:34 +0000 Subject: 1999-02-27 Roland McGrath * sysdeps/mach/getsysstats.c (__get_nprocs_conf, __get_nprocs, __get_phys_pages): Cast &HBI to silence warning. * hurd/Makefile (routines): Add hurdchdir and hurdfchdir. * hurd/hurdchdir.c: New file. * hurd/hurdfchdir.c: New file. * sysdeps/mach/hurd/chroot.c: Call _hurd_change_directory_port_from_name to do the work. * sysdeps/mach/hurd/chdir.c: Likewise. * sysdeps/mach/hurd/fchdir.c: Call _hurd_change_directory_port_from_fd to do the work. * hurd/fchroot.c: Likewise. * hurd/hurd.h: Declare them. --- ChangeLog | 16 +++++++++++++ hurd/Makefile | 3 ++- hurd/fchroot.c | 23 +++---------------- hurd/hurd.h | 13 ++++++++++- hurd/hurdchdir.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++ hurd/hurdfchdir.c | 43 +++++++++++++++++++++++++++++++++++ sysdeps/mach/hurd/chdir.c | 16 +++---------- sysdeps/mach/hurd/chroot.c | 23 +++---------------- sysdeps/mach/hurd/fchdir.c | 18 +++------------ 9 files changed, 141 insertions(+), 70 deletions(-) create mode 100644 hurd/hurdchdir.c create mode 100644 hurd/hurdfchdir.c diff --git a/ChangeLog b/ChangeLog index ccafb25d20..f0e172e47e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +1999-02-27 Roland McGrath + + * sysdeps/mach/getsysstats.c (__get_nprocs_conf, __get_nprocs, + __get_phys_pages): Cast &HBI to silence warning. + + * hurd/Makefile (routines): Add hurdchdir and hurdfchdir. + * hurd/hurdchdir.c: New file. + * hurd/hurdfchdir.c: New file. + * sysdeps/mach/hurd/chroot.c: Call + _hurd_change_directory_port_from_name to do the work. + * sysdeps/mach/hurd/chdir.c: Likewise. + * sysdeps/mach/hurd/fchdir.c: Call + _hurd_change_directory_port_from_fd to do the work. + * hurd/fchroot.c: Likewise. + * hurd/hurd.h: Declare them. + 1999-02-27 Ulrich Drepper * elf/dl-load.c (lose): Add more comments to explain the `why'. diff --git a/hurd/Makefile b/hurd/Makefile index 07e22ebe1b..a9e63b93cf 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 143ea23807..cfb8ae339d 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 10036a9ecf..9ef6834776 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 0000000000..ce839a102f --- /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 +#include +#include +#include +#include +#include + +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 0000000000..efb705393e --- /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 +#include +#include +#include +#include +#include + +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; +} diff --git a/sysdeps/mach/hurd/chdir.c b/sysdeps/mach/hurd/chdir.c index 7e056b58f9..389aa2af0d 100644 --- a/sysdeps/mach/hurd/chdir.c +++ b/sysdeps/mach/hurd/chdir.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 92, 93, 94, 95, 97 Free Software Foundation, Inc. +/* Copyright (C) 1991,92,93,94,95,97,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 @@ -26,18 +26,8 @@ int __chdir (file_name) const char *file_name; { - file_t file, dir; - - file = __file_name_lookup (file_name, O_EXEC, 0); - if (file == MACH_PORT_NULL) - return -1; - dir = __file_name_lookup_under (file, "", O_EXEC, 0); - __mach_port_deallocate (__mach_task_self (), file); - if (dir == MACH_PORT_NULL) - return -1; - - _hurd_port_set (&_hurd_ports[INIT_PORT_CWDIR], dir); - return 0; + return _hurd_change_directory_port_from_name (&_hurd_ports[INIT_PORT_CWDIR], + file_name); } weak_alias (__chdir, chdir) diff --git a/sysdeps/mach/hurd/chroot.c b/sysdeps/mach/hurd/chroot.c index 03a3823681..d607146ddf 100644 --- a/sysdeps/mach/hurd/chroot.c +++ b/sysdeps/mach/hurd/chroot.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 92, 93, 94, 95, 97 Free Software Foundation, Inc. +/* Copyright (C) 1991,92,93,94,95,97,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 @@ -30,23 +30,6 @@ int chroot (file_name) const char *file_name; { - error_t err; - file_t file, dir, root; - - file = __file_name_lookup (file_name, O_EXEC, 0); - if (file == MACH_PORT_NULL) - return -1; - dir = __file_name_lookup_under (file, "", O_EXEC, 0); - __mach_port_deallocate (__mach_task_self (), file); - if (dir == MACH_PORT_NULL) - return -1; - - /* Prevent going through DIR's .. */ - err = __file_reparent (dir, MACH_PORT_NULL, &root); - __mach_port_deallocate (__mach_task_self (), dir); - if (err) - return __hurd_fail (err); - - _hurd_port_set (&_hurd_ports[INIT_PORT_CRDIR], root); - return 0; + return _hurd_change_directory_port_from_name (&_hurd_ports[INIT_PORT_CRDIR], + file_name); } diff --git a/sysdeps/mach/hurd/fchdir.c b/sysdeps/mach/hurd/fchdir.c index 71c8a5c265..bce8206ee6 100644 --- a/sysdeps/mach/hurd/fchdir.c +++ b/sysdeps/mach/hurd/fchdir.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc. +/* Copyright (C) 1991,92,93,94,95,96,97,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 @@ -21,7 +21,6 @@ #include #include #include -#include /* Change the current directory to FD. */ @@ -29,18 +28,7 @@ int __fchdir (fd) 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) - _hurd_port_set (&_hurd_ports[INIT_PORT_CWDIR], dir); - - return err ? __hurd_fail (err) : 0; + return _hurd_change_directory_port_from_fd (&_hurd_ports[INIT_PORT_CWDIR], + fd); } weak_alias (__fchdir, fchdir) -- cgit 1.4.1