diff options
Diffstat (limited to 'sysdeps/mach/hurd')
-rw-r--r-- | sysdeps/mach/hurd/closedir.c | 16 | ||||
-rw-r--r-- | sysdeps/mach/hurd/dirfd.c | 39 | ||||
-rw-r--r-- | sysdeps/mach/hurd/dirstream.h | 5 | ||||
-rw-r--r-- | sysdeps/mach/hurd/euidaccess.c | 58 | ||||
-rw-r--r-- | sysdeps/mach/hurd/opendir.c | 22 | ||||
-rw-r--r-- | sysdeps/mach/hurd/readdir.c | 9 |
6 files changed, 128 insertions, 21 deletions
diff --git a/sysdeps/mach/hurd/closedir.c b/sysdeps/mach/hurd/closedir.c index 9d20621747..bb970aed9e 100644 --- a/sysdeps/mach/hurd/closedir.c +++ b/sysdeps/mach/hurd/closedir.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1993 Free Software Foundation, Inc. +/* Copyright (C) 1993, 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 @@ -37,13 +37,13 @@ DEFUN(closedir, (dirp), DIR *dirp) return -1; } - if ((err = __vm_deallocate (__mach_task_self (), - (vm_address_t) dirp->__data, dirp->__allocation)) - || (err = __mach_port_deallocate (__mach_task_self (), dirp->__port))) - { - errno = err; - return -1; - } + if (err = __vm_deallocate (__mach_task_self (), + (vm_address_t) dirp->__data, dirp->__allocation)) + return __hurd_fail (err); + dirp->__data = NULL; + + if (err = _hurd_fd_close (dirp->__fd)) + return __hurd_fail (err); free (dirp); diff --git a/sysdeps/mach/hurd/dirfd.c b/sysdeps/mach/hurd/dirfd.c new file mode 100644 index 0000000000..366a34079b --- /dev/null +++ b/sysdeps/mach/hurd/dirfd.c @@ -0,0 +1,39 @@ +/* dirfd -- Return the file desciptor used by a DIR stream. Hurd version. +Copyright (C) 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 +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., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <dirent.h> +#include <dirstream.h> + +int +dirfd (DIR *dirp) +{ + int fd; + __mutex_lock (&_hurd_dtable_lock); + for (fd = 0; fd < _hurd_dtablesize; ++fd) + if (_hurd_dtable[fd] == dirp->__fd) + break; + if (fd == _hurd_dtablesize) + { + errno = EINVAL + fd = -1; + } + __mutex_unlock (&_hurd_dtable_lock); + + return fd; +} diff --git a/sysdeps/mach/hurd/dirstream.h b/sysdeps/mach/hurd/dirstream.h index 0bcec36f0f..42bbd07c4f 100644 --- a/sysdeps/mach/hurd/dirstream.h +++ b/sysdeps/mach/hurd/dirstream.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1994 Free Software Foundation, Inc. +/* Copyright (C) 1993, 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 @@ -27,8 +27,7 @@ Cambridge, MA 02139, USA. */ typedef struct { - /* XXX we need a namespace-clean name for mach_port_t! */ - unsigned int __port; /* Port to the directory. */ + void *__fd; /* `struct hurd_fd' pointer for descriptor. */ char *__data; /* Directory block. */ int __entry_data; /* Entry number `__data' corresponds to. */ char *__ptr; /* Current pointer into the block. */ diff --git a/sysdeps/mach/hurd/euidaccess.c b/sysdeps/mach/hurd/euidaccess.c new file mode 100644 index 0000000000..5ba2af4965 --- /dev/null +++ b/sysdeps/mach/hurd/euidaccess.c @@ -0,0 +1,58 @@ +/* Test for access to FILE using effective UID and GID. Hurd version. +Copyright (C) 1991, 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 +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., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#include <errno.h> +#include <stddef.h> +#include <unistd.h> +#include <hurd.h> + +int +euidaccess (file, type) + const char *file; + int type; +{ + file_t port; + int allowed, flags; + + port = __file_name_lookup (file, 0, 0); + if (port == MACH_PORT_NULL) + return -1; + + /* Find out what types of access we are allowed to this file. */ + err = __file_check_access (file, &allowed); + __mach_port_deallocate (__mach_task_self (), file); + if (err) + return __hurd_fail (err); + + flags = 0; + if (type & R_OK) + flags |= O_READ; + if (type & W_OK) + flags |= O_WRITE; + if (type & X_OK) + flags |= O_EXEC; + + if (flags & ~allowed) + /* We are not allowed all the requested types of access. */ + return __hurd_fail (EACCES); + + return 0; +} + +weak_alias (__access, access) diff --git a/sysdeps/mach/hurd/opendir.c b/sysdeps/mach/hurd/opendir.c index d843da8aeb..001016d087 100644 --- a/sysdeps/mach/hurd/opendir.c +++ b/sysdeps/mach/hurd/opendir.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1994 Free Software Foundation, Inc. +/* Copyright (C) 1993, 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 @@ -36,21 +36,29 @@ DEFUN(opendir, (name), CONST char *name) { DIR *dirp; file_t port; + int fd; - port = __file_name_lookup (name, O_RDONLY, 0); - if (port == MACH_PORT_NULL) + fd = __open (name, O_RDONLY); + if (fd < 0) return NULL; - /* XXX this port should be deallocated on exec */ - dirp = (DIR *) malloc (sizeof (DIR)); if (dirp == NULL) { - __mach_port_deallocate (__mach_task_self (), port); + __close (fd); return NULL; } - dirp->__port = port; + /* Extract the pointer to the descriptor structure. */ + __mutex_lock (&_hurd_dtable_lock); + dirp->__fd = _hurd_dtable[fd]; + __mutex_unlock (&_hurd_dtable_lock); + + /* Set the descriptor to close on exec. */ + __spin_lock (&dirp->__fd->port.lock); + dirp->__fd->flags |= FD_CLOEXEC; + __spin_unlock (&dirp->__fd->port.lock); + dirp->__data = dirp->__ptr = NULL; dirp->__entry_data = dirp->__entry_ptr = 0; dirp->__allocation = 0; diff --git a/sysdeps/mach/hurd/readdir.c b/sysdeps/mach/hurd/readdir.c index 185aeee2b1..9e9f1ae3bd 100644 --- a/sysdeps/mach/hurd/readdir.c +++ b/sysdeps/mach/hurd/readdir.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1994 Free Software Foundation, Inc. +/* Copyright (C) 1993, 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 @@ -49,8 +49,11 @@ DEFUN(readdir, (dirp), DIR *dirp) int nentries; error_t err; - if (err = __dir_readdir (dirp->__port, &data, &dirp->__size, - dirp->__entry_ptr, -1, 0, &nentries)) + if (err = HURD_FD_PORT_USE (dirp->__fd, + __dir_readdir (dirp->__port, + &data, &dirp->__size, + dirp->__entry_ptr, + -1, 0, &nentries))) return __hurd_fail (err), NULL; /* DATA now corresponds to entry index DIRP->__entry_ptr. */ |