From 22a1292a42facff7597f3336a91eea57db9709e6 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Sat, 25 Feb 1995 01:23:32 +0000 Subject: * io/Makefile (routines): Add euidaccess. * sysdeps/mach/hurd/euidaccess.c: New file. * sysdeps/stub/euidaccess.c: New file. * posix/unistd.h [__USE_GNU] (euidaccess): Declare it. * dirent/Makefile (routines): Add dirfd. * sysdeps/stub/dirfd.c: New file. * sysdeps/unix/dirfd.c: New file. * sysdeps/unix/dirstream.h (_DIR_dirfd): New macro. * dirent/dirent.h (dirfd): Declare new function. Define as macro _DIR_dirfd if that is defined. * sysdeps/mach/hurd/dirstream.h (DIR): Replace `__port' member with `void *__fd'. * sysdeps/mach/hurd/opendir.c: Use DIRP->__fd instead of DIRP->__port. Open the file with `open'; set FD_CLOEXEC on the fd. * sysdeps/mach/hurd/closedir.c: Likewise. * sysdeps/mach/hurd/readdir.c: Likewise. * sysdeps/mach/hurd/dirfd.c: New file. * posix/Makefile (glob/configure): Do cvs commit if there is a CVS directory. (glob/ChangeLog): Likewise. * locale/locale.h (LC_*): Use small integers instead of bit masks. --- sysdeps/mach/hurd/closedir.c | 16 ++++++------ sysdeps/mach/hurd/dirfd.c | 39 ++++++++++++++++++++++++++++ sysdeps/mach/hurd/dirstream.h | 5 ++-- sysdeps/mach/hurd/euidaccess.c | 58 ++++++++++++++++++++++++++++++++++++++++++ sysdeps/mach/hurd/opendir.c | 22 +++++++++++----- sysdeps/mach/hurd/readdir.c | 9 ++++--- sysdeps/stub/dirfd.c | 30 ++++++++++++++++++++++ sysdeps/stub/euidaccess.c | 38 +++++++++++++++++++++++++++ sysdeps/unix/dirfd.c | 28 ++++++++++++++++++++ sysdeps/unix/dirstream.h | 4 ++- 10 files changed, 227 insertions(+), 22 deletions(-) create mode 100644 sysdeps/mach/hurd/dirfd.c create mode 100644 sysdeps/mach/hurd/euidaccess.c create mode 100644 sysdeps/stub/dirfd.c create mode 100644 sysdeps/stub/euidaccess.c create mode 100644 sysdeps/unix/dirfd.c (limited to 'sysdeps') 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 +#include + +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 +#include +#include +#include + +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. */ diff --git a/sysdeps/stub/dirfd.c b/sysdeps/stub/dirfd.c new file mode 100644 index 0000000000..f6ebd04bca --- /dev/null +++ b/sysdeps/stub/dirfd.c @@ -0,0 +1,30 @@ +/* dirfd -- Return the file desciptor used by a DIR stream. Stub 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 +#include +#include + +int +dirfd (dirp) + FILE *dirp; +{ + errno = ENOSYS; + return -1; +} diff --git a/sysdeps/stub/euidaccess.c b/sysdeps/stub/euidaccess.c new file mode 100644 index 0000000000..1769e0dd17 --- /dev/null +++ b/sysdeps/stub/euidaccess.c @@ -0,0 +1,38 @@ +/* Test for access to FILE using effective UID and GID. Stub 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 +#include +#include + +int +euidaccess (file, type) + const char *file; + int type; +{ + if (file == NULL || (type & ~(R_OK|W_OK|X_OK|F_OK)) != 0) + { + errno = EINVAL; + return -1; + } + + errno = ENOSYS; + return -1; +} +stub_warning (euidaccess) diff --git a/sysdeps/unix/dirfd.c b/sysdeps/unix/dirfd.c new file mode 100644 index 0000000000..6b6f980a41 --- /dev/null +++ b/sysdeps/unix/dirfd.c @@ -0,0 +1,28 @@ +/* dirfd -- Return the file desciptor used by a DIR stream. Unix 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 +#include + +int +dirfd (dirp) + FILE *dirp; +{ + return dirp->__fd; +} diff --git a/sysdeps/unix/dirstream.h b/sysdeps/unix/dirstream.h index 20c4922fb9..d8c23959ad 100644 --- a/sysdeps/unix/dirstream.h +++ b/sysdeps/unix/dirstream.h @@ -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 @@ -40,4 +40,6 @@ typedef struct struct dirent __entry; /* Returned by `readdir'. */ } DIR; +#define _DIR_dirfd(dirp) ((dirp)->__fd) + #endif /* dirstream.h */ -- cgit v1.2.3