]> git.wh0rd.org - dump.git/commitdiff
From Uwe Gohlke:
authorStelian Pop <stelian@popies.net>
Mon, 4 Feb 2002 11:18:45 +0000 (11:18 +0000)
committerStelian Pop <stelian@popies.net>
Mon, 4 Feb 2002 11:18:45 +0000 (11:18 +0000)
- -P option to restore
- compile restore on Solaris
- several code cleanups for QFA features.

CHANGES
dump/optr.c
dump/traverse.c
restore/dirs.c
restore/extern.h
restore/main.c
restore/restore.8.in
restore/restore.c
restore/restore.h
restore/tape.c
restore/utilities.c

diff --git a/CHANGES b/CHANGES
index e6fc0722f5aa640b4d32454bc4e27372642f4d93..214829ce6323a100fbbc1f3a545c6404ef4ab293 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,4 @@
-$Id: CHANGES,v 1.160 2002/01/31 10:49:16 stelian Exp $
+$Id: CHANGES,v 1.161 2002/02/04 11:18:45 stelian Exp $
 
 Changes between versions 0.4b26 and 0.4b27 (released ???????????????)
 =====================================================================
 
 Changes between versions 0.4b26 and 0.4b27 (released ???????????????)
 =====================================================================
@@ -36,6 +36,14 @@ Changes between versions 0.4b26 and 0.4b27 (released ???????????????)
        ext2 disk labels (LABEL=/). Thanks to John Yu <jky@it.bu.edu>
        for reporting this bug.
 
        ext2 disk labels (LABEL=/). Thanks to John Yu <jky@it.bu.edu>
        for reporting this bug.
 
+9.     Added the -P <file> option to restore to create a
+       Quick File Access file from an already made dump. Patch 
+       contributed by Uwe Gohlke <uwe@ugsoft.de>.
+
+10.    Made restore compile and run on Solaris, making it a 
+       possible replacement for the standard ufsrestore. Port was
+       contributed by Uwe Gohlke <uwe@ugsoft.de>.
+
 Changes between versions 0.4b25 and 0.4b26 (released January 7, 2002)
 =====================================================================
 
 Changes between versions 0.4b25 and 0.4b26 (released January 7, 2002)
 =====================================================================
 
index a580f35843890f4a75e6a35158ec2af7a9142cd2..a79462b24764c4f3aa42204e27ac5f5e36305949 100644 (file)
@@ -41,7 +41,7 @@
 
 #ifndef lint
 static const char rcsid[] =
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: optr.c,v 1.30 2002/01/25 15:08:59 stelian Exp $";
+       "$Id: optr.c,v 1.31 2002/02/04 11:18:45 stelian Exp $";
 #endif /* not lint */
 
 #include <config.h>
 #endif /* not lint */
 
 #include <config.h>
@@ -469,6 +469,7 @@ getfstab(void)
                    strcmp(fs->fs_type, FSTAB_RQ))
                        continue;
                fs = allocfsent(fs);
                    strcmp(fs->fs_type, FSTAB_RQ))
                        continue;
                fs = allocfsent(fs);
+               fs->fs_passno = 0;
                if ((pf = (struct pfstab *)malloc(sizeof (*pf))) == NULL)
                        quit("%s\n", strerror(errno));
                pf->pf_fstab = fs;
                if ((pf = (struct pfstab *)malloc(sizeof (*pf))) == NULL)
                        quit("%s\n", strerror(errno));
                pf->pf_fstab = fs;
index 147717ad37095eb80a40032550f92f39ec80ac6e..eda65e1379e87fa4e1417d6f6295b59529795fb4 100644 (file)
@@ -41,7 +41,7 @@
 
 #ifndef lint
 static const char rcsid[] =
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: traverse.c,v 1.42 2002/01/25 15:08:59 stelian Exp $";
+       "$Id: traverse.c,v 1.43 2002/02/04 11:18:46 stelian Exp $";
 #endif /* not lint */
 
 #include <config.h>
 #endif /* not lint */
 
 #include <config.h>
