diff --git a/NEWS b/NEWS index db7cae24..ae804416 100644 --- a/NEWS +++ b/NEWS @@ -18,7 +18,7 @@ modified while tar is creating an archive. In the new approach, tar maintains a cache of file descriptors to directories, so it uses more file descriptors than before, but it adjusts to system limits on the number of file descriptors. The new checks are implemented via -the openat, dirfd, fdopendir, fstatat, and readlinkat calls +the openat, fdopendir, fstatat, and readlinkat calls standardized by POSIX.1-2008. On an older system where these calls do not exist or do not return useful results, tar emulates the calls at some cost in efficiency and reliability. diff --git a/gnulib.modules b/gnulib.modules index 65309239..a595d902 100644 --- a/gnulib.modules +++ b/gnulib.modules @@ -8,7 +8,6 @@ argp-version-etc backupfile closeout configmake -dirfd dirname error exclude diff --git a/src/create.c b/src/create.c index 5e2171b5..9dc928d3 100644 --- a/src/create.c +++ b/src/create.c @@ -1263,49 +1263,10 @@ open_failure_recover (struct tar_stat_info const *dir) char * get_directory_entries (struct tar_stat_info *st) { - DIR *dirstream; - while (! (dirstream = fdopendir (st->fd)) && open_failure_recover (st)) - continue; - - if (! dirstream) - return 0; - else - { - char *entries = streamsavedir (dirstream); - int streamsavedir_errno = errno; - - int fd = dirfd (dirstream); - if (fd < 0) - { - /* The dirent.h implementation doesn't use file descriptors - for directory streams, so open the directory again. */ - char const *name = st->orig_file_name; - if (closedir (dirstream) != 0) - close_diag (name); - dirstream = 0; - fd = subfile_open (st->parent, - st->parent ? last_component (name) : name, - open_searchdir_flags); - if (fd < 0) - fd = - errno; - else - { - struct stat dirst; - if (! (fstat (fd, &dirst) == 0 - && st->stat.st_ino == dirst.st_ino - && st->stat.st_dev == dirst.st_dev)) - { - close (fd); - fd = - IMPOSTOR_ERRNO; - } - } - } - - st->fd = fd; - st->dirstream = dirstream; - errno = streamsavedir_errno; - return entries; - } + while (! (st->dirstream = fdopendir (st->fd))) + if (! open_failure_recover (st)) + return 0; + return streamsavedir (st->dirstream); } /* Dump the directory ST. Return true if successful, false (emitting