|
@@ -359,31 +359,47 @@ dumpdir_cmp (const char *a, const char *b)
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
static void
|
|
-diff_dumpdir (void)
|
|
|
|
|
|
+diff_dumpdir (struct tar_stat_info *dir)
|
|
{
|
|
{
|
|
const char *dumpdir_buffer;
|
|
const char *dumpdir_buffer;
|
|
dev_t dev = 0;
|
|
dev_t dev = 0;
|
|
struct stat stat_data;
|
|
struct stat stat_data;
|
|
|
|
|
|
- if (deref_stat (current_stat_info.file_name, &stat_data) != 0)
|
|
|
|
|
|
+ if (deref_stat (dir->file_name, &stat_data) != 0)
|
|
{
|
|
{
|
|
if (errno == ENOENT)
|
|
if (errno == ENOENT)
|
|
- stat_warn (current_stat_info.file_name);
|
|
|
|
|
|
+ stat_warn (dir->file_name);
|
|
else
|
|
else
|
|
- stat_error (current_stat_info.file_name);
|
|
|
|
|
|
+ stat_error (dir->file_name);
|
|
}
|
|
}
|
|
else
|
|
else
|
|
dev = stat_data.st_dev;
|
|
dev = stat_data.st_dev;
|
|
|
|
|
|
- dumpdir_buffer = directory_contents (scan_directory (¤t_stat_info));
|
|
|
|
|
|
+ if (dir->fd == 0)
|
|
|
|
+ {
|
|
|
|
+ void (*diag) (char const *) = NULL;
|
|
|
|
+ int fd = subfile_open (dir->parent, dir->orig_file_name, open_read_flags);
|
|
|
|
+ if (fd < 0)
|
|
|
|
+ diag = open_diag;
|
|
|
|
+ else if (fstat (fd, &dir->stat))
|
|
|
|
+ diag = stat_diag;
|
|
|
|
+ else
|
|
|
|
+ dir->fd = fd;
|
|
|
|
+ if (diag)
|
|
|
|
+ {
|
|
|
|
+ file_removed_diag (dir->orig_file_name, false, diag);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ dumpdir_buffer = directory_contents (scan_directory (dir));
|
|
|
|
|
|
if (dumpdir_buffer)
|
|
if (dumpdir_buffer)
|
|
{
|
|
{
|
|
- if (dumpdir_cmp (current_stat_info.dumpdir, dumpdir_buffer))
|
|
|
|
- report_difference (¤t_stat_info, _("Contents differ"));
|
|
|
|
|
|
+ if (dumpdir_cmp (dir->dumpdir, dumpdir_buffer))
|
|
|
|
+ report_difference (dir, _("Contents differ"));
|
|
}
|
|
}
|
|
else
|
|
else
|
|
- read_and_process (¤t_stat_info, process_noop);
|
|
|
|
|
|
+ read_and_process (dir, process_noop);
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
static void
|
|
@@ -446,7 +462,7 @@ diff_multivol (void)
|
|
void
|
|
void
|
|
diff_archive (void)
|
|
diff_archive (void)
|
|
{
|
|
{
|
|
-
|
|
|
|
|
|
+
|
|
set_next_block_after (current_header);
|
|
set_next_block_after (current_header);
|
|
|
|
|
|
/* Print the block from current_header and current_stat_info. */
|
|
/* Print the block from current_header and current_stat_info. */
|
|
@@ -498,7 +514,7 @@ diff_archive (void)
|
|
case GNUTYPE_DUMPDIR:
|
|
case GNUTYPE_DUMPDIR:
|
|
case DIRTYPE:
|
|
case DIRTYPE:
|
|
if (is_dumpdir (¤t_stat_info))
|
|
if (is_dumpdir (¤t_stat_info))
|
|
- diff_dumpdir ();
|
|
|
|
|
|
+ diff_dumpdir (¤t_stat_info);
|
|
diff_dir ();
|
|
diff_dir ();
|
|
break;
|
|
break;
|
|
|
|
|
|
@@ -530,6 +546,8 @@ verify_volume (void)
|
|
WARN((0, 0,
|
|
WARN((0, 0,
|
|
_("Verification may fail to locate original files.")));
|
|
_("Verification may fail to locate original files.")));
|
|
|
|
|
|
|
|
+ clear_directory_table ();
|
|
|
|
+
|
|
if (!diff_buffer)
|
|
if (!diff_buffer)
|
|
diff_init ();
|
|
diff_init ();
|
|
|
|
|