@@ -143,15 +143,14 @@ int dump_fs_open(const char *disk, ext2_filsys *fs)
                dump_ino_t journal_ino = ext2_journal_ino(es);
 
                if (es->s_feature_incompat & EXT3_FEATURE_INCOMPAT_JOURNAL_DEV){
                dump_ino_t journal_ino = ext2_journal_ino(es);
 
                if (es->s_feature_incompat & EXT3_FEATURE_INCOMPAT_JOURNAL_DEV){
-                       fprintf(stderr, "This an journal, not a filesystem!\n");
+                       msg("This is a journal, not a filesystem!\n");
                        retval = EXT2_ET_UNSUPP_FEATURE;
                        ext2fs_close(*fs);
                }
                else if ((retval = es->s_feature_incompat &
                                        ~(EXT2_LIB_FEATURE_INCOMPAT_SUPP |
                                          EXT3_FEATURE_INCOMPAT_RECOVER))) {
                        retval = EXT2_ET_UNSUPP_FEATURE;
                        ext2fs_close(*fs);
                }
                else if ((retval = es->s_feature_incompat &
                                        ~(EXT2_LIB_FEATURE_INCOMPAT_SUPP |
                                          EXT3_FEATURE_INCOMPAT_RECOVER))) {
-                       fprintf(stderr,
-                               "Unsupported feature(s) 0x%x in filesystem\n",
+                       msg("Unsupported feature(s) 0x%x in filesystem\n",
                                retval);
                        retval = EXT2_ET_UNSUPP_FEATURE;
                        ext2fs_close(*fs);
                                retval);
                        retval = EXT2_ET_UNSUPP_FEATURE;
                        ext2fs_close(*fs);
index 60f5b23673b15eebe42576aa3887ded3b2e8c894..45d4cbe0743981208e96fa82ce6544ee4deb83de 100644 (file)
@@ -46,7 +46,7 @@
 
 #ifndef lint
 static const char rcsid[] =
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: dirs.c,v 1.17 2002/01/25 15:08:59 stelian Exp $";
+       "$Id: dirs.c,v 1.18 2002/02/04 11:18:46 stelian Exp $";
 #endif /* not lint */
 
 #include <config.h>
 #endif /* not lint */
 
 #include <config.h>
@@ -140,7 +140,7 @@ struct odirect {
        char    d_name[ODIRSIZ];
 };
 
        char    d_name[ODIRSIZ];
 };
 
-#ifdef __linux__
+#if defined(__linux__) || defined(sunos)
 static struct inotab   *allocinotab __P((dump_ino_t, struct new_bsd_inode *, long));
 #else
 static struct inotab   *allocinotab __P((dump_ino_t, struct dinode *, long));
 static struct inotab   *allocinotab __P((dump_ino_t, struct new_bsd_inode *, long));
 #else
 static struct inotab   *allocinotab __P((dump_ino_t, struct dinode *, long));
@@ -165,7 +165,7 @@ void
 extractdirs(int genmode)
 {
        int i;
 extractdirs(int genmode)
 {
        int i;
-#ifdef __linux__
+#if defined(__linux__) || defined(sunos)
        struct new_bsd_inode *ip;
 #else
        struct dinode *ip;
        struct new_bsd_inode *ip;
 #else
        struct dinode *ip;
@@ -325,7 +325,11 @@ pathsearch(const char *pathname)
        while (*path == '/')
                path++;
        dp = NULL;
        while (*path == '/')
                path++;
        dp = NULL;
+#ifdef __linux__
        while ((name = strsep(&path, "/")) != NULL && *name /* != NULL */) {
        while ((name = strsep(&path, "/")) != NULL && *name /* != NULL */) {
+#else
+       while ((name = strtok_r(NULL, "/", &path)) != NULL && *name /* != NULL */) {
+#endif
                if ((dp = searchdir(ino, name)) == NULL)
                        return (NULL);
                ino = dp->d_ino;
                if ((dp = searchdir(ino, name)) == NULL)
                        return (NULL);
                ino = dp->d_ino;
@@ -431,9 +435,9 @@ putdir(char *buf, size_t size)
 /*
  * These variables are "local" to the following two functions.
  */
 /*
  * These variables are "local" to the following two functions.
  */
-char dirbuf[DIRBLKSIZ];
-long dirloc = 0;
-long prev = 0;
+static char dirbuf[DIRBLKSIZ];
+static long dirloc = 0;
+static long prev = 0;
 
 /*
  * add a new directory entry to a file.
 
 /*
  * add a new directory entry to a file.
index 7cc98044c46e85fad8ba3e7b819b2baf68e9a220..408169fc5ae49eac8954097cd8b5405a03bfc1fc 100644 (file)
@@ -5,7 +5,7 @@
  *     Stelian Pop <stelian@popies.net>, 1999-2000
  *     Stelian Pop <stelian@popies.net> - Alcôve <www.alcove.com>, 2000-2002
  *
  *     Stelian Pop <stelian@popies.net>, 1999-2000
  *     Stelian Pop <stelian@popies.net> - Alcôve <www.alcove.com>, 2000-2002
  *
- *     $Id: extern.h,v 1.15 2002/01/25 14:59:53 stelian Exp $
+ *     $Id: extern.h,v 1.16 2002/02/04 11:18:46 stelian Exp $
  */
 
 /*-
  */
 
 /*-
@@ -132,5 +132,6 @@ int Inode2Tapepos __P((dump_ino_t, long *, long long *, int));
 int    GetTapePos __P((long long *));
 int    GotoTapePos __P((long long));
 void   ReReadFromTape __P((void));
 int    GetTapePos __P((long long *));
 int    GotoTapePos __P((long long));
 void   ReReadFromTape __P((void));
+void   ReReadInodeFromTape __P((dump_ino_t));
 #endif
 void   RequestVol __P((long));
 #endif
 void   RequestVol __P((long));
index fb51380cf600c92078c0f584ce675a2b224f312a..eef486af21c879f57c02cb2ceddd82d600b602fd 100644 (file)
 
 #ifndef lint
 static const char rcsid[] =
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: main.c,v 1.37 2002/01/25 14:59:53 stelian Exp $";
+       "$Id: main.c,v 1.38 2002/02/04 11:18:46 stelian Exp $";
 #endif /* not lint */
 
 #include <config.h>
 #include <compatlfs.h>
 #endif /* not lint */
 
 #include <config.h>
 #include <compatlfs.h>
+#include <fcntl.h>
 #include <sys/param.h>
 #include <sys/stat.h>
 #include <errno.h>
 #include <sys/param.h>
 #include <sys/stat.h>
 #include <errno.h>
@@ -109,9 +110,13 @@ char       *gTapeposfile;
 char   gTps[255];
 long   gSeekstart;
 int    tapeposflag;
 char   gTps[255];
 long   gSeekstart;
 int    tapeposflag;
+int    gTapeposfd;
+int    createtapeposflag;
+unsigned long qfadumpdate;
+long long curtapepos;
 #endif /* USE_QFA */
 
 #endif /* USE_QFA */
 
-#ifdef __linux__
+#if defined(__linux__) || defined(sunos)
 char   *__progname;
 #endif
 
 char   *__progname;
 #endif
 
@@ -129,17 +134,18 @@ main(int argc, char *argv[])
        char *p, name[MAXPATHLEN];
        FILE *filelist = NULL;
        char fname[MAXPATHLEN];
        char *p, name[MAXPATHLEN];
        FILE *filelist = NULL;
        char fname[MAXPATHLEN];
-#ifdef USE_QFA
-       tapeposflag = 0;
-#endif
-#ifdef USE_QFADEBUG
+#ifdef DEBUG_QFA
        time_t tistart, tiend, titaken;
 #endif
        time_t tistart, tiend, titaken;
 #endif
+#ifdef USE_QFA
+       tapeposflag = 0;
+       createtapeposflag = 0;
+#endif /* USE_QFA */
 
        /* Temp files should *not* be readable.  We set permissions later. */
        (void) umask(077);
        filesys[0] = '\0';
 
        /* Temp files should *not* be readable.  We set permissions later. */
        (void) umask(077);
        filesys[0] = '\0';
-#ifdef __linux__
+#if defined(__linux__) || defined(sunos)
        __progname = argv[0];
 #endif
 
        __progname = argv[0];
 #endif
 
@@ -162,7 +168,7 @@ main(int argc, char *argv[])
 #endif
                "lL:mMN"
 #ifdef USE_QFA
 #endif
                "lL:mMN"
 #ifdef USE_QFA
-               "Q:"
+               "P:Q:"
 #endif
                "Rrs:tT:uvVxX:y")) != -1)
                switch(ch) {
 #endif
                "Rrs:tT:uvVxX:y")) != -1)
                switch(ch) {
@@ -213,6 +219,9 @@ main(int argc, char *argv[])
 #endif
                case 'C':
                case 'i':
 #endif
                case 'C':
                case 'i':
+#ifdef USE_QFA
+               case 'P':
+#endif
                case 'R':
                case 'r':
                case 't':
                case 'R':
                case 'r':
                case 't':
@@ -222,6 +231,13 @@ main(int argc, char *argv[])
                                    "%c and %c options are mutually exclusive",
                                    ch, command);
                        command = ch;
                                    "%c and %c options are mutually exclusive",
                                    ch, command);
                        command = ch;
