aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/mach/hurd
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/mach/hurd')
-rw-r--r--sysdeps/mach/hurd/closedir.c16
-rw-r--r--sysdeps/mach/hurd/dirfd.c39
-rw-r--r--sysdeps/mach/hurd/dirstream.h5
-rw-r--r--sysdeps/mach/hurd/euidaccess.c58
-rw-r--r--sysdeps/mach/hurd/opendir.c22
-rw-r--r--sysdeps/mach/hurd/readdir.c9
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. */