X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=restore%2Fmain.c;h=1843d4b431fe955439baf80427bd85b3810121f2;hb=43460f04f3920ae39f345a2fb39d000a890a4283;hp=6f4098d36941c38157225f372c871be320277640;hpb=1227625a12a66e0ded78a1997c2d23f23202a382;p=dump.git diff --git a/restore/main.c b/restore/main.c index 6f4098d..1843d4b 100644 --- a/restore/main.c +++ b/restore/main.c @@ -1,8 +1,9 @@ /* * Ported to Linux's Second Extended File System as part of the * dump and restore backup suit - * Remy Card , 1994, 1995, 1996 - * + * Remy Card , 1994-1997 + * Stelian Pop , 1999-2000 + * Stelian Pop - AlcĂ´ve , 2000 */ /* @@ -39,34 +40,28 @@ */ #ifndef lint -static char copyright[] = -"@(#) Copyright (c) 1983, 1993\n\ - The Regents of the University of California. All rights reserved.\n"; -#endif /* not lint */ - -#ifndef lint -static char sccsid[] = "@(#)main.c 8.6 (Berkeley) 5/4/95"; +static const char rcsid[] = + "$Id: main.c,v 1.16 2001/02/21 16:13:05 stelian Exp $"; #endif /* not lint */ +#include #include -#include #include +#include #ifdef __linux__ #include #include +#include +#include #else /* __linux__ */ #include -#include #endif /* __linux__ */ #include -#include -#include -#include +#include #include #include -#include #include #ifdef __linux__ @@ -79,7 +74,9 @@ static char sccsid[] = "@(#)main.c 8.6 (Berkeley) 5/4/95"; #include "extern.h" int bflag = 0, cvtflag = 0, dflag = 0, vflag = 0, yflag = 0; -int hflag = 1, mflag = 1, Nflag = 0; +int hflag = 1, mflag = 1, Nflag = 0, zflag = 0; +int uflag = 0; +int dokerberos = 0; char command = '\0'; long dumpnum = 1; long volno = 0; @@ -90,9 +87,11 @@ ino_t maxino; time_t dumptime; time_t dumpdate; FILE *terminal; +char *tmpdir; int compare_ignore_not_found; -char *filesys = NULL; -char *tmpdir = _PATH_TMP; +int compare_errors; +char filesys[NAMELEN]; +static const char *stdin_opt = NULL; #ifdef __linux__ char *__progname; @@ -100,27 +99,44 @@ char *__progname; static void obsolete __P((int *, char **[])); static void usage __P((void)); +static void use_stdin __P((const char *)); int -main(argc, argv) - int argc; - char *argv[]; +main(int argc, char *argv[]) { int ch; ino_t ino; char *inputdev = _PATH_DEFTAPE; char *symtbl = "./restoresymtable"; char *p, name[MAXPATHLEN]; + FILE *filelist = NULL; + char fname[MAXPATHLEN]; - if (argc < 2) - usage(); - + /* Temp files should *not* be readable. We set permissions later. */ + (void) umask(077); + filesys[0] = '\0'; #ifdef __linux__ __progname = argv[0]; #endif + if (argc < 2) + usage(); + + if ((inputdev = getenv("TAPE")) == NULL) + inputdev = _PATH_DEFTAPE; + if ((tmpdir = getenv("TMPDIR")) == NULL) + tmpdir = _PATH_TMP; + if ((tmpdir = strdup(tmpdir)) == NULL) + err(1, "malloc tmpdir"); + for (p = tmpdir + strlen(tmpdir) - 1; p >= tmpdir && *p == '/'; p--) + ; obsolete(&argc, &argv); - while ((ch = getopt(argc, argv, "b:CcdD:f:himNRrs:tT:vxy")) != EOF) +#ifdef KERBEROS +#define optlist "b:CcdD:f:hikmMNRrs:tT:uvxX:y" +#else +#define optlist "b:CcdD:f:himMNRrs:tT:uvxX:y" +#endif + while ((ch = getopt(argc, argv, optlist)) != -1) switch(ch) { case 'b': /* Change default tape blocksize. */ @@ -135,7 +151,8 @@ main(argc, argv) cvtflag = 1; break; case 'D': - filesys = optarg; + strncpy(filesys, optarg, NAMELEN); + filesys[NAMELEN - 1] = '\0'; break; case 'T': tmpdir = optarg; @@ -144,11 +161,18 @@ main(argc, argv) dflag = 1; break; case 'f': + if( !strcmp(optarg,"-") ) + use_stdin("-f"); inputdev = optarg; break; case 'h': hflag = 0; break; +#ifdef KERBEROS + case 'k': + dokerberos = 1; + break; +#endif case 'C': case 'i': case 'R': @@ -164,6 +188,9 @@ main(argc, argv) case 'm': mflag = 0; break; + case 'M': + Mflag = 1; + break; case 'N': Nflag = 1; break; @@ -175,9 +202,21 @@ main(argc, argv) if (dumpnum <= 0) errx(1, "dump number must be greater than 0"); break; + case 'u': + uflag = 1; + break; case 'v': vflag = 1; break; + case 'X': + if( !strcmp(optarg,"-") ) { + use_stdin("-X"); + filelist = stdin; + } + else + if ( !(filelist = fopen(optarg,"r")) ) + errx(1, "can't open file for reading -- %s", optarg); + break; case 'y': yflag = 1; break; @@ -196,9 +235,11 @@ main(argc, argv) (void) signal(SIGTERM, SIG_IGN); setlinebuf(stderr); + atexit(cleanup); + setinput(inputdev); - if (argc == 0) { + if (argc == 0 && !filelist) { argc = 1; *--argv = "."; } @@ -210,27 +251,25 @@ main(argc, argv) case 'C': { struct stat stbuf; - vprintf(stdout, "Begin compare restore\n"); + 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) { - fprintf(stderr, "cannot stat directory %s: %s\n", - filesys, strerror(errno)); - exit(1); - } else { - if (chdir(filesys) < 0) { - fprintf(stderr, "cannot cd to %s: %s\n", - filesys, strerror(errno)); - exit(1); - } - } + if (stat(filesys, &stbuf) < 0) + err(1, "cannot stat directory %s", filesys); + if (chdir(filesys) < 0) + err(1, "cannot cd to %s", filesys); compare_ignore_not_found = dumptime > 0; initsymtable((char *)0); extractdirs(0); treescan(".", ROOTINO, nodeupdates); compareleaves(); checkrestore(); + if (compare_errors) { + printf("Some files were modified!\n"); + exit(2); + } break; } @@ -252,11 +291,11 @@ main(argc, argv) /* * This is an incremental dump tape. */ - vprintf(stdout, "Begin incremental restore\n"); + Vprintf(stdout, "Begin incremental restore\n"); initsymtable(symtbl); extractdirs(1); removeoldleaves(); - vprintf(stdout, "Calculate node updates.\n"); + Vprintf(stdout, "Calculate node updates.\n"); treescan(".", ROOTINO, nodeupdates); findunreflinks(); removeoldnodes(); @@ -264,10 +303,10 @@ main(argc, argv) /* * This is a level zero dump tape. */ - vprintf(stdout, "Begin level 0 restore\n"); + Vprintf(stdout, "Begin level 0 restore\n"); initsymtable((char *)0); extractdirs(1); - vprintf(stdout, "Calculate extraction list.\n"); + Vprintf(stdout, "Calculate extraction list.\n"); treescan(".", ROOTINO, nodeupdates); } createleaves(symtbl); @@ -275,7 +314,7 @@ main(argc, argv) setdirmodes(FORCE); checkrestore(); if (dflag) { - vprintf(stdout, "Verify the directory structure\n"); + Vprintf(stdout, "Verify the directory structure\n"); treescan(".", ROOTINO, verifyfile); } dumpsymtable(symtbl, (long)1); @@ -293,6 +332,23 @@ main(argc, argv) checkrestore(); dumpsymtable(symtbl, (long)1); break; + +/* handle file names from either text file (-X) or the command line */ +#define NEXTFILE(p) \ + p = NULL; \ + if (argc) { \ + --argc; \ + p = *argv++; \ + } \ + else if (filelist) { \ + if ((p = fgets(fname, MAXPATHLEN, filelist))) { \ + if ( *p && *(p + strlen(p) - 1) == '\n' ) /* possible null string */ \ + *(p + strlen(p) - 1) = '\0'; \ + if ( !*p ) /* skip empty lines */ \ + continue; \ + } \ + } + /* * List contents of tape. */ @@ -300,8 +356,11 @@ main(argc, argv) setup(); extractdirs(0); initsymtable((char *)0); - while (argc--) { - canon(*argv++, name); + for (;;) { + NEXTFILE(p); + if (!p) + break; + canon(p, name, sizeof(name)); ino = dirlookup(name); if (ino == 0) continue; @@ -315,8 +374,11 @@ main(argc, argv) setup(); extractdirs(1); initsymtable((char *)0); - while (argc--) { - canon(*argv++, name); + for (;;) { + NEXTFILE(p); + if (!p) + break; + canon(p, name, sizeof(name)); ino = dirlookup(name); if (ino == 0) continue; @@ -331,19 +393,29 @@ main(argc, argv) checkrestore(); break; } - done(0); + exit(0); /* NOTREACHED */ + return 0; /* gcc shut up */ } static void -usage() +usage(void) { - (void)fprintf(stderr, "usage:\t%s\n\t%s\n\t%s\n\t%s\n\t%s\n", - "restore -i [-chmvy] [-b blocksize] [-f file] [-s fileno]", - "restore -r [-cvy] [-b blocksize] [-f file] [-s fileno]", - "restore -R [-cvy] [-b blocksize] [-f file] [-s fileno]", - "restore -x [-chmvy] [-b blocksize] [-f file] [-s fileno] [file ...]", "restore -t [-chvy] [-b blocksize] [-f file] [-s fileno] [file ...]"); - done(1); +#ifdef KERBEROS +#define kerbflag "k" +#else +#define kerbflag +#endif + (void)fprintf(stderr, + "%s %s\n", __progname, _DUMP_VERSION); + (void)fprintf(stderr, + "usage:\t%s%s\n\t%s%s\n\t%s%s\n\t%s%s\n\t%s%s\n", + __progname, " -i [-ch" kerbflag "mMuvy] [-b blocksize] [-f file] [-s fileno]", + __progname, " -r [-c" kerbflag "Muvy] [-b blocksize] [-f file] [-s fileno]", + __progname, " -R [-c" kerbflag "Muvy] [-b blocksize] [-f file] [-s fileno]", + __progname, " -x [-ch" kerbflag "mMuvy] [-b blocksize] [-f file] [-s fileno] [-X filelist] [file ...]", + __progname, " -t [-ch" kerbflag "Muvy] [-b blocksize] [-f file] [-s fileno] [-X filelist] [file ...]"); + exit(1); } /* @@ -352,12 +424,10 @@ usage() * getopt(3) will like. */ static void -obsolete(argcp, argvp) - int *argcp; - char **argvp[]; +obsolete(int *argcp, char **argvp[]) { int argc, flags; - char *ap, **argv, *flagsp, **nargv, *p; + char *ap, **argv, *flagsp = NULL, **nargv, *p = NULL; /* Setup. */ argv = *argvp; @@ -371,22 +441,25 @@ obsolete(argcp, argvp) /* Allocate space for new arguments. */ if ((*argvp = nargv = malloc((argc + 1) * sizeof(char *))) == NULL || (p = flagsp = malloc(strlen(ap) + 2)) == NULL) - err(1, NULL); + err(1, "malloc args"); *nargv++ = *argv; - argv += 2; + argv += 2, argc -= 2; for (flags = 0; *ap; ++ap) { switch (*ap) { case 'b': + case 'D': case 'f': case 's': + case 'T': + case 'X': if (*argv == NULL) { warnx("option requires an argument -- %c", *ap); usage(); } if ((nargv[0] = malloc(strlen(*argv) + 2 + 1)) == NULL) - err(1, NULL); + err(1, "malloc arg"); nargv[0][0] = '-'; nargv[0][1] = *ap; (void)strcpy(&nargv[0][2], *argv); @@ -410,8 +483,21 @@ obsolete(argcp, argvp) } /* Copy remaining arguments. */ - while (*nargv++ = *argv++); + while ((*nargv++ = *argv++)); /* Update argument count. */ *argcp = nargv - *argvp - 1; } + +/* + * use_stdin -- + * reserve stdin for opt (avoid conflicts) + */ +void +use_stdin(const char *opt) +{ + if (stdin_opt) + errx(1, "can't handle standard input for both %s and %s", + stdin_opt, opt); + stdin_opt = opt; +}