X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fincremen.c;h=354caf451a69a58704ddeec3b503c07657c9bc07;hb=5591fa407ab7b3d7155e67f90fa722eb1337f768;hp=d354efa2bde79a725a4ee4292228847664116c42;hpb=c9e7465642f8dc879ea589b628176e6c9b6656bf;p=chaz%2Ftar diff --git a/src/incremen.c b/src/incremen.c index d354efa..354caf4 100644 --- a/src/incremen.c +++ b/src/incremen.c @@ -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