X-Git-Url: https://git.wh0rd.org/?p=dump.git;a=blobdiff_plain;f=restore%2Fmain.c;h=d0ca888b92be4da03b897bc46d2a1b0a00355be5;hp=64870e69196695421a376cd3af4071a60e8e07d5;hb=40df6a0e578b56977f18c2a960f3fd30c4c78e60;hpb=717bdcef94c7487831a43048751ca868f7d8bae4 diff --git a/restore/main.c b/restore/main.c index 64870e6..d0ca888 100644 --- a/restore/main.c +++ b/restore/main.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-2002 */ /* @@ -41,10 +41,11 @@ #ifndef lint static const char rcsid[] = - "$Id: main.c,v 1.21 2001/04/24 10:59:13 stelian Exp $"; + "$Id: main.c,v 1.35 2002/01/16 10:29:26 stelian Exp $"; #endif /* not lint */ #include +#include #include #include #include @@ -79,9 +80,9 @@ static const char rcsid[] = #include "restore.h" #include "extern.h" -int bflag = 0, cvtflag = 0, dflag = 0, vflag = 0, yflag = 0; -int hflag = 1, mflag = 1, Nflag = 0, zflag = 0; -int uflag = 0; +int aflag = 0, bflag = 0, cvtflag = 0, dflag = 0, vflag = 0, yflag = 0; +int hflag = 1, mflag = 1, Mflag = 0, Nflag = 0, Vflag = 0, zflag = 0; +int uflag = 0, lflag = 0, Lflag = 0; int dokerberos = 0; char command = '\0'; long dumpnum = 1; @@ -98,6 +99,15 @@ int compare_ignore_not_found; int compare_errors; char filesys[NAMELEN]; static const char *stdin_opt = NULL; +char *bot_script = NULL; + +#ifdef USE_QFA +FILE *gTapeposfp; +char *gTapeposfile; +char gTps[255]; +long gSeekstart; +int tapeposflag; +#endif /* USE_QFA */ #ifdef __linux__ char *__progname; @@ -118,9 +128,11 @@ main(int argc, char *argv[]) FILE *filelist = NULL; char fname[MAXPATHLEN]; #ifdef USE_QFA - time_t tistart, tiend, titaken; tapeposflag = 0; #endif +#ifdef USE_QFADEBUG + time_t tistart, tiend, titaken; +#endif /* Temp files should *not* be readable. We set permissions later. */ (void) umask(077); @@ -142,16 +154,19 @@ main(int argc, char *argv[]) ; obsolete(&argc, &argv); while ((ch = getopt(argc, argv, - "b:CcdD:f:hi" + "ab:CcdD:f:F:hi" #ifdef KERBEROS "k" #endif - "mMN" + "lL:mMN" #ifdef USE_QFA "Q:" #endif - "Rrs:tT:uvxX:y")) != -1) + "Rrs:tT:uvVxX:y")) != -1) switch(ch) { + case 'a': + aflag = 1; + break; case 'b': /* Change default tape blocksize. */ bflag = 1; @@ -179,6 +194,9 @@ main(int argc, char *argv[]) use_stdin("-f"); inputdev = optarg; break; + case 'F': + bot_script = optarg; + break; case 'h': hflag = 0; break; @@ -199,6 +217,16 @@ main(int argc, char *argv[]) ch, command); command = ch; break; + case 'l': + lflag = 1; + break; + case 'L': + Lflag = strtol(optarg, &p, 10); + if (*p) + errx(1, "illegal limit -- %s", optarg); + if (Lflag < 0) + errx(1, "limit must be greater than 0"); + break; case 'm': mflag = 0; break; @@ -228,6 +256,9 @@ main(int argc, char *argv[]) case 'v': vflag = 1; break; + case 'V': + Vflag = 1; + break; case 'X': if( !strcmp(optarg,"-") ) { use_stdin("-X"); @@ -249,6 +280,11 @@ main(int argc, char *argv[]) if (command == '\0') errx(1, "none of C, i, R, r, t or x options specified"); +#ifdef USE_QFA + if (!mflag && tapeposflag) + errx(1, "m and Q options are mutually exclusive"); +#endif + if (signal(SIGINT, onintr) == SIG_IGN) (void) signal(SIGINT, SIG_IGN); if (signal(SIGTERM, onintr) == SIG_IGN) @@ -257,7 +293,22 @@ main(int argc, char *argv[]) atexit(cleanup); - setinput(inputdev); + if (command == 'C' && inputdev[0] != '/' && strcmp(inputdev, "-") +#ifdef RRESTORE + && !strchr(inputdev, ':') +#endif + ) { + /* since we chdir into the directory we are comparing + * to, we must retain the full tape path */ + char wd[MAXPATHLEN], fullpathinput[MAXPATHLEN]; + if (!getcwd(wd, MAXPATHLEN)) + err(1, "can't get current directory"); + snprintf(fullpathinput, MAXPATHLEN, "%s/%s", wd, inputdev); + fullpathinput[MAXPATHLEN - 1] = '\0'; + setinput(fullpathinput); + } + else + setinput(inputdev); if (argc == 0 && !filelist) { argc = 1; @@ -308,14 +359,14 @@ main(int argc, char *argv[]) * Compare contents of tape. */ case 'C': { - struct stat stbuf; + struct STAT stbuf; Vprintf(stdout, "Begin compare restore\n"); compare_ignore_not_found = 0; compare_errors = 0; setup(); printf("filesys = %s\n", filesys); - if (stat(filesys, &stbuf) < 0) + if (STAT(filesys, &stbuf) < 0) err(1, "cannot stat directory %s", filesys); if (chdir(filesys) < 0) err(1, "cannot cd to %s", filesys); @@ -345,6 +396,7 @@ main(int argc, char *argv[]) * Incremental restoration of a file system. */ case 'r': + aflag = 1; /* in -r or -R mode, -a is default */ setup(); if (dumptime > 0) { /* @@ -382,6 +434,7 @@ main(int argc, char *argv[]) * Resume an incremental file system restoration. */ case 'R': + aflag = 1; /* in -r or -R mode, -a is default */ initsymtable(symtbl); skipmaps(); skipdirs(); @@ -430,7 +483,7 @@ main(int argc, char *argv[]) * Batch extraction of tape contents. */ case 'x': -#ifdef USE_QFA +#ifdef USE_QFADEBUG tistart = time(NULL); #endif setup(); @@ -453,14 +506,12 @@ main(int argc, char *argv[]) setdirmodes(0); if (dflag) checkrestore(); -#ifdef USE_QFA +#ifdef USE_QFADEBUG tiend = time(NULL); titaken = tiend - tistart; -#ifdef USE_QFA msg("restore took %d:%02d:%02d\n", titaken / 3600, (titaken % 3600) / 60, titaken % 60); -#endif -#endif +#endif /* USE_QFADEBUG */ break; } exit(0); @@ -495,12 +546,12 @@ usage(void) (void)fprintf(stderr, "usage:\t%s%s\n\t%s%s\n\t%s%s\n\t%s%s\n\t%s%s\n\t%s%s\n", - __progname, " -C [-c" kerbflag "Mvy] [-b blocksize] [-D filesystem] [-f file] [-s fileno]", - __progname, " -i [-ch" kerbflag "mMuvy] [-b blocksize] [-f file] [-s fileno]", - __progname, " -r [-c" kerbflag "Muvy] [-b blocksize] [-f file] " qfaflag "[-s fileno] [-T directory]", - __progname, " -R [-c" kerbflag "Muvy] [-b blocksize] [-f file] [-s fileno] [-T directory]", - __progname, " -t [-ch" kerbflag "Muvy] [-b blocksize] [-f file] [-s fileno] [-X filelist] [file ...]", - __progname, " -x [-ch" kerbflag "mMuvy] [-b blocksize] [-f file] [-s fileno] [-X filelist] [file ...]"); + __progname, " -C [-c" kerbflag "lMvVy] [-b blocksize] [-D filesystem] [-f file] [-F script] [-L limit] [-s fileno]", + __progname, " -i [-ach" kerbflag "lmMuvVy] [-b blocksize] [-f file] [-F script] " qfaflag "[-s fileno]", + __progname, " -r [-c" kerbflag "lMuvVy] [-b blocksize] [-f file] [-F script] [-s fileno] [-T directory]", + __progname, " -R [-c" kerbflag "lMuvVy] [-b blocksize] [-f file] [-F script] [-s fileno] [-T directory]", + __progname, " -t [-ch" kerbflag "lMuvVy] [-b blocksize] [-f file] [-F script] " qfaflag "[-s fileno] [-X filelist] [file ...]", + __progname, " -x [-ach" kerbflag "lmMuvVy] [-b blocksize] [-f file] [-F script] " qfaflag "[-s fileno] [-X filelist] [file ...]"); exit(1); } @@ -537,6 +588,8 @@ obsolete(int *argcp, char **argvp[]) case 'b': case 'D': case 'f': + case 'F': + case 'L': case 'Q': case 's': case 'T':