-/* Copyright (c) 1983 Regents of the University of California */
+/*
+ * Copyright (c) 1983 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * %sccs.include.redist.c%
+ */
+
+#ifndef lint
+char copyright[] =
+"@(#) Copyright (c) 1983 The Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif /* not lint */
#ifndef lint
-static char sccsid[] = "@(#)main.c 3.7 (Berkeley) 83/03/08";
-#endif
+static char sccsid[] = "@(#)main.c 5.8 (Berkeley) %G%";
+#endif /* not lint */
/*
* Modified to recursively extract all files within a subtree
* tape read errors.
* 1/19/82 by Kirk McKusick
*
- * Full incremental restore running entirely in user code.
+ * Full incremental restore running entirely in user code and
+ * interactive tape browser.
* 1/19/83 by Kirk McKusick
*/
#include "restore.h"
-#include <signal.h>
+#include <protocols/dumprestore.h>
+#include <sys/signal.h>
+#include "pathnames.h"
-int cvtflag = 0, dflag = 0, vflag = 0, yflag = 0;
-int hflag = 1, mflag = 1;
+int bflag = 0, cvtflag = 0, dflag = 0, vflag = 0, yflag = 0;
+int hflag = 1, mflag = 1, Nflag = 0;
char command = '\0';
long dumpnum = 1;
long volno = 0;
+long ntrec;
char *dumpmap;
char *clrimap;
ino_t maxino;
time_t dumptime;
time_t dumpdate;
+FILE *terminal;
main(argc, argv)
int argc;
{
register char *cp;
ino_t ino;
- char *inputdev = "/dev/rmt8";
+ char *inputdev = _PATH_DEFTAPE;
char *symtbl = "./restoresymtable";
- char *dirmodefile = "./dirmodes";
- char name[BUFSIZ];
- int (*signal())();
- extern int onintr();
+ char name[MAXPATHLEN];
+ void onintr();
if (signal(SIGINT, onintr) == SIG_IGN)
(void) signal(SIGINT, SIG_IGN);
setlinebuf(stderr);
if (argc < 2) {
usage:
- fprintf(stderr, "Usage: restor xtfhmsvy file file... or restor rRfsvy\n");
+ fprintf(stderr, "Usage:\n%s%s%s%s%s",
+ "\trestore tfhsvy [file file ...]\n",
+ "\trestore xfhmsvy [file file ...]\n",
+ "\trestore ifhmsvy\n",
+ "\trestore rfsvy\n",
+ "\trestore Rfsvy\n");
done(1);
}
argv++;
case 'm':
mflag = 0;
break;
+ case 'N':
+ Nflag++;
+ break;
case 'v':
vflag++;
break;
inputdev = *argv++;
argc--;
break;
+ case 'b':
+ /*
+ * change default tape blocksize
+ */
+ bflag++;
+ if (argc < 1) {
+ fprintf(stderr, "missing block size\n");
+ done(1);
+ }
+ ntrec = atoi(*argv++);
+ if (ntrec <= 0) {
+ fprintf(stderr, "Block size must be a positive integer\n");
+ done(1);
+ }
+ argc--;
+ break;
case 's':
/*
* dumpnum (skip to) for multifile dump tapes
case 'R':
case 'r':
case 'x':
+ case 'i':
if (command != '\0') {
fprintf(stderr,
"%c and %c are mutually exclusive\n",
}
}
if (command == '\0') {
- fprintf(stderr, "must specify t, r, R, or x\n");
+ fprintf(stderr, "must specify i, t, r, R, or x\n");
goto usage;
}
setinput(inputdev);
*--argv = ".";
}
switch (command) {
-
- case 't':
+ /*
+ * Interactive mode.
+ */
+ case 'i':
setup();
- extractdirs((char *)0);
- while (argc--) {
- canon(*argv++, name);
- if ((ino = psearch(name)) == 0 ||
- BIT(ino, dumpmap) == 0) {
- fprintf(stderr, "%s: not on tape\n", name);
- continue;
- }
- if (hflag)
- treescan(name, ino, listfile);
- else
- listfile(name, ino, inodetype(ino));
- }
- done(0);
-
- case 'x':
- setup();
- extractdirs(dirmodefile);
+ extractdirs(1);
initsymtable((char *)0);
- while (argc--) {
- canon(*argv++, name);
- if ((ino = psearch(name)) == 0 ||
- BIT(ino, dumpmap) == 0) {
- fprintf(stderr, "%s: not on tape\n", name);
- continue;
- }
- if (mflag)
- pathcheck(name);
- if (hflag)
- treescan(name, ino, addfile);
- else
- addfile(name, ino, inodetype(ino));
- }
- createfiles();
- createlinks();
- setdirmodes(dirmodefile);
- if (dflag)
- checkrestore();
+ runcmdshell();
done(0);
-
+ /*
+ * Incremental restoration of a file system.
+ */
case 'r':
setup();
if (dumptime > 0) {
*/
vprintf(stdout, "Begin incremental restore\n");
initsymtable(symtbl);
- extractdirs(dirmodefile);
+ extractdirs(1);
removeoldleaves();
vprintf(stdout, "Calculate node updates.\n");
treescan(".", ROOTINO, nodeupdates);
*/
vprintf(stdout, "Begin level 0 restore\n");
initsymtable((char *)0);
- extractdirs(dirmodefile);
+ extractdirs(1);
vprintf(stdout, "Calculate extraction list.\n");
treescan(".", ROOTINO, nodeupdates);
}
createleaves(symtbl);
createlinks();
- setdirmodes(dirmodefile);
+ setdirmodes();
checkrestore();
if (dflag) {
vprintf(stdout, "Verify the directory structure\n");
}
dumpsymtable(symtbl, (long)1);
done(0);
-
+ /*
+ * Resume an incremental file system restoration.
+ */
case 'R':
initsymtable(symtbl);
skipmaps();
skipdirs();
createleaves(symtbl);
createlinks();
- setdirmodes(dirmodefile);
+ setdirmodes();
checkrestore();
dumpsymtable(symtbl, (long)1);
done(0);
+ /*
+ * List contents of tape.
+ */
+ case 't':
+ setup();
+ extractdirs(0);
+ initsymtable((char *)0);
+ while (argc--) {
+ canon(*argv++, name);
+ ino = dirlookup(name);
+ if (ino == 0)
+ continue;
+ treescan(name, ino, listfile);
+ }
+ done(0);
+ /*
+ * Batch extraction of tape contents.
+ */
+ case 'x':
+ setup();
+ extractdirs(1);
+ initsymtable((char *)0);
+ while (argc--) {
+ canon(*argv++, name);
+ ino = dirlookup(name);
+ if (ino == 0)
+ continue;
+ if (mflag)
+ pathcheck(name);
+ treescan(name, ino, addfile);
+ }
+ createfiles();
+ createlinks();
+ setdirmodes();
+ if (dflag)
+ checkrestore();
+ done(0);
}
}