Annotation of 43BSD/etc/restore/main.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1983 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: char copyright[] =
                      9: "@(#) Copyright (c) 1983 Regents of the University of California.\n\
                     10:  All rights reserved.\n";
                     11: #endif not lint
                     12: 
                     13: #ifndef lint
                     14: static char sccsid[] = "@(#)main.c     5.3 (Berkeley) 4/23/86";
                     15: #endif not lint
                     16: 
                     17: /*
                     18:  *     Modified to recursively extract all files within a subtree
                     19:  *     (supressed by the h option) and recreate the heirarchical
                     20:  *     structure of that subtree and move extracted files to their
                     21:  *     proper homes (supressed by the m option).
                     22:  *     Includes the s (skip files) option for use with multiple
                     23:  *     dumps on a single tape.
                     24:  *     8/29/80         by Mike Litzkow
                     25:  *
                     26:  *     Modified to work on the new file system and to recover from
                     27:  *     tape read errors.
                     28:  *     1/19/82         by Kirk McKusick
                     29:  *
                     30:  *     Full incremental restore running entirely in user code and
                     31:  *     interactive tape browser.
                     32:  *     1/19/83         by Kirk McKusick
                     33:  */
                     34: 
                     35: #include "restore.h"
                     36: #include <protocols/dumprestore.h>
                     37: #include <signal.h>
                     38: 
                     39: int    bflag = 0, cvtflag = 0, dflag = 0, vflag = 0, yflag = 0;
                     40: int    hflag = 1, mflag = 1;
                     41: char   command = '\0';
                     42: long   dumpnum = 1;
                     43: long   volno = 0;
                     44: long   ntrec;
                     45: char   *dumpmap;
                     46: char   *clrimap;
                     47: ino_t  maxino;
                     48: time_t dumptime;
                     49: time_t dumpdate;
                     50: FILE   *terminal;
                     51: 
                     52: main(argc, argv)
                     53:        int argc;
                     54:        char *argv[];
                     55: {
                     56:        register char *cp;
                     57:        ino_t ino;
                     58:        char *inputdev = "/dev/rmt8";
                     59:        char *symtbl = "./restoresymtable";
                     60:        char name[MAXPATHLEN];
                     61:        int (*signal())();
                     62:        extern int onintr();
                     63: 
                     64:        if (signal(SIGINT, onintr) == SIG_IGN)
                     65:                (void) signal(SIGINT, SIG_IGN);
                     66:        if (signal(SIGTERM, onintr) == SIG_IGN)
                     67:                (void) signal(SIGTERM, SIG_IGN);
                     68:        setlinebuf(stderr);
                     69:        if (argc < 2) {
                     70: usage:
                     71:                fprintf(stderr, "Usage:\n%s%s%s%s%s",
                     72:                        "\trestore tfhsvy [file file ...]\n",
                     73:                        "\trestore xfhmsvy [file file ...]\n",
                     74:                        "\trestore ifhmsvy\n",
                     75:                        "\trestore rfsvy\n",
                     76:                        "\trestore Rfsvy\n");
                     77:                done(1);
                     78:        }
                     79:        argv++;
                     80:        argc -= 2;
                     81:        command = '\0';
                     82:        for (cp = *argv++; *cp; cp++) {
                     83:                switch (*cp) {
                     84:                case '-':
                     85:                        break;
                     86:                case 'c':
                     87:                        cvtflag++;
                     88:                        break;
                     89:                case 'd':
                     90:                        dflag++;
                     91:                        break;
                     92:                case 'h':
                     93:                        hflag = 0;
                     94:                        break;
                     95:                case 'm':
                     96:                        mflag = 0;
                     97:                        break;
                     98:                case 'v':
                     99:                        vflag++;
                    100:                        break;
                    101:                case 'y':
                    102:                        yflag++;
                    103:                        break;
                    104:                case 'f':
                    105:                        if (argc < 1) {
                    106:                                fprintf(stderr, "missing device specifier\n");
                    107:                                done(1);
                    108:                        }
                    109:                        inputdev = *argv++;
                    110:                        argc--;
                    111:                        break;
                    112:                case 'b':
                    113:                        /*
                    114:                         * change default tape blocksize
                    115:                         */
                    116:                        bflag++;
                    117:                        if (argc < 1) {
                    118:                                fprintf(stderr, "missing block size\n");
                    119:                                done(1);
                    120:                        }
                    121:                        ntrec = atoi(*argv++);
                    122:                        if (ntrec <= 0) {
                    123:                                fprintf(stderr, "Block size must be a positive integer\n");
                    124:                                done(1);
                    125:                        }
                    126:                        argc--;
                    127:                        break;
                    128:                case 's':
                    129:                        /*
                    130:                         * dumpnum (skip to) for multifile dump tapes
                    131:                         */
                    132:                        if (argc < 1) {
                    133:                                fprintf(stderr, "missing dump number\n");
                    134:                                done(1);
                    135:                        }
                    136:                        dumpnum = atoi(*argv++);
                    137:                        if (dumpnum <= 0) {
                    138:                                fprintf(stderr, "Dump number must be a positive integer\n");
                    139:                                done(1);
                    140:                        }
                    141:                        argc--;
                    142:                        break;
                    143:                case 't':
                    144:                case 'R':
                    145:                case 'r':
                    146:                case 'x':
                    147:                case 'i':
                    148:                        if (command != '\0') {
                    149:                                fprintf(stderr,
                    150:                                        "%c and %c are mutually exclusive\n",
                    151:                                        *cp, command);
                    152:                                goto usage;
                    153:                        }
                    154:                        command = *cp;
                    155:                        break;
                    156:                default:
                    157:                        fprintf(stderr, "Bad key character %c\n", *cp);
                    158:                        goto usage;
                    159:                }
                    160:        }
                    161:        if (command == '\0') {
                    162:                fprintf(stderr, "must specify i, t, r, R, or x\n");
                    163:                goto usage;
                    164:        }
                    165:        setinput(inputdev);
                    166:        if (argc == 0) {
                    167:                argc = 1;
                    168:                *--argv = ".";
                    169:        }
                    170:        switch (command) {
                    171:        /*
                    172:         * Interactive mode.
                    173:         */
                    174:        case 'i':
                    175:                setup();
                    176:                extractdirs(1);
                    177:                initsymtable((char *)0);
                    178:                runcmdshell();
                    179:                done(0);
                    180:        /*
                    181:         * Incremental restoration of a file system.
                    182:         */
                    183:        case 'r':
                    184:                setup();
                    185:                if (dumptime > 0) {
                    186:                        /*
                    187:                         * This is an incremental dump tape.
                    188:                         */
                    189:                        vprintf(stdout, "Begin incremental restore\n");
                    190:                        initsymtable(symtbl);
                    191:                        extractdirs(1);
                    192:                        removeoldleaves();
                    193:                        vprintf(stdout, "Calculate node updates.\n");
                    194:                        treescan(".", ROOTINO, nodeupdates);
                    195:                        findunreflinks();
                    196:                        removeoldnodes();
                    197:                } else {
                    198:                        /*
                    199:                         * This is a level zero dump tape.
                    200:                         */
                    201:                        vprintf(stdout, "Begin level 0 restore\n");
                    202:                        initsymtable((char *)0);
                    203:                        extractdirs(1);
                    204:                        vprintf(stdout, "Calculate extraction list.\n");
                    205:                        treescan(".", ROOTINO, nodeupdates);
                    206:                }
                    207:                createleaves(symtbl);
                    208:                createlinks();
                    209:                setdirmodes();
                    210:                checkrestore();
                    211:                if (dflag) {
                    212:                        vprintf(stdout, "Verify the directory structure\n");
                    213:                        treescan(".", ROOTINO, verifyfile);
                    214:                }
                    215:                dumpsymtable(symtbl, (long)1);
                    216:                done(0);
                    217:        /*
                    218:         * Resume an incremental file system restoration.
                    219:         */
                    220:        case 'R':
                    221:                initsymtable(symtbl);
                    222:                skipmaps();
                    223:                skipdirs();
                    224:                createleaves(symtbl);
                    225:                createlinks();
                    226:                setdirmodes();
                    227:                checkrestore();
                    228:                dumpsymtable(symtbl, (long)1);
                    229:                done(0);
                    230:        /*
                    231:         * List contents of tape.
                    232:         */
                    233:        case 't':
                    234:                setup();
                    235:                extractdirs(0);
                    236:                initsymtable((char *)0);
                    237:                while (argc--) {
                    238:                        canon(*argv++, name);
                    239:                        ino = dirlookup(name);
                    240:                        if (ino == 0)
                    241:                                continue;
                    242:                        treescan(name, ino, listfile);
                    243:                }
                    244:                done(0);
                    245:        /*
                    246:         * Batch extraction of tape contents.
                    247:         */
                    248:        case 'x':
                    249:                setup();
                    250:                extractdirs(1);
                    251:                initsymtable((char *)0);
                    252:                while (argc--) {
                    253:                        canon(*argv++, name);
                    254:                        ino = dirlookup(name);
                    255:                        if (ino == 0)
                    256:                                continue;
                    257:                        if (mflag)
                    258:                                pathcheck(name);
                    259:                        treescan(name, ino, addfile);
                    260:                }
                    261:                createfiles();
                    262:                createlinks();
                    263:                setdirmodes();
                    264:                if (dflag)
                    265:                        checkrestore();
                    266:                done(0);
                    267:        }
                    268: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.