X-Git-Url: https://git.wh0rd.org/?p=dump.git;a=blobdiff_plain;f=restore%2Frestore.c;h=d9561d810fd6ab892d7d4a1d39d4c1b3a76c84c1;hp=c6490a052d1677d5886208f4944f768942382790;hb=e4a8bde40a6d8319d1b28e054e1a419ba3df2363;hpb=0a99352128efc4af44160eee69e8990686bf9ad5 diff --git a/restore/restore.c b/restore/restore.c index c6490a0..d9561d8 100644 --- a/restore/restore.c +++ b/restore/restore.c @@ -2,8 +2,8 @@ * Ported to Linux's Second Extended File System as part of the * dump and restore backup suit * Remy Card , 1994-1997 - * Stelian Pop , 1999-2000 - * Stelian Pop - Alcôve , 2000 + * Stelian Pop , 1999-2000 + * Stelian Pop - Alcôve , 2000 */ /* @@ -41,15 +41,21 @@ #ifndef lint static const char rcsid[] = - "$Id: restore.c,v 1.11 2000/11/10 14:42:25 stelian Exp $"; + "$Id: restore.c,v 1.18 2001/06/18 10:58:28 stelian Exp $"; #endif /* not lint */ +#include #include #ifdef __linux__ #include #include +#include +#ifdef HAVE_EXT2FS_EXT2_FS_H +#include +#else #include +#endif #include #else /* __linux__ */ #include @@ -72,14 +78,26 @@ static char *keyval __P((int)); * List entries on the tape. */ long -listfile(char *name, ino_t ino, int type) +listfile(char *name, dump_ino_t ino, int type) { long descend = hflag ? GOOD : FAIL; +#ifdef USE_QFA + long tnum; + long tpos; +#endif if (TSTINO(ino, dumpmap) == 0) return (descend); Vprintf(stdout, "%s", type == LEAF ? "leaf" : "dir "); - fprintf(stdout, "%10lu\t%s\n", (unsigned long)ino, name); +#ifdef USE_QFA + if (tapeposflag) { /* add QFA positions to output */ + (void)Inode2Tapepos(ino, &tnum, &tpos, 1); + fprintf(stdout, "%10lu\t%ld\t%ld\t%s\n", (unsigned long)ino, + tnum, tpos, name); + } + else +#endif + fprintf(stdout, "%10lu\t%s\n", (unsigned long)ino, name); return (descend); } @@ -88,7 +106,7 @@ listfile(char *name, ino_t ino, int type) * Request that new entries be extracted. */ long -addfile(char *name, ino_t ino, int type) +addfile(char *name, dump_ino_t ino, int type) { register struct entry *ep, *np; long descend = hflag ? GOOD : FAIL; @@ -134,7 +152,7 @@ addfile(char *name, ino_t ino, int type) */ /* ARGSUSED */ long -deletefile(char *name, ino_t ino, int type) +deletefile(char *name, dump_ino_t ino, int type) { long descend = hflag ? GOOD : FAIL; struct entry *ep; @@ -175,7 +193,7 @@ void removeoldleaves(void) { register struct entry *ep, *nextep; - register ino_t i, mydirino; + register dump_ino_t i, mydirino; Vprintf(stdout, "Mark entries to be removed.\n"); if ((ep = lookupino(WINO))) { @@ -229,7 +247,7 @@ removeoldleaves(void) * Renames are done at the same time. */ long -nodeupdates(char *name, ino_t ino, int type) +nodeupdates(char *name, dump_ino_t ino, int type) { register struct entry *ep, *np, *ip; long descend = GOOD; @@ -483,7 +501,7 @@ nodeupdates(char *name, ino_t ino, int type) * for it, we discard the name knowing that it will be on the * next incremental tape. */ - case NULL: + case 0: if (compare_ignore_not_found) break; fprintf(stderr, "%s: (inode %lu) not found on tape\n", name, (unsigned long)ino); @@ -541,7 +559,7 @@ void findunreflinks(void) { register struct entry *ep, *np; - register ino_t i; + register dump_ino_t i; Vprintf(stdout, "Find unreferenced names.\n"); for (i = ROOTINO; i < maxino; i++) { @@ -632,7 +650,7 @@ void compareleaves(void) { register struct entry *ep; - ino_t first; + dump_ino_t first; long curvol; first = lowerbnd(ROOTINO); @@ -700,7 +718,7 @@ void createleaves(char *symtabfile) { register struct entry *ep; - ino_t first; + dump_ino_t first; long curvol; if (command == 'R') { @@ -778,9 +796,13 @@ createleaves(char *symtabfile) void createfiles(void) { - register ino_t first, next, last; + register dump_ino_t first, next, last; register struct entry *ep; long curvol; +#ifdef USE_QFA + long tnum, tpos, curtpos, tmpcnt; + time_t tistart, tiend, titaken; +#endif Vprintf(stdout, "Extract requested files\n"); curfile.action = SKIP; @@ -790,6 +812,9 @@ createfiles(void) first = lowerbnd(ROOTINO); last = upperbnd(maxino - 1); for (;;) { +#ifdef USE_QFA + tmpcnt = 1; +#endif first = lowerbnd(first); last = upperbnd(last); /* @@ -813,13 +838,64 @@ createfiles(void) * or an out of order volume change is encountered */ next = lowerbnd(curfile.ino); +#ifdef USE_QFA + tistart = time(NULL); + if (tapeposflag) { + /* get tape position for inode (position directly) */ + (void)Inode2Tapepos(next, &tnum, &tpos, 1); + if (tpos == 0) + /* get tape position for last available inode + * (position before) */ + (void)Inode2Tapepos(next, &tnum, &tpos, 0); + if (tpos != 0) { + if (tnum != volno) + (void)RequestVol(tnum); + if (GetTapePos(&curtpos) == 0) { + /* curtpos +1000 ???, some drives + * might be too slow */ + if (tpos > curtpos) { +#ifdef DEBUG_QFA + msg("positioning tape %ld from %ld to %ld for inode %10lu ...\n", volno, curtpos, tpos, (unsigned long)next); +#endif + if (GotoTapePos(tpos) == 0) { +#ifdef DEBUG_QFA + if (GetTapePos(&curtpos) == 0) + msg("before resnyc at tape position %ld\n", curtpos); +#endif + (void)ReReadFromTape(); +#ifdef DEBUG_QFA + if (GetTapePos(&curtpos) == 0) + msg("after resync at tape position %ld\n", curtpos); +#endif + } + } + } + } + } +#endif /* USA_QFA */ + do { curvol = volno; - while (next > curfile.ino && volno == curvol) + while (next > curfile.ino && volno == curvol) { +#ifdef USE_QFA + ++tmpcnt; +#endif skipfile(); + } skipmaps(); skipdirs(); } while (volno == curvol + 1); +#ifdef USE_QFA + tiend = time(NULL); + titaken = tiend - tistart; +#ifdef DEBUG_QFA + if (titaken / 60 > 0) + msg("%ld reads took %d:%02d:%02d\n", + tmpcnt, titaken / 3600, + (titaken % 3600) / 60, titaken % 60); +#endif +#endif /* USE_QFA */ + /* * If volume change out of order occurred the * current state must be recalculated @@ -867,7 +943,7 @@ void createlinks(void) { register struct entry *np, *ep; - register ino_t i; + register dump_ino_t i; char name[BUFSIZ]; if ((ep = lookupino(WINO))) { @@ -911,7 +987,7 @@ void checkrestore(void) { register struct entry *ep; - register ino_t i; + register dump_ino_t i; Vprintf(stdout, "Check the symbol table.\n"); for (i = WINO; i < maxino; i++) { @@ -930,7 +1006,7 @@ checkrestore(void) * A paranoid check that things are as they should be. */ long -verifyfile(char *name, ino_t ino, int type) +verifyfile(char *name, dump_ino_t ino, int type) { struct entry *np, *ep; long descend = GOOD;