size_left),
quotearg_colon (st->orig_file_name),
STRINGIFY_BIGINT (size_left, buf)));
- if (! ignore_failed_read_option)
- exit_status = TAREXIT_FAILURE;
+ if (! ignore_failed_read_option)
+ exit_status = TAREXIT_DIFFERS;
pad_archive (size_left - (bufsize-count));
return dump_status_short;
}
{
union block *header;
char type;
+ off_t original_size;
struct timespec original_ctime;
struct timespec restore_times[2];
off_t block_ordinal = -1;
stat_diag (p);
return;
}
- st->archive_file_size = st->stat.st_size;
+ st->archive_file_size = original_size = st->stat.st_size;
st->atime = restore_times[0] = get_stat_atime (&st->stat);
st->mtime = restore_times[1] = get_stat_mtime (&st->stat);
st->ctime = original_ctime = get_stat_ctime (&st->stat);
if (ok)
{
- if (timespec_cmp (get_stat_ctime (&final_stat), original_ctime) != 0)
- WARN ((0, 0, _("%s: file changed as we read it"),
- quotearg_colon (p)));
+ if (timespec_cmp (get_stat_ctime (&final_stat), original_ctime) != 0
+ || original_size < final_stat.st_size)
+ {
+ WARN ((0, 0, _("%s: file changed as we read it"),
+ quotearg_colon (p)));
+ if (exit_status == TAREXIT_SUCCESS)
+ exit_status = TAREXIT_DIFFERS;
+ }
else if (atime_preserve_option == replace_atime_preserve
&& set_file_atime (fd, p, restore_times) != 0)
utime_error (p);