summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2010-09-13 13:12:54 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2010-09-13 13:13:08 -0700
commit0fb3020da0b2c3c6a15b3785f3900cbcf444c2ff (patch)
tree43bdaa0c01d7e436301d45cf338aaf7a9613d7d8
parentd7db30d0e80997b15cd3c976f612b08d95d091e9 (diff)
downloadtar-0fb3020da0b2c3c6a15b3785f3900cbcf444c2ff.tar.gz
tar: don't worry about fdopendir closing its argument
* NEWS: Don't mention dirfd; no longer needed. * gnulib.modules: Remove dirfd. * src/create.c (get_directory_entries): Remove the code dealing with dirfd failures, as the new fdopendir replacement doesn't close its argument so we don't need to call dirfd. See <http://lists.gnu.org/archive/html/bug-gnulib/2010-09/msg00208.html> and gnulib commit 970c9038e4cca46e1b037ae0a6d574dfae6a7327.
-rw-r--r--NEWS2
-rw-r--r--gnulib.modules1
-rw-r--r--src/create.c47
3 files changed, 5 insertions, 45 deletions
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