+#ifdef USE_QFA
+                       if (ch == 'P') {
+                               gTapeposfile = optarg;
+                               createtapeposflag = 1;
+                       }
+#endif
+
                        break;
                case 'l':
                        lflag = 1;
                        break;
                case 'l':
                        lflag = 1;
@@ -349,10 +365,7 @@ main(int argc, char *argv[])
                if (fgets(gTps, sizeof(gTps), gTapeposfp) == NULL)
                        errx(1, "not requested format of -- %s", gTapeposfile);
                gTps[strlen(gTps) - 1] = 0;
                if (fgets(gTps, sizeof(gTps), gTapeposfp) == NULL)
                        errx(1, "not requested format of -- %s", gTapeposfile);
                gTps[strlen(gTps) - 1] = 0;
-               /* TODO: check dumpdate from QFA file with current dump file's
-                * dump date */
-               /* if not equal either output warning and continue without QFA
-                * or abort */
+               qfadumpdate = atol(gTps);
                /* read empty line */
                if (fgets(gTps, sizeof(gTps), gTapeposfp) == NULL)
                        errx(1, "not requested format of -- %s", gTapeposfile);
                /* read empty line */
                if (fgets(gTps, sizeof(gTps), gTapeposfp) == NULL)
                        errx(1, "not requested format of -- %s", gTapeposfile);
