]> Dogcows Code - chaz/tar/blobdiff - src/create.c
tar: prefer openat-style functions
[chaz/tar] / src / create.c
index 5e2171b561917a74c2bde424a9eb7e0648c970a0..26993c21e5792be036be572e930a4887556b9b2b 100644 (file)
@@ -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
@@ -1384,7 +1345,8 @@ create_archive (void)
                    {
                      if (! st.orig_file_name)
                        {
-                         int fd = open (p->name, open_searchdir_flags);
+                         int fd = openat (chdir_fd, p->name,
+                                          open_searchdir_flags);
                          if (fd < 0)
                            {
                              open_diag (p->name);
@@ -1588,7 +1550,7 @@ subfile_open (struct tar_stat_info const *dir, char const *file, int flags)
       gettext ("");
     }
 
-  while ((fd = openat (dir ? dir->fd : AT_FDCWD, file, flags)) < 0
+  while ((fd = openat (dir ? dir->fd : chdir_fd, file, flags)) < 0
         && open_failure_recover (dir))
     continue;
   return fd;
@@ -1619,7 +1581,8 @@ restore_parent_fd (struct tar_stat_info const *st)
 
       if (parentfd < 0)
        {
-         int origfd = open (parent->orig_file_name, open_searchdir_flags);
+         int origfd = openat (chdir_fd, parent->orig_file_name,
+                              open_searchdir_flags);
          if (0 <= origfd)
            {
              if (fstat (parentfd, &parentstat) == 0
@@ -1649,13 +1612,12 @@ dump_file0 (struct tar_stat_info *st, char const *name, char const *p)
   char type;
   off_t original_size;
   struct timespec original_ctime;
-  struct timespec restore_times[2];
   off_t block_ordinal = -1;
   int fd = 0;
   bool is_dir;
   struct tar_stat_info const *parent = st->parent;
   bool top_level = ! parent;
-  int parentfd = top_level ? AT_FDCWD : parent->fd;
+  int parentfd = top_level ? chdir_fd : parent->fd;
   void (*diag) (char const *) = 0;
 
   if (interactive_option && !confirm ("add", p))
@@ -1693,8 +1655,8 @@ dump_file0 (struct tar_stat_info *st, char const *name, char const *p)
     }
 
   st->archive_file_size = original_size = st->stat.st_size;
-  st->atime = restore_times[0] = get_stat_atime (&st->stat);
-  st->mtime = restore_times[1] = get_stat_mtime (&st->stat);
+  st->atime = get_stat_atime (&st->stat);
+  st->mtime = get_stat_mtime (&st->stat);
   st->ctime = original_ctime = get_stat_ctime (&st->stat);
 
 #ifdef S_ISHIDDEN
@@ -1763,7 +1725,7 @@ dump_file0 (struct tar_stat_info *st, char const *name, char const *p)
          ok = dump_dir (st);
 
          fd = st->fd;
-         parentfd = top_level ? AT_FDCWD : parent->fd;
+         parentfd = top_level ? chdir_fd : parent->fd;
        }
       else
        {
@@ -1833,7 +1795,9 @@ dump_file0 (struct tar_stat_info *st, char const *name, char const *p)
              set_exit_status (TAREXIT_DIFFERS);
            }
          else if (atime_preserve_option == replace_atime_preserve
-                  && set_file_atime (fd, p, restore_times) != 0)
+                  && (set_file_atime (fd, parentfd, name,
+                                      st->atime, fstatat_flags)
+                      != 0))
            utime_error (p);
        }
 
This page took 0.022796 seconds and 4 git commands to generate.