X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fcompare.c;h=9bcb260aa13e3bec502c9f82bf0607b0d6c03fb5;hb=31ef7e3afbe471f657e0023c8da17a32259ca95e;hp=cdbf9455e221b191b18b4fe1d4e2668451c5ae2f;hpb=52429bb9563d5b4bfece4cf9036ce9363e05996b;p=chaz%2Ftar diff --git a/src/compare.c b/src/compare.c index cdbf945..9bcb260 100644 --- a/src/compare.c +++ b/src/compare.c @@ -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. @@ -20,15 +20,14 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include +#include #if HAVE_LINUX_FD_H # include #endif -#include -#include - #include "common.h" +#include #include #include @@ -141,7 +140,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 +204,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 +225,27 @@ diff_file (void) if (!sys_compare_gid (&stat_data, ¤t_stat_info.stat)) report_difference (¤t_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 (¤t_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 (¤t_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 (¤t_stat_info, NULL); } @@ -253,18 +258,18 @@ diff_file (void) else read_and_process (¤t_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 +362,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 +424,7 @@ diff_multivol (void) } read_and_process (¤t_stat_info, process_rawdata); - + status = close (fd); if (status != 0) close_error (current_stat_info.file_name);