]> Dogcows Code - chaz/tar/blobdiff - src/extract.c
Fix extraction from concatenated incremental archives.
[chaz/tar] / src / extract.c
index ca25603a45b5570b284f976d02addaf32c98427c..5aaeb1bf603192d01693f330043f3225a2e52690 100644 (file)
@@ -537,6 +537,38 @@ repair_delayed_set_stat (char const *dir,
          quotearg_colon (dir)));
 }
 
+static void
+free_delayed_set_stat (struct delayed_set_stat *data)
+{
+  xheader_xattr_free (data->xattr_map, data->xattr_map_size);
+  free (data->cntx_name);
+  free (data->acls_a_ptr);
+  free (data->acls_d_ptr);
+  free (data);
+}
+
+void
+remove_delayed_set_stat (const char *fname)
+{
+  struct delayed_set_stat *data, *next, *prev = NULL;
+  for (data = delayed_set_stat_head; data; data = next)
+    {
+      next = data->next;
+      if (chdir_current == data->change_dir
+         && strcmp (data->file_name, fname) == 0)
+       {
+         free_delayed_set_stat (data);
+         if (prev)
+           prev->next = next;
+         else
+           delayed_set_stat_head = next;
+         return;
+       }
+      else
+       prev = data;
+    }
+}
+
 /* After a file/link/directory creation has failed, see if
    it's because some required directory was not present, and if so,
    create all required directories.  Return zero if all the required
@@ -846,11 +878,7 @@ apply_nonancestor_delayed_set_stat (char const *file_name, bool after_links)
        }
 
       delayed_set_stat_head = data->next;
-      xheader_xattr_free (data->xattr_map, data->xattr_map_size);
-      free (data->cntx_name);
-      free (data->acls_a_ptr);
-      free (data->acls_d_ptr);
-      free (data);
+      free_delayed_set_stat (data);
     }
 }
 
This page took 0.018447 seconds and 4 git commands to generate.