]> Dogcows Code - chaz/tar/blobdiff - src/compare.c
Minor fix
[chaz/tar] / src / compare.c
index cdbf9455e221b191b18b4fe1d4e2668451c5ae2f..c23601d97e400a26dd3658b3019d6d6ece10d3fa 100644 (file)
@@ -1,7 +1,7 @@
 /* Diff files from a tar archive.
 
    Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
-   2003, 2004, 2005 Free Software Foundation, Inc.
+   2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 
    Written by John Gilmore, on 1987-04-30.
 
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 #include <system.h>
+#include <system-ioctl.h>
 
 #if HAVE_LINUX_FD_H
 # include <linux/fd.h>
 #endif
 
-#include <quotearg.h>
-#include <utimens.h>
-
 #include "common.h"
+#include <quotearg.h>
 #include <rmt.h>
 #include <stdarg.h>
 
@@ -54,14 +53,13 @@ diff_init (void)
 /* Sigh about something that differs by writing a MESSAGE to stdlis,
    given MESSAGE is nonzero.  Also set the exit status if not already.  */
 void
-report_difference (struct tar_stat_info *st __attribute__ ((unused)),
-                  const char *fmt, ...)
+report_difference (struct tar_stat_info *st, const char *fmt, ...)
 {
   if (fmt)
     {
       va_list ap;
 
-      fprintf (stdlis, "%s: ", quotearg_colon (current_stat_info.file_name));
+      fprintf (stdlis, "%s: ", quotearg_colon (st->file_name));
       va_start (ap, fmt);
       vfprintf (stdlis, fmt, ap);
       va_end (ap);
@@ -141,7 +139,7 @@ read_and_process (struct tar_stat_info *st, int (*processor) (size_t, char *))
   union block *data_block;
   size_t data_size;
   size_t size = st->stat.st_size;
-  
+
   mv_begin (st);
   while (size)
     {
@@ -205,9 +203,10 @@ diff_dir (void)
 static void
 diff_file (void)
 {
+  char const *file_name = current_stat_info.file_name;
   struct stat stat_data;
 
-  if (!get_stat_data (current_stat_info.file_name, &stat_data))
+  if (!get_stat_data (file_name, &stat_data))
     skip_member ();
   else if (!S_ISREG (stat_data.st_mode))
     {
@@ -225,22 +224,27 @@ diff_file (void)
       if (!sys_compare_gid (&stat_data, &current_stat_info.stat))
        report_difference (&current_stat_info, _("Gid differs"));
 
-      if (tar_timespec_cmp (get_stat_mtime (&stat_data), 
+      if (tar_timespec_cmp (get_stat_mtime (&stat_data),
                             current_stat_info.mtime))
        report_difference (&current_stat_info, _("Mod time differs"));
-      if (current_header->header.typeflag != GNUTYPE_SPARSE &&
-         stat_data.st_size != current_stat_info.stat.st_size)
+      if (current_header->header.typeflag != GNUTYPE_SPARSE
+         && stat_data.st_size != current_stat_info.stat.st_size)
        {
          report_difference (&current_stat_info, _("Size differs"));
          skip_member ();
        }
       else
        {
-         diff_handle = open (current_stat_info.file_name, O_RDONLY | O_BINARY);
+         int atime_flag =
+           (atime_preserve_option == system_atime_preserve
+            ? O_NOATIME
+            : 0);
+
+         diff_handle = open (file_name, O_RDONLY | O_BINARY | atime_flag);
 
          if (diff_handle < 0)
            {
-             open_error (current_stat_info.file_name);
+             open_error (file_name);
              skip_member ();
              report_difference (&current_stat_info, NULL);
            }
@@ -253,18 +257,18 @@ diff_file (void)
              else
                read_and_process (&current_stat_info, process_rawdata);
 
-             status = close (diff_handle);
-             if (status != 0)
-               close_error (current_stat_info.file_name);
-
-             if (atime_preserve_option)
+             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 (utimens (current_stat_info.file_name, ts) != 0)
-                   utime_error (current_stat_info.file_name);
+                 if (set_file_atime (diff_handle, file_name, ts) != 0)
+                   utime_error (file_name);
                }
+
+             status = close (diff_handle);
+             if (status != 0)
+               close_error (file_name);
            }
        }
     }
@@ -357,7 +361,7 @@ diff_dumpdir (void)
     }
   else
     dev = stat.st_dev;
-      
+
   dumpdir_buffer = get_directory_contents (current_stat_info.file_name, dev);
 
   if (dumpdir_buffer)
@@ -419,7 +423,7 @@ diff_multivol (void)
     }
 
   read_and_process (&current_stat_info, process_rawdata);
-  
+
   status = close (fd);
   if (status != 0)
     close_error (current_stat_info.file_name);
This page took 0.024316 seconds and 4 git commands to generate.