omit it... */
if (one_file_system_option && device != stat_data->st_dev
/* ... except if it was explicitely given in the command line */
- && !((np = name_scan (name_buffer)) && np->explicit))
+ && !((np = name_scan (name_buffer, true)) && np->explicit))
directory->children = NO_CHILDREN;
else if (children == ALL_CHILDREN)
directory->children = ALL_CHILDREN;
\f
/* Restoration of incremental dumps. */
-void
-get_gnu_dumpdir ()
+static void
+get_gnu_dumpdir (struct tar_stat_info *stat_info)
{
size_t size;
size_t copied;
char *to;
char *archive_dir;
- size = current_stat_info.stat.st_size;
- if (size != current_stat_info.stat.st_size)
- xalloc_die ();
+ size = stat_info->stat.st_size;
archive_dir = xmalloc (size);
to = archive_dir;
set_next_block_after (current_header);
- mv_begin (¤t_stat_info);
+ mv_begin (stat_info);
for (; size > 0; size -= copied)
{
mv_end ();
- current_stat_info.stat.st_size = 0; /* For skip_member() and friends
- to work correctly */
- current_stat_info.dumpdir = archive_dir;
+ stat_info->dumpdir = archive_dir;
+ stat_info->skipped = true; /* For skip_member() and friends
+ to work correctly */
}
+/* Return T if STAT_INFO represents a dumpdir archive member.
+ Note: can invalidate current_header. It happens if flush_archive()
+ gets called within get_gnu_dumpdir() */
+bool
+is_dumpdir (struct tar_stat_info *stat_info)
+{
+ if (stat_info->is_dumpdir && !stat_info->dumpdir)
+ get_gnu_dumpdir (stat_info);
+ return stat_info->is_dumpdir;
+}
/* Examine the directories under directory_name and delete any
files that were not there at the time of the back-up. */
char *current_dir;
char *cur, *arc;
- if (!current_stat_info.dumpdir)
+ if (!is_dumpdir (¤t_stat_info))
{
skip_member ();
return;