@@ -364,7 +377,7 @@ main(int argc, char *argv[])
                /* end reading header info */
                /* tape position table starts here */
                gSeekstart = ftell(gTapeposfp); /* remember for later use */
                /* end reading header info */
                /* tape position table starts here */
                gSeekstart = ftell(gTapeposfp); /* remember for later use */
-}
+       }
 #endif /* USE_QFA */
 
        switch (command) {
 #endif /* USE_QFA */
 
        switch (command) {
@@ -497,7 +510,7 @@ main(int argc, char *argv[])
         * Batch extraction of tape contents.
         */
        case 'x':
         * Batch extraction of tape contents.
         */
        case 'x':
-#ifdef USE_QFADEBUG
+#ifdef DEBUG_QFA
                tistart = time(NULL);
 #endif
                setup();
                tistart = time(NULL);
 #endif
                setup();
@@ -520,13 +533,53 @@ main(int argc, char *argv[])
                setdirmodes(0);
                if (dflag)
                        checkrestore();
                setdirmodes(0);
                if (dflag)
                        checkrestore();
-#ifdef USE_QFADEBUG
+#ifdef DEBUG_QFA
                tiend = time(NULL);
                titaken = tiend - tistart;
                msg("restore took %d:%02d:%02d\n", titaken / 3600, 
                        (titaken % 3600) / 60, titaken % 60);
                tiend = time(NULL);
                titaken = tiend - tistart;
                msg("restore took %d:%02d:%02d\n", titaken / 3600, 
                        (titaken % 3600) / 60, titaken % 60);
-#endif /* USE_QFADEBUG */
+#endif /* DEBUG_QFA */
+               break;
+#ifdef USE_QFA
+       case 'P':
+#ifdef DEBUG_QFA
+               tistart = time(NULL);
+#endif
+               setup();
+               msg("writing QFA positions to %s\n", gTapeposfile);
+               if ((gTapeposfd = open(gTapeposfile, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR)) < 0)
+                       errx(1, "can't create tapeposfile\n");
+               /* print QFA-file header */
+               sprintf(gTps, "%s\n%s\n%ld\n\n", QFA_MAGIC, QFA_VERSION,(unsigned long)spcl.c_date);
+               if (write(gTapeposfd, gTps, strlen(gTps)) != strlen(gTps))
+                       errx(1, "can't write tapeposfile\n");
+               sprintf(gTps, "ino\ttapeno\ttapepos\n");
+               if (write(gTapeposfd, gTps, strlen(gTps)) != strlen(gTps))
+                       errx(1, "can't write tapeposfile\n");
+
+               extractdirs(1);
+               initsymtable((char *)0);
+               for (;;) {
+                       NEXTFILE(p);
+                       if (!p)
+                               break;
+                       canon(p, name, sizeof(name));
+                       ino = dirlookup(name);
+                       if (ino == 0)
+                               continue;
+                       if (mflag)
+                               pathcheck(name);
+                       treescan(name, ino, addfile);
+               }
+               createfiles();
+#ifdef DEBUG_QFA
+               tiend = time(NULL);
+               titaken = tiend - tistart;
+               msg("writing QFA positions took %d:%02d:%02d\n", titaken / 3600,
+                       (titaken % 3600) / 60, titaken % 60);
+#endif /* DEBUG_QFA */
                break;
                break;
+#endif /* USE_QFA */
        }
        exit(0);
        /* NOTREACHED */
        }
        exit(0);
        /* NOTREACHED */
@@ -568,6 +621,10 @@ usage(void)
                "\t%s    [-F script] [-L limit] [-s fileno]\n"
                "\t%s -i [-ach" kerbflag "lmMuvVy] [-A file] [-b blocksize] [-f file]\n"
                "\t%s    [-F script] " qfaflag "[-s fileno]\n"
                "\t%s    [-F script] [-L limit] [-s fileno]\n"
                "\t%s -i [-ach" kerbflag "lmMuvVy] [-A file] [-b blocksize] [-f file]\n"
                "\t%s    [-F script] " qfaflag "[-s fileno]\n"
+#ifdef USE_QFA
+               "\t%s -P file [-ach" kerbflag "lmMuvVy] [-A file] [-b blocksize]\n"
+               "\t%s    [-f file] [-F script] [-s fileno] [-X filelist] [file ...]\n"
+#endif
                "\t%s -r [-c" kerbflag "lMuvVy] [-b blocksize] [-f file] [-F script]\n"
                "\t%s    [-s fileno] [-T directory]\n"
                "\t%s -R [-c" kerbflag "lMuvVy] [-b blocksize] [-f file] [-F script]\n"
                "\t%s -r [-c" kerbflag "lMuvVy] [-b blocksize] [-f file] [-F script]\n"
                "\t%s    [-s fileno] [-T directory]\n"
                "\t%s -R [-c" kerbflag "lMuvVy] [-b blocksize] [-f file] [-F script]\n"
