X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fcompare.c;h=cb1f3a8bd2b0b94569067f74bdb6db82a520e679;hb=0d8e3249123ecf0175b60c7b43056ac811eb6921;hp=2163a29421770af2b50918d4a0f22fdf802b4676;hpb=445d95be07e497f6b1e3c94d20c5a80cfbf23af5;p=chaz%2Ftar diff --git a/src/compare.c b/src/compare.c index 2163a29..cb1f3a8 100644 --- a/src/compare.c +++ b/src/compare.c @@ -1,13 +1,13 @@ /* 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 Free Software Foundation, Inc. Written by John Gilmore, on 1987-04-30. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any later + Free Software Foundation; either version 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, but @@ -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. */ @@ -366,11 +365,11 @@ 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; + struct stat stat_data; - if (deref_stat (true, current_stat_info.file_name, &stat)) + if (deref_stat (true, current_stat_info.file_name, &stat_data)) { if (errno == ENOENT) stat_warn (current_stat_info.file_name); @@ -378,9 +377,10 @@ diff_dumpdir (void) stat_error (current_stat_info.file_name); } else - dev = stat.st_dev; + dev = stat_data.st_dev; - dumpdir_buffer = get_directory_contents (current_stat_info.file_name, dev); + dumpdir_buffer = directory_contents + (scan_directory (current_stat_info.file_name, dev, false)); if (dumpdir_buffer) { @@ -597,12 +597,26 @@ verify_volume (void) "VERIFY FAILURE: %d invalid headers detected", counter), counter)); } - if (status == HEADER_ZERO_BLOCK || status == HEADER_END_OF_FILE) + if (status == HEADER_END_OF_FILE) break; + if (status == HEADER_ZERO_BLOCK) + { + set_next_block_after (current_header); + if (!ignore_zeros_option) + { + char buf[UINTMAX_STRSIZE_BOUND]; + status = read_header (false); + if (status == HEADER_ZERO_BLOCK) + break; + 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); - xheader_destroy (&extended_header); } access_mode = ACCESS_WRITE;