X-Git-Url: https://git.wh0rd.org/?p=dump.git;a=blobdiff_plain;f=restore%2Frestore.c;h=94e0bb6cc8f853c5a4243aeaf0c2dcf738568a2c;hp=b95e3569cd8b79e07c21ecc8c2f13c73fb5c8458;hb=c21722b0a369bad430dc8c06d645cfd75854a6ec;hpb=3e8961b70386c298ef95b85171ec9bb5dea9649a diff --git a/restore/restore.c b/restore/restore.c index b95e356..94e0bb6 100644 --- a/restore/restore.c +++ b/restore/restore.c @@ -37,7 +37,7 @@ #ifndef lint static const char rcsid[] = - "$Id: restore.c,v 1.33 2003/11/22 16:52:16 stelian Exp $"; + "$Id: restore.c,v 1.36 2005/03/18 22:12:55 stelian Exp $"; #endif /* not lint */ #include @@ -572,19 +572,24 @@ findunreflinks(void) { struct entry *ep, *np; dump_ino_t i; + int j; Vprintf(stdout, "Find unreferenced names.\n"); for (i = ROOTINO; i < maxino; i++) { ep = lookupino(i); if (ep == NULL || ep->e_type == LEAF || TSTINO(i, dumpmap) == 0) continue; - for (np = ep->e_entries; np != NULL; np = np->e_sibling) { - if (np->e_flags == 0) { - Dprintf(stdout, - "%s: remove unreferenced name\n", - myname(np)); - removeleaf(np); - freeentry(np); + if (ep->e_entries == NULL) + continue; + for (j = 0; j < DIRHASH_SIZE; j++) { + for (np = ep->e_entries[j]; np != NULL; np = np->e_sibling) { + if (np->e_flags == 0) { + Dprintf(stdout, + "%s: remove unreferenced name\n", + myname(np)); + removeleaf(np); + freeentry(np); + } } } } @@ -592,15 +597,19 @@ findunreflinks(void) * Any leaves remaining in removed directories is unreferenced. */ for (ep = removelist; ep != NULL; ep = ep->e_next) { - for (np = ep->e_entries; np != NULL; np = np->e_sibling) { - if (np->e_type == LEAF) { - if (np->e_flags != 0) - badentry(np, "unreferenced with flags"); - Dprintf(stdout, - "%s: remove unreferenced name\n", - myname(np)); - removeleaf(np); - freeentry(np); + if (ep->e_entries == NULL) + continue; + 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) + badentry(np, "unreferenced with flags"); + Dprintf(stdout, + "%s: remove unreferenced name\n", + myname(np)); + removeleaf(np); + freeentry(np); + } } } } @@ -626,10 +635,19 @@ removeoldnodes(void) change = 0; prev = &removelist; for (ep = removelist; ep != NULL; ep = *prev) { + int docont = 0; if (ep->e_entries != NULL) { - prev = &ep->e_next; - continue; + int i; + for (i = 0; i < DIRHASH_SIZE; i++) { + if (ep->e_entries[i] != NULL) { + prev = &ep->e_next; + docont = 1; + break; + } + } } + if (docont) + continue; *prev = ep->e_next; removenode(ep); freeentry(ep); @@ -651,7 +669,10 @@ compare_entry(struct entry *ep, int do_compare) badentry(ep, "unexpected file on tape"); do_compare_error; } - if (do_compare) (void) comparefile(myname(ep)); + if (do_compare) { + (void) comparefile(myname(ep)); + skipxattr(); + } ep->e_flags &= ~(NEW|EXTRACT); } @@ -807,39 +828,9 @@ createleaves(char *symtabfile) else doremove = 0; (void) extractfile(ep, doremove); + skipxattr(); ep->e_flags &= ~(NEW|EXTRACT); -finderres: - if ((first == curfile.ino) && (spcl.c_flags & DR_EXTATTRIBUTES)) { - switch (spcl.c_extattributes) { - case EXT_MACOSFNDRINFO: -#ifdef DUMP_MACOSX - (void)extractfinderinfoufs(myname(ep)); -#else - msg("MacOSX not supported in this version, skipping\n"); - skipfile(); -#endif - break; - case EXT_MACOSRESFORK: -#ifdef DUMP_MACOSX - (void)extractresourceufs(myname(ep)); -#else - msg("MacOSX not supported in this version, skipping\n"); - skipfile(); -#endif - break; - case EXT_ACL: - msg("ACLs not supported in this version, skipping\n"); - skipfile(); - break; - default: - msg("unexpected inode extension %ld, skipping\n", spcl.c_extattributes); - skipfile(); - break; - } - goto finderres; - } - /* * We checkpoint the restore after every tape reel, so * as to simplify the amount of work required by the @@ -1070,37 +1061,7 @@ createfiles(void) } else { #endif /* USE_QFA */ (void) extractfile(ep, 0); - -finderres: - if ((next == curfile.ino) && (spcl.c_flags & DR_EXTATTRIBUTES)) { - switch (spcl.c_extattributes) { - case EXT_MACOSFNDRINFO: -#ifdef DUMP_MACOSX - (void)extractfinderinfoufs(myname(ep)); -#else - msg("MacOSX not supported in this version, skipping\n"); - skipfile(); -#endif - break; - case EXT_MACOSRESFORK: -#ifdef DUMP_MACOSX - (void)extractresourceufs(myname(ep)); -#else - msg("MacOSX not supported in this version, skipping\n"); - skipfile(); -#endif - break; - case EXT_ACL: - msg("ACLs not supported in this version, skipping\n"); - skipfile(); - break; - default: - msg("unexpected inode extension %ld, skipping\n", spcl.c_extattributes); - skipfile(); - break; - } - goto finderres; - } + skipxattr(); #ifdef USE_QFA }