@@ -578,6 +635,9 @@ usage(void)
                "\t%s    [-F script] " qfaflag "[-s fileno] [-X filelist] [file ...]\n",
                __progname, white, 
                __progname, white, 
                "\t%s    [-F script] " qfaflag "[-s fileno] [-X filelist] [file ...]\n",
                __progname, white, 
                __progname, white, 
+#ifdef USE_QFA
+               __progname, white, 
+#endif
                __progname, white,
                __progname, white, 
                __progname, white, 
                __progname, white,
                __progname, white, 
                __progname, white, 
index 54f289e4fa4e77bd32d9b160b47f1b4c3c11a07a..d9d7fa995c1d98ae2105920a25cd71a92db79395 100644 (file)
@@ -29,7 +29,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.\"    $Id: restore.8.in,v 1.24 2002/01/25 14:59:53 stelian Exp $
+.\"    $Id: restore.8.in,v 1.25 2002/02/04 11:18:46 stelian Exp $
 .\"
 .Dd __DATE__
 .Dt RESTORE 8
 .\"
 .Dd __DATE__
 .Dt RESTORE 8
 .Op Fl s Ar fileno
 .Op Fl T Ar directory
 .Nm restore
 .Op Fl s Ar fileno
 .Op Fl T Ar directory
 .Nm restore
+.Fl P Ar file
+.Op Fl achklmMNuvVy
+.Op Fl A Ar file
+.Op Fl b Ar blocksize
+.Op Fl f Ar file
+.Op Fl F Ar script
+.Op Fl s Ar fileno
+.Op Fl T Ar directory
+.Op Fl X Ar filelist
+.Op file ...
+.Nm restore
 .Fl R
 .Op Fl cklMNuvVy
 .Op Fl b Ar blocksize
 .Fl R
 .Op Fl cklMNuvVy
 .Op Fl b Ar blocksize
@@ -212,6 +223,11 @@ It also causes
 .Nm restore
 to print out information about each file as it is extracted.
 .El
 .Nm restore
 to print out information about each file as it is extracted.
 .El
+.It Fl P Ar file
+.Nm Restore
+creates a new Quick File Access file 
+.Ar file
+from an existing dump file without restoring its contents.
 .It Fl R
 .Nm Restore
 requests a particular tape of a multi-volume set on which to restart
 .It Fl R
 .Nm Restore
 requests a particular tape of a multi-volume set on which to restart
index 1b04fea6b9b8b43e81275461eaab2c90e680c222..2a398fc18816e9c7e5ada0ca2fb4c11c856d139b 100644 (file)
@@ -41,7 +41,7 @@
 
 #ifndef lint
 static const char rcsid[] =
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: restore.c,v 1.26 2002/01/25 15:08:59 stelian Exp $";
+       "$Id: restore.c,v 1.27 2002/02/04 11:18:46 stelian Exp $";
 #endif /* not lint */
 
 #include <config.h>
 #endif /* not lint */
 
 #include <config.h>
@@ -60,9 +60,12 @@ static const char rcsid[] =
 #else  /* __linux__ */
 #include <ufs/ufs/dinode.h>
 #endif /* __linux__ */
 #else  /* __linux__ */
 #include <ufs/ufs/dinode.h>
 #endif /* __linux__ */
+#include <protocols/dumprestore.h>
 
 
+#include <compaterr.h>
 #include <stdio.h>
 #include <string.h>
 #include <stdio.h>
 #include <string.h>
+#include <unistd.h>
 
 #ifdef __linux__
 #include <ext2fs/ext2fs.h>
 
 #ifdef __linux__
 #include <ext2fs/ext2fs.h>
@@ -140,7 +143,11 @@ addfile(char *name, dump_ino_t ino, int type)
                        }
        }
        ep = addentry(name, ino, type);
                        }
        }
        ep = addentry(name, ino, type);
+#ifdef USE_QFA
+       if ((type == NODE) && (!createtapeposflag))
+#else
        if (type == NODE)
        if (type == NODE)
+#endif
                newnode(ep);
        ep->e_flags |= NEW;
        return (descend);
                newnode(ep);
        ep->e_flags |= NEW;
        return (descend);
@@ -915,22 +922,31 @@ createfiles(void)
                                if (GetTapePos(&curtpos) == 0) {
                                        /*  curtpos +1000 ???, some drives 
                                         *  might be too slow */
                                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)
 #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
 #endif
-                                                       (void)ReReadFromTape();
+msg("bobo1\n");
+                                                       ReReadInodeFromTape(next);
 #ifdef DEBUG_QFA
 #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
                                                }
                                        }
 #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");
                        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);
                }
                        ep->e_flags &= ~NEW;
                        next = lowerbnd(next);
                }
@@ -1002,7 +1021,23 @@ createfiles(void)
                        ep = lookupino(next);
                        if (ep == NULL)
                                panic("corrupted symbol table\n");
                        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();
                        ep->e_flags &= ~NEW;
                        if (volno != curvol)
                                skipmaps();
