X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fcompare.c;h=6a873d7b131949bbc05fcb9634e78f90179fef5f;hb=ecbcb7b6d74c2d69386c8d7e435486a4690c9993;hp=f3723049ed055b3b4ef7d96c5d5c23914b0ab9d8;hpb=7efe3850f6e058d33a46ef17cdc95df0469ed887;p=chaz%2Ftar diff --git a/src/compare.c b/src/compare.c index f372304..6a873d7 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, 2006, 2007 Free Software Foundation, Inc. + 2003, 2004, 2005, 2006, 2007, 2009, 2010 Free Software Foundation, Inc. Written by John Gilmore, on 1987-04-30. @@ -66,8 +66,7 @@ report_difference (struct tar_stat_info *st, const char *fmt, ...) fprintf (stdlis, "\n"); } - if (exit_status == TAREXIT_SUCCESS) - exit_status = TAREXIT_DIFFERS; + set_exit_status (TAREXIT_DIFFERS); } /* Take a buffer returned by read_and_process and do nothing with it. */ @@ -123,7 +122,7 @@ read_and_process (struct tar_stat_info *st, int (*processor) (size_t, char *)) size_t data_size; off_t size = st->stat.st_size; - mv_begin (st); + mv_begin_read (st); while (size) { data_block = find_next_block (); @@ -223,7 +222,9 @@ diff_file (void) ? O_NOATIME : 0); - diff_handle = open (file_name, O_RDONLY | O_BINARY | atime_flag); + diff_handle = open (file_name, + (O_RDONLY | O_BINARY | O_CLOEXEC | O_NOCTTY + | O_NONBLOCK | atime_flag)); if (diff_handle < 0) { @@ -242,10 +243,8 @@ 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, file_name, atime, 0) != 0) utime_error (file_name); } @@ -332,7 +331,7 @@ static int dumpdir_cmp (const char *a, const char *b) { size_t len; - + while (*a) switch (*a) { @@ -346,7 +345,7 @@ dumpdir_cmp (const char *a, const char *b) a += len; b += len; break; - + case 'D': if (strcmp(a, b)) return 1; @@ -354,7 +353,7 @@ dumpdir_cmp (const char *a, const char *b) a += len; b += len; break; - + case 'R': case 'T': case 'X': @@ -366,7 +365,7 @@ dumpdir_cmp (const char *a, const char *b) static void diff_dumpdir (void) { - char *dumpdir_buffer; + const char *dumpdir_buffer; dev_t dev = 0; struct stat stat_data; @@ -380,7 +379,7 @@ diff_dumpdir (void) else dev = stat_data.st_dev; - dumpdir_buffer = get_directory_contents (current_stat_info.file_name, dev); + dumpdir_buffer = directory_contents (scan_directory (¤t_stat_info)); if (dumpdir_buffer) { @@ -397,6 +396,10 @@ diff_multivol (void) struct stat stat_data; int fd, status; off_t offset; + int atime_flag = + (atime_preserve_option == system_atime_preserve + ? O_NOATIME + : 0); if (current_stat_info.had_trailing_slash) { @@ -422,7 +425,10 @@ diff_multivol (void) return; } - fd = open (current_stat_info.file_name, O_RDONLY | O_BINARY); + + fd = open (current_stat_info.file_name, + (O_RDONLY | O_BINARY | O_CLOEXEC | O_NOCTTY | O_NONBLOCK + | atime_flag)); if (fd < 0) { @@ -452,7 +458,6 @@ diff_archive (void) { set_next_block_after (current_header); - decode_header (current_header, ¤t_stat_info, ¤t_format, 1); /* Print the block from current_header and current_stat_info. */ @@ -460,7 +465,7 @@ diff_archive (void) { if (now_verifying) fprintf (stdlis, _("Verify ")); - print_header (¤t_stat_info, -1); + print_header (¤t_stat_info, current_header, -1); } switch (current_header->header.typeflag) @@ -578,7 +583,9 @@ verify_volume (void) flush_read (); while (1) { - enum read_header status = read_header (false); + enum read_header status = read_header (¤t_header, + ¤t_stat_info, + read_header_auto); if (status == HEADER_FAILURE) { @@ -588,7 +595,8 @@ verify_volume (void) { counter++; set_next_block_after (current_header); - status = read_header (false); + status = read_header (¤t_header, ¤t_stat_info, + read_header_auto); } while (status == HEADER_FAILURE); @@ -606,14 +614,16 @@ verify_volume (void) { char buf[UINTMAX_STRSIZE_BOUND]; - status = read_header (false); + status = read_header (¤t_header, ¤t_stat_info, + read_header_auto); if (status == HEADER_ZERO_BLOCK) break; - WARN ((0, 0, _("A lone zero block at %s"), - STRINGIFY_BIGINT (current_block_ordinal (), buf))); + WARNOPT (WARN_ALONE_ZERO_BLOCK, + (0, 0, _("A lone zero block at %s"), + STRINGIFY_BIGINT (current_block_ordinal (), buf))); } } - + diff_archive (); tar_stat_destroy (¤t_stat_info); }