Hurd: opendirat

This commit is contained in:
Thomas Schwinge 2012-05-10 15:23:51 -07:00 committed by Roland McGrath
parent edadcbd624
commit 80b4e5f3ef
2 changed files with 41 additions and 0 deletions

View File

@ -1,3 +1,7 @@
2012-05-10 Thomas Schwinge <thomas@schwinge.name>
* sysdeps/mach/hurd/opendir.c (__opendirat): New function.
2012-05-10 Samuel Thibault <samuel.thibault@ens-lyon.org>
* hurd/hurdchdir.c (_hurd_change_directory_port_from_name):

View File

@ -28,6 +28,7 @@
#include <stdio.h>
#include <hurd.h>
#include <hurd/fd.h>
#include <not-cancel.h>
#include "dirstream.h"
@ -67,10 +68,45 @@ _hurd_fd_opendir (struct hurd_fd *d)
}
DIR *
internal_function
__opendirat (int dfd, const char *name)
{
if (name[0] == '\0')
{
/* POSIX.1-1990 says an empty name gets ENOENT;
but `open' might like it fine. */
__set_errno (ENOENT);
return NULL;
}
int flags = O_RDONLY | O_NONBLOCK | O_DIRECTORY | O_CLOEXEC;
int fd;
#ifdef IS_IN_rtld
assert (dfd == AT_FDCWD);
fd = open_not_cancel_2 (name, flags);
#else
fd = openat_not_cancel_3 (dfd, name, flags);
#endif
if (fd < 0)
return NULL;
/* Extract the pointer to the descriptor structure. */
DIR *dirp = _hurd_fd_opendir (_hurd_fd_get (fd));
if (dirp == NULL)
__close (fd);
return dirp;
}
/* Open a directory stream on NAME. */
DIR *
__opendir (const char *name)
{
#if 0 /* TODO. */
return __opendirat (AT_FDCWD, name);
#else
if (name[0] == '\0')
{
/* POSIX.1-1990 says an empty name gets ENOENT;
@ -89,5 +125,6 @@ __opendir (const char *name)
__close (fd);
return dirp;
#endif
}
weak_alias (__opendir, opendir)