]> Dogcows Code - chaz/tar/blobdiff - src/compare.c
* src/names.c: tar: fix bug with --one-file-system --listed-incremental
[chaz/tar] / src / compare.c
index 2a314dafa12473874b926a996d7feaaa1ffd9943..91ced57031925ddce030a4df2dc7f1d8decd4452 100644 (file)
@@ -151,7 +151,7 @@ read_and_process (struct tar_stat_info *st, int (*processor) (size_t, char *))
 static int
 get_stat_data (char const *file_name, struct stat *stat_data)
 {
-  int status = deref_stat (dereference_option, file_name, stat_data);
+  int status = deref_stat (file_name, stat_data);
 
   if (status != 0)
     {
@@ -217,12 +217,7 @@ diff_file (void)
        }
       else
        {
-         int atime_flag =
-           (atime_preserve_option == system_atime_preserve
-            ? O_NOATIME
-            : 0);
-
-         diff_handle = open (file_name, O_RDONLY | O_BINARY | atime_flag);
+         diff_handle = openat (chdir_fd, file_name, open_read_flags);
 
          if (diff_handle < 0)
            {
@@ -241,10 +236,9 @@ diff_file (void)
 
              if (atime_preserve_option == replace_atime_preserve)
                {
-                 struct timespec ts[2];
-                 ts[0] = get_stat_atime (&stat_data);
-                 ts[1] = get_stat_mtime (&stat_data);
-                 if (set_file_atime (diff_handle, file_name, ts) != 0)
+                 struct timespec atime = get_stat_atime (&stat_data);
+                 if (set_file_atime (diff_handle, chdir_fd, file_name, atime)
+                     != 0)
                    utime_error (file_name);
                }
 
@@ -277,7 +271,8 @@ diff_symlink (void)
   size_t len = strlen (current_stat_info.link_name);
   char *linkbuf = alloca (len + 1);
 
-  int status = readlink (current_stat_info.file_name, linkbuf, len + 1);
+  int status = readlinkat (chdir_fd, current_stat_info.file_name,
+                          linkbuf, len + 1);
 
   if (status < 0)
     {
@@ -369,7 +364,7 @@ diff_dumpdir (void)
   dev_t dev = 0;
   struct stat stat_data;
 
-  if (deref_stat (true, current_stat_info.file_name, &stat_data))
+  if (deref_stat (current_stat_info.file_name, &stat_data) != 0)
     {
       if (errno == ENOENT)
        stat_warn (current_stat_info.file_name);
@@ -379,8 +374,7 @@ diff_dumpdir (void)
   else
     dev = stat_data.st_dev;
 
-  dumpdir_buffer = directory_contents
-                    (scan_directory (current_stat_info.file_name, dev, false));
+  dumpdir_buffer = directory_contents (scan_directory (&current_stat_info));
 
   if (dumpdir_buffer)
     {
@@ -422,7 +416,8 @@ diff_multivol (void)
       return;
     }
 
-  fd = open (current_stat_info.file_name, O_RDONLY | O_BINARY);
+
+  fd = openat (chdir_fd, current_stat_info.file_name, open_read_flags);
 
   if (fd < 0)
     {
@@ -517,14 +512,23 @@ diff_archive (void)
 void
 verify_volume (void)
 {
+  int may_fail = 0;
   if (removed_prefixes_p ())
     {
       WARN((0, 0,
            _("Archive contains file names with leading prefixes removed.")));
+      may_fail = 1;
+    }
+  if (transform_program_p ())
+    {
       WARN((0, 0,
-           _("Verification may fail to locate original files.")));
+           _("Archive contains transformed file names.")));
+      may_fail = 1;
     }
-
+  if (may_fail)
+    WARN((0, 0,
+         _("Verification may fail to locate original files.")));
+  
   if (!diff_buffer)
     diff_init ();
 
@@ -616,8 +620,10 @@ verify_volume (void)
                       (0, 0, _("A lone zero block at %s"),
                        STRINGIFY_BIGINT (current_block_ordinal (), buf)));
             }
+         continue;
        }
 
+      decode_header (current_header, &current_stat_info, &current_format, 1);
       diff_archive ();
       tar_stat_destroy (&current_stat_info);
     }
This page took 0.027222 seconds and 4 git commands to generate.