index a9dba7bfb539530da14453bd4513882459faf5fa..572a1bcea342bae68fd00a6c3000755a0316c9a7 100644 (file)
@@ -5,7 +5,7 @@
  *     Stelian Pop <stelian@popies.net>, 1999-2000
  *     Stelian Pop <stelian@popies.net> - Alcôve <www.alcove.com>, 2000-2002
  *
  *     Stelian Pop <stelian@popies.net>, 1999-2000
  *     Stelian Pop <stelian@popies.net> - Alcôve <www.alcove.com>, 2000-2002
  *
- *     $Id: restore.h,v 1.24 2002/01/25 14:59:53 stelian Exp $
+ *     $Id: restore.h,v 1.25 2002/02/04 11:18:46 stelian Exp $
  */
 
 /*
  */
 
 /*
@@ -135,7 +135,7 @@ struct entry {
 struct context {
        char    *name;          /* name of file */
        dump_ino_t ino;         /* inumber of file */
 struct context {
        char    *name;          /* name of file */
        dump_ino_t ino;         /* inumber of file */
-#ifdef __linux__
+#if defined(__linux__) || defined(sunos)
        struct  new_bsd_inode *dip;     /* pointer to inode */
 #else
        struct  dinode *dip;    /* pointer to inode */
        struct  new_bsd_inode *dip;     /* pointer to inode */
 #else
        struct  dinode *dip;    /* pointer to inode */
@@ -179,6 +179,10 @@ extern char        *gTapeposfile;
 extern char    gTps[255];
 extern long    gSeekstart;
 extern int     tapeposflag;
 extern char    gTps[255];
 extern long    gSeekstart;
 extern int     tapeposflag;
+extern int     gTapeposfd;
+extern int     createtapeposflag;
+extern unsigned long qfadumpdate;
+extern long long curtapepos;
 #endif /* USE_QFA */
 
 #define do_compare_error \
 #endif /* USE_QFA */
 
 #define do_compare_error \
index 94ceab46fdfa9a706cac851acb3108936dd05fcf..b6d27f7a691060a9656337bcab4c1e6ca6da353c 100644 (file)
@@ -46,7 +46,7 @@
 
 #ifndef lint
 static const char rcsid[] =
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: tape.c,v 1.57 2002/01/31 10:25:55 stelian Exp $";
+       "$Id: tape.c,v 1.58 2002/02/04 11:18:46 stelian Exp $";
 #endif /* not lint */
 
 #include <config.h>
 #endif /* not lint */
 
 #include <config.h>
@@ -332,6 +332,10 @@ setup(void)
        }
        if (vflag || command == 't' || command == 'C')
                printdumpinfo();
        }
        if (vflag || command == 't' || command == 'C')
                printdumpinfo();
+#ifdef USE_QFA
+       if (tapeposflag && spcl.c_date != qfadumpdate)
+               errx(1, "different QFA/dumpdates detected\n");
+#endif
        if (filesys[0] == '\0') {
                char *dirptr;
                strncpy(filesys, spcl.c_filesys, NAMELEN);
        if (filesys[0] == '\0') {
                char *dirptr;
                strncpy(filesys, spcl.c_filesys, NAMELEN);
@@ -416,6 +420,10 @@ getvol(long nextvol)
        }
        saved_blksread = blksread;
        saved_tpblksread = tpblksread;
        }
        saved_blksread = blksread;
        saved_tpblksread = tpblksread;
+#if defined(USE_QFA) && defined(sunos)
+       if (createtapeposflag || tapeposflag) 
+               close(fdsmtc);
+#endif
 again:
        if (pipein)
                exit(1); /* pipes do not get a second chance */
 again:
        if (pipein)
                exit(1); /* pipes do not get a second chance */
@@ -429,7 +437,7 @@ again:
        while (newvol <= 0) {
                if (tapesread == 0) {
                        fprintf(stderr, "%s%s%s%s%s",
        while (newvol <= 0) {
                if (tapesread == 0) {
                        fprintf(stderr, "%s%s%s%s%s",
-                           "You have not read any tapes yet.\n",
+                           "You have not read any volumes yet.\n",
                            "Unless you know which volume your",
                            " file(s) are on you should start\n",
                            "with the last volume and work",
                            "Unless you know which volume your",
                            " file(s) are on you should start\n",
                            "with the last volume and work",
@@ -463,6 +471,15 @@ again:
        }
        if (newvol == volno) {
                tapesread |= 1 << volno;
        }
        if (newvol == volno) {
                tapesread |= 1 << volno;
+#if defined(USE_QFA) && defined(sunos)
+               if (createtapeposflag || tapeposflag) {
+                       if (OpenSMTCmt(magtape) < 0) {
+                               volno = -1;
+                               haderror = 1;
+                               goto again;
+                       }
+               }
+#endif
                return;
        }
        closemt();
                return;
        }
        closemt();
@@ -480,9 +497,9 @@ again:
        }
        if (haderror || (bot_code && !Mflag)) {
                haderror = 0;
        }
        if (haderror || (bot_code && !Mflag)) {
                haderror = 0;
-               fprintf(stderr, "Mount tape volume %ld\n", (long)newvol);
-               fprintf(stderr, "Enter ``none'' if there are no more tapes\n");
-               fprintf(stderr, "otherwise enter tape name (default: %s) ", magtape);
+               fprintf(stderr, "Mount volume %ld\n", (long)newvol);
+               fprintf(stderr, "Enter ``none'' if there are no more volumes\n");
+               fprintf(stderr, "otherwise enter volume name (default: %s) ", magtape);
                (void) fflush(stderr);
                (void) fgets(buf, TP_BSIZE, terminal);
                if (feof(terminal))
                (void) fflush(stderr);
                (void) fgets(buf, TP_BSIZE, terminal);
                if (feof(terminal))
@@ -672,6 +689,13 @@ printvolinfo(void)
        }
 }
 
        }
 }
 
