]> Dogcows Code - chaz/tar/blobdiff - src/incremen.c
Update
[chaz/tar] / src / incremen.c
index 269b4ce31c521a4780e8b139cd2094cbd0d19970..9e0bb547b2d127c63bb5b28c1fe07702b17220fe 100644 (file)
@@ -150,6 +150,7 @@ procdir (char *name_buffer, struct stat *stat_data,
 { 
   struct directory *directory;
   bool nfs = NFS_FILE_STAT (*stat_data);
+  struct name *np;
   
   if ((directory = find_directory (name_buffer)) != NULL)
     {
@@ -207,7 +208,7 @@ procdir (char *name_buffer, struct stat *stat_data,
      omit it... */
   if (one_file_system_option && device != stat_data->st_dev
       /* ... except if it was explicitely given in the command line */
-      && !name_scan (name_buffer))
+      && !((np = name_scan (name_buffer, true)) && np->explicit))
     directory->children = NO_CHILDREN;
   else if (children == ALL_CHILDREN)
     directory->children = ALL_CHILDREN;
@@ -635,8 +636,8 @@ write_directory_file (void)
 \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;
@@ -644,15 +645,13 @@ get_gnu_dumpdir ()
   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 (&current_stat_info);
+  mv_begin (stat_info);
 
   for (; size > 0; size -= copied)
     {
@@ -671,11 +670,21 @@ get_gnu_dumpdir ()
 
   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. */
@@ -685,7 +694,7 @@ purge_directory (char const *directory_name)
   char *current_dir;
   char *cur, *arc;
 
-  if (!current_stat_info.dumpdir)
+  if (!is_dumpdir (&current_stat_info))
     {
       skip_member ();
       return;
This page took 0.024758 seconds and 4 git commands to generate.