diff options
Diffstat (limited to 'sysdeps/unix')
-rw-r--r-- | sysdeps/unix/opendir.c | 38 |
1 files changed, 16 insertions, 22 deletions
diff --git a/sysdeps/unix/opendir.c b/sysdeps/unix/opendir.c index 657ad17..067dc2c 100644 --- a/sysdeps/unix/opendir.c +++ b/sysdeps/unix/opendir.c @@ -30,26 +30,8 @@ #include <dirstream.h> -/* We want to be really safe the file we opened is a directory. Some systems - have support for this, others don't. */ -#ifdef O_DIRECTORY -# define OPENDIR(NAME) \ - do { \ - fd = __open (NAME, O_RDONLY|O_NDELAY|O_DIRECTORY); \ - if (fd < 0) \ - return NULL; \ - } while (0) -#else -# define OPENDIR(NAME) \ - do { \ - fd = __open (NAME, O_RDONLY|O_NDELAY); \ - if (fd < 0 || __fstat (fd, &statbuf) < 0 || ! S_ISDIR (statbuf.st_mode)) \ - { \ - if (fd >= 0) \ - __close (fd); \ - return NULL; \ - } \ - } while (0) +#ifndef O_DIRECTORY +# define O_DIRECTORY 0 #endif @@ -74,7 +56,7 @@ __opendir (const char *name) /* We first have to check whether the name is for a directory. We cannot do this after the open() call since the open/close operation performed on, say, a tape device might have undesirable effects. */ - if (stat (name, &statbuf) < 0) + if (__stat (name, &statbuf) < 0) return NULL; if (! S_ISDIR (statbuf.st_mode)) { @@ -82,7 +64,19 @@ __opendir (const char *name) return NULL; } - OPENDIR (name); + fd = __open (name, O_RDONLY|O_NDELAY|O_DIRECTORY); + if (fd < 0) + return NULL; + + /* Now make sure this really is a directory and nothing changed since + the `stat' call. */ + if (__fstat (fd, &statbuf) < 0) + goto lose; + if (! S_ISDIR (statbuf.st_mode)) + { + save_errno = ENOTDIR; + goto lose; + } if (__fcntl (fd, F_SETFD, FD_CLOEXEC) < 0) goto lose; |