]> Dogcows Code - chaz/tar/blobdiff - src/incremen.c
(print_header): Update displayable name selection.
[chaz/tar] / src / incremen.c
index d354efa2bde79a725a4ee4292228847664116c42..354caf451a69a58704ddeec3b503c07657c9bc07 100644 (file)
@@ -119,10 +119,12 @@ make_directory (const char *name)
   size_t namelen = strlen (name);
   size_t size = offsetof (struct directory, name) + namelen + 1;
   struct directory *directory = xmalloc (size);
+  directory->contents = directory->icontents = NULL;
+  directory->orig = NULL;
+  directory->flags = false;
   strcpy (directory->name, name);
   if (ISSLASH (directory->name[namelen-1]))
     directory->name[namelen-1] = 0;
-  directory->flags = false;
   return directory;
 }
   
@@ -196,9 +198,10 @@ find_directory_meta (dev_t dev, ino_t ino)
   else
     {
       struct directory *dir = make_directory ("");
+      struct directory *ret;
       dir->device_number = dev;
       dir->inode_number = ino;
-      struct directory *ret = hash_lookup (directory_meta_table, dir);
+      ret = hash_lookup (directory_meta_table, dir);
       free (dir);
       return ret;
     }
@@ -1219,13 +1222,16 @@ purge_directory (char const *directory_name)
   p = NULL;
   for (cur = current_dir; *cur; cur += strlen (cur) + 1)
     {
-      if (!dumpdir_locate (current_stat_info.dumpdir, cur))
-       {
-         struct stat st;
-         if (p)
-           free (p);
-         p = new_name (directory_name, cur);
+      const char *entry;
+      struct stat st;
+      if (p)
+       free (p);
+      p = new_name (directory_name, cur);
 
+      if (!(entry = dumpdir_locate (current_stat_info.dumpdir, cur))
+         || (*entry == 'D' && S_ISDIR (st.st_mode))
+         || (*entry == 'Y' && !S_ISDIR (st.st_mode)))
+       {
          if (deref_stat (false, p, &st))
            {
              if (errno != ENOENT) /* FIXME: Maybe keep a list of renamed
This page took 0.020609 seconds and 4 git commands to generate.