+#ifdef sunos
+struct timeval
+       time_t          tv_sec;         /* seconds */
+       suseconds_t     tv_usec;        /* and microseconds */
+};
+#endif
+
 int
 extractfile(char *name)
 {
 int
 extractfile(char *name)
 {
@@ -682,12 +706,12 @@ extractfile(char *name)
 
        curfile.name = name;
        curfile.action = USING;
 
        curfile.name = name;
        curfile.action = USING;
-#ifdef __linux__
+#if defined(__linux__) || defined(sunos)
        timep[0].tv_sec = curfile.dip->di_atime.tv_sec;
        timep[0].tv_usec = curfile.dip->di_atime.tv_usec;
        timep[1].tv_sec = curfile.dip->di_mtime.tv_sec;
        timep[1].tv_usec = curfile.dip->di_mtime.tv_usec;
        timep[0].tv_sec = curfile.dip->di_atime.tv_sec;
        timep[0].tv_usec = curfile.dip->di_atime.tv_usec;
        timep[1].tv_sec = curfile.dip->di_mtime.tv_sec;
        timep[1].tv_usec = curfile.dip->di_mtime.tv_usec;
-#else  /* __linux__ */
+#else  /* __linux__ || sunos */
        timep[0].tv_sec = curfile.dip->di_atime;
        timep[0].tv_usec = curfile.dip->di_atimensec / 1000;
        timep[1].tv_sec = curfile.dip->di_mtime;
        timep[0].tv_sec = curfile.dip->di_atime;
        timep[0].tv_usec = curfile.dip->di_atimensec / 1000;
        timep[1].tv_sec = curfile.dip->di_mtime;
@@ -907,7 +931,7 @@ loop:
                        curfile.name, (long)blksread);
        }
        if (curblk > 0) {
                        curfile.name, (long)blksread);
        }
        if (curblk > 0) {
-               (*fill)((char *)buf, (size_t)(curblk * TP_BSIZE) + size);
+               (*fill)((char *)buf, (size_t)((curblk * TP_BSIZE) + size));
                last_write_was_hole = 0;
        }
        if (size > 0) {
                last_write_was_hole = 0;
        }
        if (size > 0) {
@@ -1400,6 +1424,10 @@ readtape(char *buf)
                numtrec = ntrec;
        cnt = ntrec * TP_BSIZE;
        rd = 0;
                numtrec = ntrec;
        cnt = ntrec * TP_BSIZE;
        rd = 0;
+#ifdef USE_QFA
+       if (createtapeposflag)
+               (void)GetTapePos(&curtapepos);
+#endif
 getmore:
 #ifdef RRESTORE
        if (host)
 getmore:
 #ifdef RRESTORE
        if (host)
@@ -2052,15 +2080,15 @@ gethead(struct s_spcl *buf)
        buf->c_dinode.di_gid = u_ospcl.s_ospcl.c_dinode.odi_gid;
        buf->c_dinode.di_size = u_ospcl.s_ospcl.c_dinode.odi_size;
        buf->c_dinode.di_rdev = u_ospcl.s_ospcl.c_dinode.odi_rdev;
        buf->c_dinode.di_gid = u_ospcl.s_ospcl.c_dinode.odi_gid;
        buf->c_dinode.di_size = u_ospcl.s_ospcl.c_dinode.odi_size;
        buf->c_dinode.di_rdev = u_ospcl.s_ospcl.c_dinode.odi_rdev;
-#ifdef __linux__
+#if defined(__linux__) || defined(sunos)
        buf->c_dinode.di_atime.tv_sec = u_ospcl.s_ospcl.c_dinode.odi_atime;
        buf->c_dinode.di_mtime.tv_sec = u_ospcl.s_ospcl.c_dinode.odi_mtime;
        buf->c_dinode.di_ctime.tv_sec = u_ospcl.s_ospcl.c_dinode.odi_ctime;
        buf->c_dinode.di_atime.tv_sec = u_ospcl.s_ospcl.c_dinode.odi_atime;
        buf->c_dinode.di_mtime.tv_sec = u_ospcl.s_ospcl.c_dinode.odi_mtime;
        buf->c_dinode.di_ctime.tv_sec = u_ospcl.s_ospcl.c_dinode.odi_ctime;
-#else  /* __linux__ */
+#else  /* __linux__ || sunos */
        buf->c_dinode.di_atime = u_ospcl.s_ospcl.c_dinode.odi_atime;
        buf->c_dinode.di_mtime = u_ospcl.s_ospcl.c_dinode.odi_mtime;
        buf->c_dinode.di_ctime = u_ospcl.s_ospcl.c_dinode.odi_ctime;
        buf->c_dinode.di_atime = u_ospcl.s_ospcl.c_dinode.odi_atime;
        buf->c_dinode.di_mtime = u_ospcl.s_ospcl.c_dinode.odi_mtime;
        buf->c_dinode.di_ctime = u_ospcl.s_ospcl.c_dinode.odi_ctime;
-#endif /* __linux__ */
+#endif /* __linux__ || sunos */
        buf->c_count = u_ospcl.s_ospcl.c_count;
        memmove(buf->c_addr, u_ospcl.s_ospcl.c_fill, (long)256);
        if (u_ospcl.s_ospcl.c_magic != OFS_MAGIC ||
        buf->c_count = u_ospcl.s_ospcl.c_count;
        memmove(buf->c_addr, u_ospcl.s_ospcl.c_fill, (long)256);
        if (u_ospcl.s_ospcl.c_magic != OFS_MAGIC ||
@@ -2073,7 +2101,7 @@ good:
            (buf->c_dinode.di_mode & IFMT) == IFDIR && Qcvt == 0) {
                qcvt.qval = buf->c_dinode.di_size;
                if (qcvt.val[0] || qcvt.val[1]) {
            (buf->c_dinode.di_mode & IFMT) == IFDIR && Qcvt == 0) {
                qcvt.qval = buf->c_dinode.di_size;
                if (qcvt.val[0] || qcvt.val[1]) {
-                       printf("Note: Doing Quad swapping\n");
+                       Vprintf(stdout, "Note: Doing Quad swapping\n");
                        Qcvt = 1;
                }
        }
                        Qcvt = 1;
                }
        }
@@ -2507,6 +2535,29 @@ ReReadFromTape(void)
        findinode(&spcl);
        noresyncmesg = 0;
 }
        findinode(&spcl);
        noresyncmesg = 0;
 }
