#ifndef lint
static const char rcsid[] =
- "$Id: restore.c,v 1.35 2004/12/15 11:00:01 stelian Exp $";
+ "$Id: restore.c,v 1.40 2010/12/06 14:26:50 stelian Exp $";
#endif /* not lint */
#include <config.h>
/*
* Find unreferenced link names.
+ *
+ * This also takes care of directories which were missed by removeoldleaves(),
+ * because their inode has been reused, but excluded from the dump.
*/
void
findunreflinks(void)
continue;
if (ep->e_entries == NULL)
continue;
- for (j = 0; j < DIRHASH_SIZE; j++) {
+ for (j = 0; j < dirhash_size; j++) {
for (np = ep->e_entries[j]; np != NULL; np = np->e_sibling) {
- if (np->e_flags == 0) {
+ if ((np->e_flags & ~TMPNAME) == 0) {
Dprintf(stdout,
"%s: remove unreferenced name\n",
myname(np));
- removeleaf(np);
- freeentry(np);
+ if (np->e_type == LEAF) {
+ removeleaf(np);
+ freeentry(np);
+ } else {
+ np->e_flags |= TMPNAME;
+ deleteino(np->e_ino);
+ np->e_next = removelist;
+ removelist = np;
+ }
}
}
}
for (ep = removelist; ep != NULL; ep = ep->e_next) {
if (ep->e_entries == NULL)
continue;
- for (j = 0; j < DIRHASH_SIZE; j++) {
+ for (j = 0; j < dirhash_size; j++) {
for (np = ep->e_entries[j]; np != NULL; np = np->e_sibling) {
if (np->e_type == LEAF) {
if (np->e_flags != 0)
myname(np));
removeleaf(np);
freeentry(np);
+ } else {
+ if ((np->e_flags & ~TMPNAME) != 0)
+ badentry(np, "unreferenced with flags");
+
+ if (np->e_flags == 0) {
+ Dprintf(stdout,
+ "%s: remove unreferenced name\n",
+ myname(np));
+ np->e_next = ep->e_next;
+ ep->e_next = np;
+ }
}
}
}
change = 0;
prev = &removelist;
for (ep = removelist; ep != NULL; ep = *prev) {
+ int docont = 0;
if (ep->e_entries != NULL) {
int i;
- for (i = 0; i < DIRHASH_SIZE; i++) {
+ for (i = 0; i < dirhash_size; i++) {
if (ep->e_entries[i] != NULL) {
prev = &ep->e_next;
- continue;
+ docont = 1;
+ break;
}
}
}
+ if (docont)
+ continue;
*prev = ep->e_next;
removenode(ep);
freeentry(ep);
if (first != curfile.ino) {
fprintf(stderr, "expected next file %ld, got %lu\n",
(long)first, (unsigned long)curfile.ino);
- do_compare_error;
skipfile();
goto next;
}
Vprintf(stdout, "Extract requested files\n");
curfile.action = SKIP;
#ifdef USE_QFA
- if (tapeposflag)
- curfile.ino = 0;
- else
+ if (!tapeposflag) {
#endif
if (volinfo[1] == ROOTINO)
curfile.ino = 0;
else
getvol((long)1);
+#ifdef USE_QFA
+ }
+#endif
skipmaps();
skipdirs();
first = lowerbnd(ROOTINO);