summaryrefslogtreecommitdiff
path: root/sysdeps/unix/opendir.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/opendir.c')
-rw-r--r--sysdeps/unix/opendir.c40
1 files changed, 15 insertions, 25 deletions
diff --git a/sysdeps/unix/opendir.c b/sysdeps/unix/opendir.c
index 6aa738fb69..5e03ed9b20 100644
--- a/sysdeps/unix/opendir.c
+++ b/sysdeps/unix/opendir.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991-1996,98,2000-2003,2005 Free Software Foundation, Inc.
+/* Copyright (C) 1991-1996,98,2000-2002, 2003 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
@@ -78,7 +78,11 @@ tryopen_o_directory (void)
DIR *
__opendir (const char *name)
{
+ DIR *dirp;
struct stat64 statbuf;
+ int fd;
+ size_t allocation;
+ int save_errno;
if (__builtin_expect (name[0], '\1') == '\0')
{
@@ -109,7 +113,7 @@ __opendir (const char *name)
}
}
- int fd = open_not_cancel_2 (name, O_RDONLY|O_NDELAY|EXTRA_FLAGS|O_LARGEFILE);
+ fd = open_not_cancel_2 (name, O_RDONLY|O_NDELAY|EXTRA_FLAGS|O_LARGEFILE);
if (__builtin_expect (fd, 0) < 0)
return NULL;
@@ -125,30 +129,18 @@ __opendir (const char *name)
{
if (__builtin_expect (! S_ISDIR (statbuf.st_mode), 0))
{
- __set_errno (ENOTDIR);
- lose:
- close_not_cancel_no_status (fd);
- return NULL;
+ save_errno = ENOTDIR;
+ goto lose;
}
}
- return __alloc_dir (fd, true, &statbuf);
-}
-weak_alias (__opendir, opendir)
-
-
-DIR *
-internal_function
-__alloc_dir (int fd, bool close_fd, const struct stat64 *statp)
-{
if (__builtin_expect (__fcntl (fd, F_SETFD, FD_CLOEXEC), 0) < 0)
goto lose;
- size_t allocation;
#ifdef _STATBUF_ST_BLKSIZE
- if (__builtin_expect ((size_t) statp->st_blksize >= sizeof (struct dirent64),
+ if (__builtin_expect ((size_t) statbuf.st_blksize >= sizeof (struct dirent64),
1))
- allocation = statp->st_blksize;
+ allocation = statbuf.st_blksize;
else
#endif
allocation = (BUFSIZ < sizeof (struct dirent64)
@@ -156,16 +148,13 @@ __alloc_dir (int fd, bool close_fd, const struct stat64 *statp)
const int pad = -sizeof (DIR) % __alignof__ (struct dirent64);
- DIR *dirp = (DIR *) malloc (sizeof (DIR) + allocation + pad);
+ dirp = (DIR *) malloc (sizeof (DIR) + allocation + pad);
if (dirp == NULL)
lose:
{
- if (close_fd)
- {
- int save_errno = errno;
- close_not_cancel_no_status (fd);
- __set_errno (save_errno);
- }
+ save_errno = errno;
+ close_not_cancel_no_status (fd);
+ __set_errno (save_errno);
return NULL;
}
memset (dirp, '\0', sizeof (DIR));
@@ -177,3 +166,4 @@ __alloc_dir (int fd, bool close_fd, const struct stat64 *statp)
return dirp;
}
+weak_alias (__opendir, opendir)