Annotation of 43BSDReno/sbin/restore/main.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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