/* 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.
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 ();
static int
get_stat_data (char const *file_name, struct stat *stat_data)
{
- int status = deref_stat (dereference_option, file_name, stat_data);
+ int status = deref_stat (file_name, stat_data);
if (status != 0)
{
}
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 = openat (chdir_fd, file_name, open_read_flags);
if (diff_handle < 0)
{
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, chdir_fd, file_name, atime)
+ != 0)
utime_error (file_name);
}
size_t len = strlen (current_stat_info.link_name);
char *linkbuf = alloca (len + 1);
- int status = readlink (current_stat_info.file_name, linkbuf, len + 1);
+ int status = readlinkat (chdir_fd, current_stat_info.file_name,
+ linkbuf, len + 1);
if (status < 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':
dev_t dev = 0;
struct stat stat_data;
- if (deref_stat (true, current_stat_info.file_name, &stat_data))
+ if (deref_stat (current_stat_info.file_name, &stat_data) != 0)
{
if (errno == ENOENT)
stat_warn (current_stat_info.file_name);
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)
{
return;
}
- fd = open (current_stat_info.file_name, O_RDONLY | O_BINARY);
+
+ fd = openat (chdir_fd, 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);
{
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);
}