/* 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.
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
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. */
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 ();
}
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 = open (file_name, open_read_flags);
if (diff_handle < 0)
{
dumpdir_cmp (const char *a, const char *b)
{
size_t len;
-
+
while (*a)
switch (*a)
{
a += len;
b += len;
break;
-
+
case 'D':
if (strcmp(a, b))
return 1;
a += len;
b += len;
break;
-
+
case 'R':
case 'T':
case 'X':
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);
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 (¤t_stat_info));
if (dumpdir_buffer)
{
return;
}
- fd = open (current_stat_info.file_name, O_RDONLY | O_BINARY);
+ fd = open (current_stat_info.file_name, open_read_flags);
if (fd < 0)
{
{
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. */
{
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)
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)
{
{
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);
"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 (¤t_header, ¤t_stat_info,
+ read_header_auto);
+ 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;