]> git.wh0rd.org - dump.git/blobdiff - restore/restore.c
From Uwe Gohlke:
[dump.git] / restore / restore.c
index a44f50dddf5dc022a41d2636f2e221b1481b7524..2a398fc18816e9c7e5ada0ca2fb4c11c856d139b 100644 (file)
@@ -41,7 +41,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: restore.c,v 1.25 2002/01/25 14:59:53 stelian Exp $";
+       "$Id: restore.c,v 1.27 2002/02/04 11:18:46 stelian Exp $";
 #endif /* not lint */
 
 #include <config.h>
@@ -60,9 +60,12 @@ static const char rcsid[] =
 #else  /* __linux__ */
 #include <ufs/ufs/dinode.h>
 #endif /* __linux__ */
+#include <protocols/dumprestore.h>
 
+#include <compaterr.h>
 #include <stdio.h>
 #include <string.h>
+#include <unistd.h>
 
 #ifdef __linux__
 #include <ext2fs/ext2fs.h>
@@ -108,7 +111,7 @@ listfile(char *name, dump_ino_t ino, int type)
 long
 addfile(char *name, dump_ino_t ino, int type)
 {
-       register struct entry *ep, *np;
+       struct entry *ep, *np;
        long descend = hflag ? GOOD : FAIL;
        char buf[100];
 
@@ -140,7 +143,11 @@ addfile(char *name, dump_ino_t ino, int type)
                        }
        }
        ep = addentry(name, ino, type);
+#ifdef USE_QFA
+       if ((type == NODE) && (!createtapeposflag))
+#else
        if (type == NODE)
+#endif
                newnode(ep);
        ep->e_flags |= NEW;
        return (descend);
@@ -192,8 +199,8 @@ static struct entry *removelist;
 void
 removeoldleaves(void)
 {
-       register struct entry *ep, *nextep;
-       register dump_ino_t i, mydirino;
+       struct entry *ep, *nextep;
+       dump_ino_t i, mydirino;
 
        Vprintf(stdout, "Mark entries to be removed.\n");
        if ((ep = lookupino(WINO))) {
@@ -249,7 +256,7 @@ removeoldleaves(void)
 long
 nodeupdates(char *name, dump_ino_t ino, int type)
 {
-       register struct entry *ep, *np, *ip;
+       struct entry *ep, *np, *ip;
        long descend = GOOD;
        int lookuptype = 0;
        int key = 0;
@@ -558,8 +565,8 @@ keyval(int key)
 void
 findunreflinks(void)
 {
-       register struct entry *ep, *np;
-       register dump_ino_t i;
+       struct entry *ep, *np;
+       dump_ino_t i;
 
        Vprintf(stdout, "Find unreferenced names.\n");
        for (i = ROOTINO; i < maxino; i++) {
@@ -606,7 +613,7 @@ findunreflinks(void)
 void
 removeoldnodes(void)
 {
-       register struct entry *ep, **prev;
+       struct entry *ep, **prev;
        long change;
 
        Vprintf(stdout, "Remove old nodes (directories).\n");
@@ -649,7 +656,7 @@ compare_entry(struct entry *ep, int do_compare)
 void
 compareleaves(void)
 {
-       register struct entry *ep;
+       struct entry *ep;
        dump_ino_t first;
        long curvol;
 
@@ -736,7 +743,7 @@ compareleaves(void)
 void
 createleaves(char *symtabfile)
 {
-       register struct entry *ep;
+       struct entry *ep;
        dump_ino_t first;
        long curvol;
 
@@ -835,8 +842,8 @@ createleaves(char *symtabfile)
 void
 createfiles(void)
 {
-       register dump_ino_t first, next, last;
-       register struct entry *ep;
+       dump_ino_t first, next, last;
+       struct entry *ep;
        long curvol;
 #ifdef USE_QFA
        long tnum, tmpcnt;
@@ -915,22 +922,31 @@ createfiles(void)
                                if (GetTapePos(&curtpos) == 0) {
                                        /*  curtpos +1000 ???, some drives 
                                         *  might be too slow */
-                                       if (tpos > curtpos) {
+                                       if (tpos != curtpos) {
 #ifdef DEBUG_QFA
                                                msg("positioning tape %ld from %lld to %lld 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);
+                                                               msg("before resync at tape position %lld (%ld, %ld, %s)\n", curtpos, next, curfile.ino, curfile.name);
 #endif
-                                                       (void)ReReadFromTape();
+msg("bobo1\n");
+                                                       ReReadInodeFromTape(next);
 #ifdef DEBUG_QFA
-                                                       if (GetTapePos(&curtpos) == 0)
-                                                               msg("after resync at tape position %ld\n", curtpos);
+msg("bobo2\n");
+                                                       if (GetTapePos(&curtpos) == 0) {
+msg("bobo3\n");
+                                                               msg("after resync at tape position %lld (%ld, %ld, %s)\n", curtpos, next, curfile.ino, curfile.name);
+msg("bobo4\n");
+                                                       }
 #endif
                                                }
                                        }
+#ifdef DEBUG_QFA
+                                       else
+                                               msg("already at tape %ld position %ld for inode %10lu ...\n", volno, tpos, (unsigned long)next);
+#endif
                                }
                        }
                }
@@ -989,8 +1005,11 @@ createfiles(void)
                        ep = lookupino(next);
                        if (ep == NULL)
                                panic("corrupted symbol table\n");
-                       fprintf(stderr, "%s: (inode %lu) not found on tape\n", 
-                               myname(ep), (unsigned long)next);
+#ifdef USE_QFA
+                       if (!createtapeposflag)
+                               fprintf(stderr, "%s: (inode %lu) not found on tape\n", 
+                                       myname(ep), (unsigned long)next);
+#endif
                        ep->e_flags &= ~NEW;
                        next = lowerbnd(next);
                }
@@ -1002,7 +1021,23 @@ createfiles(void)
                        ep = lookupino(next);
                        if (ep == NULL)
                                panic("corrupted symbol table\n");
-                       (void) extractfile(myname(ep));
+#ifdef USE_QFA
+                       if (createtapeposflag) {
+#ifdef DEBUG_QFA
+                               msg("inode %ld at tapepos %ld\n", curfile.ino, curtapepos);
+#endif
+                               sprintf(gTps, "%ld\t%ld\t%lld\n", (unsigned long)curfile.ino, volno, curtapepos);
+                               if (write(gTapeposfd, gTps, strlen(gTps)) != strlen(gTps))
+                                       warn("error writing tapepos file.\n");
+                               skipfile();
+                       }
+                       else {
+                               msg("restoring %s\n", myname(ep));
+#endif /* USE_QFA */
+                               (void) extractfile(myname(ep));
+#ifdef USE_QFA
+                       }
+#endif /* USE_QFA */
                        ep->e_flags &= ~NEW;
                        if (volno != curvol)
                                skipmaps();
@@ -1016,8 +1051,8 @@ createfiles(void)
 void
 createlinks(void)
 {
-       register struct entry *np, *ep;
-       register dump_ino_t i;
+       struct entry *np, *ep;
+       dump_ino_t i;
        char name[BUFSIZ];
 
        if ((ep = lookupino(WINO))) {
@@ -1060,8 +1095,8 @@ createlinks(void)
 void
 checkrestore(void)
 {
-       register struct entry *ep;
-       register dump_ino_t i;
+       struct entry *ep;
+       dump_ino_t i;
 
        Vprintf(stdout, "Check the symbol table.\n");
        for (i = WINO; i < maxino; i++) {