+
+void
+ReReadInodeFromTape(dump_ino_t theino)
+{
+       long cntloop = 0;
+
+       FLUSHTAPEBUF();
+       noresyncmesg = 1;
+       do {
+               cntloop++;
+               gethead(&spcl);
+       } while (!(spcl.c_inumber == theino && spcl.c_type == TS_INODE && spcl.c_date == dumpdate) && (cntloop < 32));
+#ifdef DEBUG_QFA
+       fprintf(stderr, "%ld reads\n", cntloop);
+       if (cntloop == 32) {
+               fprintf(stderr, "DEBUG: bufsize %d\n", bufsize);
+               fprintf(stderr, "DEBUG: ntrec %ld\n", ntrec);
+               fprintf(stderr, "DEBUG: %ld reads\n", cntloop);
+       }
+#endif
+       findinode(&spcl);
+       noresyncmesg = 0;
+}
 #endif /* USE_QFA */
 
 void
 #endif /* USE_QFA */
 
 void
index 627e147875ee44d5454aa4f8810f8462e852ed97..e897344a1e0a85ef5bec3d5f0bdb9aee51fae362 100644 (file)
@@ -41,7 +41,7 @@
 
 #ifndef lint
 static const char rcsid[] =
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: utilities.c,v 1.19 2002/01/25 15:09:00 stelian Exp $";
+       "$Id: utilities.c,v 1.20 2002/02/04 11:18:46 stelian Exp $";
 #endif /* not lint */
 
 #include <config.h>
 #endif /* not lint */
 
 #include <config.h>
@@ -236,7 +236,7 @@ linkit(char *existing, char *new, int type)
 
                if (!Nflag && (ret = link(existing, new)) < 0) {
 
 
                if (!Nflag && (ret = link(existing, new)) < 0) {
 
-#ifndef __linux__
+#if !defined(__linux__) && !defined(sunos)
                        struct stat s;
 
                        /*
                        struct stat s;
 
                        /*
@@ -276,7 +276,7 @@ linkit(char *existing, char *new, int type)
        return (GOOD);
 }
 
        return (GOOD);
 }
 
-#ifndef        __linux__
+#if !defined(__linux__) && !defined(sunos)
 /*
  * Create a whiteout.
  */
 /*
  * Create a whiteout.
  */