X-Git-Url: https://git.wh0rd.org/?p=dump.git;a=blobdiff_plain;f=restore%2Fmain.c;h=b3a09ff9c53237f11d1023fdafe2cff958864b20;hp=6f4098d36941c38157225f372c871be320277640;hb=ec387a1267f4cac7625cd5b6d1c1f080d39085b3;hpb=1227625a12a66e0ded78a1997c2d23f23202a382 diff --git a/restore/main.c b/restore/main.c index 6f4098d..b3a09ff 100644 --- a/restore/main.c +++ b/restore/main.c @@ -1,7 +1,8 @@ /* * 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 * */ @@ -36,37 +37,27 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * $Id: main.c,v 1.5 1999/10/11 13:31:13 stelian Exp $ */ -#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"; -#endif /* not lint */ - #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__ @@ -80,6 +71,8 @@ static char sccsid[] = "@(#)main.c 8.6 (Berkeley) 5/4/95"; int bflag = 0, cvtflag = 0, dflag = 0, vflag = 0, yflag = 0; int hflag = 1, mflag = 1, Nflag = 0; +int uflag = 0; +int dokerberos = 0; char command = '\0'; long dumpnum = 1; long volno = 0; @@ -90,9 +83,9 @@ 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; #ifdef __linux__ char *__progname; @@ -102,9 +95,7 @@ static void obsolete __P((int *, char **[])); static void usage __P((void)); int -main(argc, argv) - int argc; - char *argv[]; +main(int argc, char *argv[]) { int ch; ino_t ino; @@ -112,15 +103,31 @@ main(argc, argv) char *symtbl = "./restoresymtable"; char *p, name[MAXPATHLEN]; - if (argc < 2) - usage(); + /* Temp files should *not* be readable. We set permissions later. */ + (void) umask(077); #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:hikmNRrs:tT:uvxy" +#else +#define optlist "b:CcdD:f:himNRrs:tT:uvxy" +#endif + while ((ch = getopt(argc, argv, optlist)) != -1) switch(ch) { case 'b': /* Change default tape blocksize. */ @@ -149,6 +156,11 @@ main(argc, argv) case 'h': hflag = 0; break; +#ifdef KERBEROS + case 'k': + dokerberos = 1; + break; +#endif case 'C': case 'i': case 'R': @@ -175,6 +187,9 @@ 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; @@ -196,6 +211,8 @@ main(argc, argv) (void) signal(SIGTERM, SIG_IGN); setlinebuf(stderr); + atexit(cleanup); + setinput(inputdev); if (argc == 0) { @@ -210,21 +227,14 @@ 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; 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); @@ -252,11 +262,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 +274,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 +285,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); @@ -301,7 +311,7 @@ main(argc, argv) extractdirs(0); initsymtable((char *)0); while (argc--) { - canon(*argv++, name); + canon(*argv++, name, sizeof(name)); ino = dirlookup(name); if (ino == 0) continue; @@ -316,7 +326,7 @@ main(argc, argv) extractdirs(1); initsymtable((char *)0); while (argc--) { - canon(*argv++, name); + canon(*argv++, name, sizeof(name)); ino = dirlookup(name); if (ino == 0) continue; @@ -331,19 +341,26 @@ main(argc, argv) checkrestore(); break; } - done(0); + exit(0); /* NOTREACHED */ + return 0; /* gcc shut up */ } static void -usage() +usage(void) { +#ifdef KERBEROS +#define kerbflag "k" +#else +#define kerbflag +#endif (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); + "restore -i [-ch" kerbflag "muvy] [-b blocksize] [-f file] [-s fileno]", + "restore -r [-c" kerbflag "uvy] [-b blocksize] [-f file] [-s fileno]", + "restore -R [-c" kerbflag "uvy] [-b blocksize] [-f file] [-s fileno]", + "restore -x [-ch" kerbflag "muvy] [-b blocksize] [-f file] [-s fileno] [file ...]", + "restore -t [-ch" kerbflag "kuvy] [-b blocksize] [-f file] [-s fileno] [file ...]"); + exit(1); } /* @@ -352,12 +369,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,10 +386,10 @@ 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) { @@ -386,7 +401,7 @@ obsolete(argcp, argvp) 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,7 +425,7 @@ obsolete(argcp, argvp) } /* Copy remaining arguments. */ - while (*nargv++ = *argv++); + while ((*nargv++ = *argv++)); /* Update argument count. */ *argcp = nargv - *argvp - 1;