Annotation of 3BSD/cmd/dump.c, revision 1.1.1.1

1.1       root        1: #define        NI      16
                      2: #define        DIRPB   (BSIZE/sizeof(struct direct))
                      3: 
                      4: #include <stdio.h>
                      5: #include <sys/param.h>
                      6: #include <sys/inode.h>
                      7: #include <sys/ino.h>
                      8: #include <sys/fblk.h>
                      9: #include <sys/filsys.h>
                     10: #include <sys/dir.h>
                     11: #include <dumprestor.h>
                     12: 
                     13: #define        MWORD(m,i) (m[(unsigned)(i-1)/MLEN])
                     14: #define        MBIT(i) (1<<((unsigned)(i-1)%MLEN))
                     15: #define        BIS(i,w)        (MWORD(w,i) |=  MBIT(i))
                     16: #define        BIC(i,w)        (MWORD(w,i) &= ~MBIT(i))
                     17: #define        BIT(i,w)        (MWORD(w,i) & MBIT(i))
                     18: 
                     19: struct filsys  sblock;
                     20: struct dinode  itab[INOPB*NI];
                     21: short  clrmap[MSIZ];
                     22: short  dirmap[MSIZ];
                     23: short  nodmap[MSIZ];
                     24: 
                     25: char   *disk;
                     26: char   *tape;
                     27: char   *increm;
                     28: char   incno;
                     29: int    uflag;
                     30: int    fi;
                     31: int    to;
                     32: ino_t  ino;
                     33: int    nsubdir;
                     34: int    ntape;
                     35: int    nadded;
                     36: int    dadded;
                     37: int    density = 160;
                     38: 
                     39: char   *ctime();
                     40: char   *prdate();
                     41: long   atol();
                     42: int    fi;
                     43: long   tsize;
                     44: long   esize;
                     45: long   asize;
                     46: int    mark();
                     47: int    add();
                     48: int    dump();
                     49: int    tapsrec();
                     50: int    dmpspc();
                     51: int    dsrch();
                     52: int    nullf();
                     53: 
                     54: #define        HOUR    (60L*60L)
                     55: #define        DAY     (24L*HOUR)
                     56: #define        YEAR    (365L*DAY)
                     57: 
                     58: main(argc, argv)
                     59: char *argv[];
                     60: {
                     61:        char *arg;
                     62:        register i;
                     63: 
                     64:        time(&spcl.c_date);
                     65: 
                     66:        tsize = 2300L*12L*10L;
                     67:        tape = "/dev/rmt1";
                     68:        disk = "/dev/rrp1g";
                     69:        increm = "/etc/ddate";
                     70:        incno = '9';
                     71:        uflag = 0;
                     72:        arg = "u";
                     73:        if(argc > 1) {
                     74:                argv++;
                     75:                argc--;
                     76:                arg = *argv;
                     77:        }
                     78:        while(*arg)
                     79:        switch (*arg++) {
                     80: 
                     81:        case 'f':
                     82:                if(argc > 1) {
                     83:                        argv++;
                     84:                        argc--;
                     85:                        tape = *argv;
                     86:                }
                     87:                break;
                     88: 
                     89:        case 'd':
                     90:                if (argc > 1) {
                     91:                        argv++;
                     92:                        argc--;
                     93:                        density = atoi(*argv);
                     94:                }
                     95:                break;
                     96: 
                     97:        case 's':
                     98:                if(argc > 1) {
                     99:                        argv++;
                    100:                        argc--;
                    101:                        tsize = atol(*argv);
                    102:                        tsize *= 12L*10L;
                    103:                }
                    104:                break;
                    105: 
                    106:        case '0':
                    107:        case '1':
                    108:        case '2':
                    109:        case '3':
                    110:        case '4':
                    111:        case '5':
                    112:        case '6':
                    113:        case '7':
                    114:        case '8':
                    115:        case '9':
                    116:                incno = arg[-1];
                    117:                break;
                    118: 
                    119:        case 'u':
                    120:                uflag++;
                    121:                break;
                    122: 
                    123:        default:
                    124:                printf("bad key '%c%'\n", arg[-1]);
                    125:                exit(1);
                    126:        }
                    127:        if(argc > 1) {
                    128:                argv++;
                    129:                argc--;
                    130:                disk = *argv;
                    131:        }
                    132: 
                    133:        getitime();
                    134:        printf("     date = %s\n", prdate(spcl.c_date));
                    135:        printf("dump date = %s\n", prdate(spcl.c_ddate));
                    136:        printf("dumping %s to %s\n", disk, tape);
                    137:        fi = open(disk, 0);
                    138:        if(fi < 0) {
                    139:                printf("dump: cannot open %s\n", disk);
                    140:                exit(1);
                    141:        }
                    142:        otape();
                    143:        printf("I\n");
                    144:        esize = 0;
                    145:        CLR(clrmap);
                    146:        CLR(dirmap);
                    147:        CLR(nodmap);
                    148: 
                    149:        pass(mark, (short *)NULL);
                    150:        do {
                    151:                printf("II\n");
                    152:                nadded = 0;
                    153:                pass(add, dirmap);
                    154:        } while(nadded);
                    155: 
                    156:        bmapest(clrmap);
                    157:        bmapest(nodmap);
                    158:        printf("estimated %ld tape blocks on %d tape(s)\n",
                    159:                esize, 0);
                    160: 
                    161:        printf("III\n");
                    162:        bitmap(clrmap, TS_CLRI);
                    163:        pass(dump, dirmap);
                    164:        printf("IV\n");
                    165:        pass(dump, nodmap);
                    166:        putitime();
                    167:        printf("DONE\n");
                    168:        spcl.c_type = TS_END;
                    169:        for(i=0; i<NTREC; i++)
                    170:                spclrec();
                    171:        printf("%ld tape blocks on %d tape(s)\n",
                    172:                spcl.c_tapea, spcl.c_volume);
                    173: }
                    174: 
                    175: pass(fn, map)
                    176: int (*fn)();
                    177: short *map;
                    178: {
                    179:        register i, j;
                    180:        int bits;
                    181:        ino_t mino;
                    182:        daddr_t d;
                    183: 
                    184:        sync();
                    185:        bread((daddr_t)1, (char *)&sblock, sizeof(sblock));
                    186:        mino = (sblock.s_isize-2) * INOPB;
                    187:        ino = 0;
                    188:        for(i=2;; i+=NI) {
                    189:                if(ino >= mino)
                    190:                        break;
                    191:                d = (unsigned)i;
                    192:                for(j=0; j<INOPB*NI; j++) {
                    193:                        if(ino >= mino)
                    194:                                break;
                    195:                        if((ino % MLEN) == 0) {
                    196:                                bits = ~0;
                    197:                                if(map != NULL)
                    198:                                        bits = *map++;
                    199:                        }
                    200:                        ino++;
                    201:                        if(bits & 1) {
                    202:                                if(d != 0) {
                    203:                                        bread(d, (char *)itab, sizeof(itab));
                    204:                                        d = 0;
                    205:                                }
                    206:                                (*fn)(&itab[j]);
                    207:                        }
                    208:                        bits >>= 1;
                    209:                }
                    210:        }
                    211: }
                    212: 
                    213: icat(ip, fn1, fn2)
                    214: struct dinode  *ip;
                    215: int (*fn1)(), (*fn2)();
                    216: {
                    217:        register i;
                    218:        daddr_t d[NADDR];
                    219: 
                    220:        l3tol(&d[0], &ip->di_addr[0], NADDR);
                    221:        (*fn2)(d, NADDR-3);
                    222:        for(i=0; i<NADDR; i++) {
                    223:                if(d[i] != 0) {
                    224:                        if(i < NADDR-3)
                    225:                                (*fn1)(d[i]); else
                    226:                                indir(d[i], fn1, fn2, i-(NADDR-3));
                    227:                }
                    228:        }
                    229: }
                    230: 
                    231: indir(d, fn1, fn2, n)
                    232: daddr_t d;
                    233: int (*fn1)(), (*fn2)();
                    234: {
                    235:        register i;
                    236:        daddr_t idblk[NINDIR];
                    237: 
                    238:        bread(d, (char *)idblk, sizeof(idblk));
                    239:        if(n <= 0) {
                    240:                spcl.c_type = TS_ADDR;
                    241:                (*fn2)(idblk, NINDIR);
                    242:                for(i=0; i<NINDIR; i++) {
                    243:                        d = idblk[i];
                    244:                        if(d != 0)
                    245:                                (*fn1)(d);
                    246:                }
                    247:        } else {
                    248:                n--;
                    249:                for(i=0; i<NINDIR; i++) {
                    250:                        d = idblk[i];
                    251:                        if(d != 0)
                    252:                                indir(d, fn1, fn2, n);
                    253:                }
                    254:        }
                    255: }
                    256: 
                    257: mark(ip)
                    258: struct dinode *ip;
                    259: {
                    260:        register f;
                    261: 
                    262:        f = ip->di_mode & IFMT;
                    263:        if(f == 0)
                    264:                return;
                    265:        BIS(ino, clrmap);
                    266:        if(f == IFDIR)
                    267:                BIS(ino, dirmap);
                    268:        if(ip->di_mtime >= spcl.c_ddate ||
                    269:           ip->di_ctime >= spcl.c_ddate) {
                    270:                BIS(ino, nodmap);
                    271:                if (f != IFREG)
                    272:                        return;
                    273:                est(ip);
                    274:        }
                    275: }
                    276: 
                    277: add(ip)
                    278: struct dinode *ip;
                    279: {
                    280: 
                    281:        if(BIT(ino, nodmap))
                    282:                return;
                    283:        nsubdir = 0;
                    284:        dadded = 0;
                    285:        icat(ip, dsrch, nullf);
                    286:        if(dadded) {
                    287:                BIS(ino, nodmap);
                    288:                est(ip);
                    289:                nadded++;
                    290:        }
                    291:        if(nsubdir == 0)
                    292:                if(!BIT(ino, nodmap))
                    293:                        BIC(ino, dirmap);
                    294: }
                    295: 
                    296: dump(ip)
                    297: struct dinode *ip;
                    298: {
                    299:        register i;
                    300: 
                    301:        if(ntape) {
                    302:                ntape = 0;
                    303:                bitmap(nodmap, TS_BITS);
                    304:        }
                    305:        BIC(ino, nodmap);
                    306:        spcl.c_dinode = *ip;
                    307:        spcl.c_type = TS_INODE;
                    308:        spcl.c_count = 0;
                    309:        i = ip->di_mode & IFMT;
                    310:        if(i != IFDIR && i != IFREG) {
                    311:                spclrec();
                    312:                return;
                    313:        }
                    314:        icat(ip, tapsrec, dmpspc);
                    315: }
                    316: 
                    317: dmpspc(dp, n)
                    318: daddr_t *dp;
                    319: {
                    320:        register i, t;
                    321: 
                    322:        spcl.c_count = n;
                    323:        for(i=0; i<n; i++) {
                    324:                t = 0;
                    325:                if(dp[i] != 0)
                    326:                        t++;
                    327:                spcl.c_addr[i] = t;
                    328:        }
                    329:        spclrec();
                    330: }
                    331: 
                    332: bitmap(map, typ)
                    333: short *map;
                    334: {
                    335:        register i, n;
                    336:        char *cp;
                    337: 
                    338:        n = -1;
                    339:        for(i=0; i<MSIZ; i++)
                    340:                if(map[i])
                    341:                        n = i;
                    342:        if(n < 0)
                    343:                return;
                    344:        spcl.c_type = typ;
                    345:        spcl.c_count = (n*sizeof(map[0]) + BSIZE)/BSIZE;
                    346:        spclrec();
                    347:        cp = (char *)map;
                    348:        for(i=0; i<spcl.c_count; i++) {
                    349:                taprec(cp);
                    350:                cp += BSIZE;
                    351:        }
                    352: }
                    353: 
                    354: spclrec()
                    355: {
                    356:        register i, *ip, s;
                    357: 
                    358:        spcl.c_inumber = ino;
                    359:        spcl.c_magic = MAGIC;
                    360:        spcl.c_checksum = 0;
                    361:        ip = (int *)&spcl;
                    362:        s = 0;
                    363:        for(i=0; i<BSIZE/sizeof(*ip); i++)
                    364:                s += *ip++;
                    365:        spcl.c_checksum = CHECKSUM - s;
                    366:        taprec((char *)&spcl);
                    367: }
                    368: 
                    369: dsrch(d)
                    370: daddr_t d;
                    371: {
                    372:        register char *cp;
                    373:        register i;
                    374:        register ino_t in;
                    375:        struct direct dblk[DIRPB];
                    376: 
                    377:        if(dadded)
                    378:                return;
                    379:        bread(d, (char *)dblk, sizeof(dblk));
                    380:        for(i=0; i<DIRPB; i++) {
                    381:                in = dblk[i].d_ino;
                    382:                if(in == 0)
                    383:                        continue;
                    384:                cp = dblk[i].d_name;
                    385:                if(cp[0] == '.') {
                    386:                        if(cp[1] == '\0')
                    387:                                continue;
                    388:                        if(cp[1] == '.' && cp[2] == '\0')
                    389:                                continue;
                    390:                }
                    391:                if(BIT(in, nodmap)) {
                    392:                        dadded++;
                    393:                        return;
                    394:                }
                    395:                if(BIT(in, dirmap))
                    396:                        nsubdir++;
                    397:        }
                    398: }
                    399: 
                    400: nullf()
                    401: {
                    402: }
                    403: 
                    404: bread(da, ba, c)
                    405: daddr_t da;
                    406: char *ba;
                    407: {
                    408:        register n;
                    409: 
                    410:        lseek(fi, da*BSIZE, 0);
                    411:        n = read(fi, ba, c);
                    412:        if(n != c)
                    413:                printf("asked %d; got %d\n", c, n);
                    414: }
                    415: 
                    416: CLR(map)
                    417: register short *map;
                    418: {
                    419:        register n;
                    420: 
                    421:        n = MSIZ;
                    422:        do
                    423:                *map++ = 0;
                    424:        while(--n);
                    425: }
                    426: 
                    427: 
                    428: char   tblock[NTREC][BSIZE];
                    429: daddr_t        tdaddr[NTREC];
                    430: int    trecno;
                    431: 
                    432: taprec(dp)
                    433: char *dp;
                    434: {
                    435:        register i;
                    436: 
                    437:        for(i=0; i<BSIZE; i++)
                    438:                tblock[trecno][i] = *dp++;
                    439:        tdaddr[trecno] = 0;
                    440:        trecno++;
                    441:        spcl.c_tapea++;
                    442:        if(trecno >= NTREC)
                    443:                flusht();
                    444: }
                    445: 
                    446: tapsrec(d)
                    447: daddr_t d;
                    448: {
                    449: 
                    450:        if(d == 0)
                    451:                return;
                    452:        tdaddr[trecno] = d;
                    453:        trecno++;
                    454:        spcl.c_tapea++;
                    455:        if(trecno >= NTREC)
                    456:                flusht();
                    457: }
                    458: 
                    459: flusht()
                    460: {
                    461:        char place[100];
                    462:        register i, si;
                    463:        daddr_t d;
                    464: 
                    465:        while(trecno < NTREC)
                    466:                tdaddr[trecno++] = 1;
                    467: 
                    468: loop:
                    469:        d = 0;
                    470:        for(i=0; i<NTREC; i++)
                    471:                if(tdaddr[i] != 0)
                    472:                if(d == 0 || tdaddr[i] < d) {
                    473:                        si = i;
                    474:                        d = tdaddr[i];
                    475:                }
                    476:        if(d != 0) {
                    477:                bread(d, tblock[si], BSIZE);
                    478:                tdaddr[si] = 0;
                    479:                goto loop;
                    480:        }
                    481:        trecno = 0;
                    482:        write(to, tblock[0], sizeof(tblock));
                    483:        asize += sizeof(tblock)/density;
                    484:        asize += 7;
                    485:        if(asize > tsize) {
                    486:                close(to);
                    487:                printf("change tapes\n");
                    488:                read(0, place, sizeof(place));
                    489:                otape();
                    490:        }
                    491: }
                    492: 
                    493: otape()
                    494: {
                    495:        to = creat(tape, 0666);
                    496:        if(to < 0) {
                    497:                printf("dump: cannot create %s\n", tape);
                    498:                exit(1);
                    499:        }
                    500:        asize = 0;
                    501:        ntape++;
                    502:        spcl.c_volume++;
                    503:        spcl.c_type = TS_TAPE;
                    504:        spclrec();
                    505: }
                    506: 
                    507: char *
                    508: prdate(d)
                    509: time_t d;
                    510: {
                    511:        char *p;
                    512: 
                    513:        if(d == 0)
                    514:                return("the epoch");
                    515:        p = ctime(&d);
                    516:        p[24] = 0;
                    517:        return(p);
                    518: }
                    519: 
                    520: getitime()
                    521: {
                    522:        register i, df;
                    523:        struct idates idbuf;
                    524:        char *fname;
                    525: 
                    526:        fname = disk;
                    527: l1:
                    528:        for(i=0; fname[i]; i++)
                    529:                if(fname[i] == '/') {
                    530:                        fname += i+1;
                    531:                        goto l1;
                    532:                }
                    533: 
                    534:        spcl.c_ddate = 0;
                    535:        df = open(increm, 0);
                    536:        if(df < 0) {
                    537:                printf("cannot open %s\n", increm);
                    538:                exit(1);
                    539:        }
                    540: 
                    541: l2:
                    542:        i = read(df, (char *)&idbuf, sizeof(idbuf));
                    543:        if(i != sizeof(idbuf)) {
                    544:                close(df);
                    545:                return;
                    546:        }
                    547:        for(i=0;; i++) {
                    548:                if(fname[i] != idbuf.id_name[i])
                    549:                        goto l2;
                    550:                if(fname[i] == '\0')
                    551:                        break;
                    552:        }
                    553:        if(idbuf.id_incno >= incno)
                    554:                goto l2;
                    555:        if(idbuf.id_ddate <= spcl.c_ddate)
                    556:                goto l2;
                    557:        spcl.c_ddate = idbuf.id_ddate;
                    558:        goto l2;
                    559: }
                    560: 
                    561: putitime()
                    562: {
                    563:        register i, n, df;
                    564:        struct idates idbuf;
                    565:        char *fname;
                    566: 
                    567:        if(uflag == 0)
                    568:                return;
                    569:        fname = disk;
                    570: l1:
                    571:        for(i=0; fname[i]; i++)
                    572:                if(fname[i] == '/') {
                    573:                        fname += i+1;
                    574:                        goto l1;
                    575:                }
                    576: 
                    577:        spcl.c_ddate = 0;
                    578:        df = open(increm, 2);
                    579:        if(df < 0) {
                    580:                printf("cannot open %s\n", increm);
                    581:                exit(1);
                    582:        }
                    583:        n = 0;
                    584: l2:
                    585:        i = read(df, (char *)&idbuf, sizeof(idbuf));
                    586:        if(i != sizeof(idbuf))
                    587:                goto l3;
                    588:        n++;
                    589:        for(i=0;; i++) {
                    590:                if(fname[i] != idbuf.id_name[i])
                    591:                        goto l2;
                    592:                if(fname[i] == '\0')
                    593:                        break;
                    594:        }
                    595:        if(idbuf.id_incno != incno)
                    596:                goto l2;
                    597: l3:
                    598:        lseek(df, (long)n*sizeof(idbuf), 0);
                    599:        for(i=0;; i++) {
                    600:                idbuf.id_name[i] = fname[i];
                    601:                if(fname[i] == '\0')
                    602:                        break;
                    603:        }
                    604:        idbuf.id_incno = incno;
                    605:        idbuf.id_ddate = spcl.c_date;
                    606:        write(df, (char *)&idbuf, sizeof(idbuf));
                    607:        close(df);
                    608:        printf("level %c dump on %s\n", incno, prdate(spcl.c_date));
                    609: }
                    610: 
                    611: est(ip)
                    612: struct dinode *ip;
                    613: {
                    614:        long s;
                    615: 
                    616:        esize++;
                    617:        s = (ip->di_size + BSIZE-1) / BSIZE;
                    618:        esize += s;
                    619:        if(s > NADDR-3) {
                    620:                s -= NADDR-3;
                    621:                s = (s + (BSIZE/sizeof(daddr_t))-1) / (BSIZE/sizeof(daddr_t));
                    622:                esize += s;
                    623:        }
                    624: }
                    625: 
                    626: bmapest(map)
                    627: short *map;
                    628: {
                    629:        register i, n;
                    630: 
                    631:        n = -1;
                    632:        for(i=0; i<MSIZ; i++)
                    633:                if(map[i])
                    634:                        n = i;
                    635:        if(n < 0)
                    636:                return;
                    637:        esize++;
                    638:        esize += (n + (BSIZE/sizeof(short))-1) / (BSIZE/sizeof(short));
                    639: }

unix.superglobalmegacorp.com

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