Annotation of researchv8dc/cmd/icheck.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)icheck.c    4.1 (Berkeley) 10/1/80";
                      2: #define        NI      4
                      3: #define        NB      500
                      4: #define        BITS    8
                      5: #define        MAXFN   500
                      6: 
                      7: #ifndef STANDALONE
                      8: #include <stdio.h>
                      9: #endif
                     10: #include <sys/param.h>
                     11: #include <sys/inode.h>
                     12: #include <sys/ino.h>
                     13: #include <sys/fblk.h>
                     14: #include <sys/filsys.h>
                     15: #include <sys/stat.h>
                     16: 
                     17: #define        BITFSBIT        64      /* should be in param.h */
                     18: #define        BIGINOPB        INOPB(BITFSBIT)
                     19: #define        BIGBSIZE        BSIZE(BITFSBIT)
                     20: #define        BIGNINDIR       NINDIR(BITFSBIT)
                     21: 
                     22: struct filsys  sblock;
                     23: struct stat    status;
                     24: #define        dev     status.st_rdev
                     25: struct dinode  itab[BIGINOPB*NI];
                     26: daddr_t        iaddr[NADDR];
                     27: daddr_t        blist[NB];
                     28: char   *bmap;
                     29: 
                     30: int    sflg;
                     31: int    mflg;
                     32: int    dflg;
                     33: int    fi;
                     34: ino_t  ino;
                     35: int    bigflag;
                     36: 
                     37: ino_t  nrfile;
                     38: ino_t  ndfile;
                     39: ino_t  nbfile;
                     40: ino_t  ncfile;
                     41: ino_t  nlfile;
                     42: 
                     43: daddr_t        ndirect;
                     44: daddr_t        nindir;
                     45: daddr_t        niindir;
                     46: daddr_t        niiindir;
                     47: daddr_t        nfree;
                     48: daddr_t        ndup;
                     49: 
                     50: int    nerror;
                     51: 
                     52: long   atol();
                     53: daddr_t        alloc();
                     54: #ifndef STANDALONE
                     55: char   *malloc();
                     56: #endif
                     57: 
                     58: main(argc, argv)
                     59: char *argv[];
                     60: {
                     61:        register i;
                     62:        long n;
                     63: 
                     64:        blist[0] = -1;
                     65: #ifndef STANDALONE
                     66:        while (--argc) {
                     67:                argv++;
                     68:                if (**argv=='-')
                     69:                switch ((*argv)[1]) {
                     70:                case 'd':
                     71:                        dflg++;
                     72:                        continue;
                     73: 
                     74: 
                     75:                case 'm':
                     76:                        mflg++;
                     77:                        continue;
                     78: 
                     79:                case 's':
                     80:                        sflg++;
                     81:                        continue;
                     82: 
                     83:                case 'b':
                     84:                        for(i=0; i<NB; i++) {
                     85:                                n = atol(argv[1]);
                     86:                                if(n == 0)
                     87:                                        break;
                     88:                                blist[i] = n;
                     89:                                argv++;
                     90:                                argc--;
                     91:                        }
                     92:                        blist[i] = -1;
                     93:                        continue;
                     94: 
                     95:                case 'B':
                     96:                        bigflag = BITFSBIT;
                     97:                        continue;
                     98: 
                     99:                default:
                    100:                        printf("Bad flag\n");
                    101:                }
                    102:                check(*argv);
                    103:        }
                    104: #else
                    105:        {
                    106:                static char fname[128];
                    107: 
                    108:                printf("File: ");
                    109:                gets(fname);
                    110:                check(fname);
                    111:        }
                    112: #endif
                    113:        return(nerror);
                    114: }
                    115: 
                    116: check(file)
                    117: char *file;
                    118: {
                    119:        register i, j;
                    120:        ino_t mino;
                    121:        daddr_t d;
                    122:        long n;
                    123: 
                    124:        fi = open(file, sflg?2:0);
                    125:        if (fi < 0) {
                    126:                printf("cannot open %s\n", file);
                    127:                nerror |= 04;
                    128:                return;
                    129:        }
                    130: #ifndef STANDALONE
                    131:        if (fstat(fi, &status) < 0) {
                    132:                printf("cannot fstat %s\n", file);
                    133:                nerror |= 04;
                    134:                close(fi);
                    135:                return;
                    136:        }
                    137:        if ((status.st_mode & S_IFMT) == S_IFREG)
                    138:                dev = makedev(0, bigflag);
                    139: #else
                    140:        dev = makedev(0, BITFSBIT);     /* hack */
                    141: #endif
                    142:        printf("%s:\n", file);
                    143:        nrfile = 0;
                    144:        ndfile = 0;
                    145:        ncfile = 0;
                    146:        nbfile = 0;
                    147:        nlfile = 0;
                    148: 
                    149:        ndirect = 0;
                    150:        nindir = 0;
                    151:        niindir = 0;
                    152:        niiindir = 0;
                    153: 
                    154:        ndup = 0;
                    155: #ifndef STANDALONE
                    156:        sync();
                    157: #endif
                    158:        bread((daddr_t)1, (char *)&sblock, sizeof(sblock));
                    159:        mino = ((int)sblock.s_isize-2) * INOPB(dev);
                    160:        ino = 0;
                    161:        n = (sblock.s_fsize - (int)sblock.s_isize + BITS-1) / BITS;
                    162:        if (n != (unsigned)n) {
                    163:                printf("Check fsize and isize: %ld, %u\n",
                    164:                   sblock.s_fsize, (int)sblock.s_isize);
                    165:        }
                    166: #ifdef STANDALONE
                    167:        bmap = NULL;
                    168: #else
                    169:        bmap = malloc((unsigned)n);
                    170: #endif
                    171:        if (bmap==NULL) {
                    172:                printf("Not enough core; duplicates unchecked\n");
                    173:                dflg++;
                    174:                sflg = 0;
                    175:        }
                    176:        if(!dflg)
                    177:        for(i=0; i<(unsigned)n; i++)
                    178:                bmap[i] = 0;
                    179:        for(i=2;; i+=NI) {
                    180:                if(ino >= mino)
                    181:                        break;
                    182:                bread((daddr_t)i, (char *)itab, BSIZE(dev)*NI);
                    183:                for(j=0; j<INOPB(dev)*NI; j++) {
                    184:                        if(ino >= mino)
                    185:                                break;
                    186:                        ino++;
                    187:                        pass1(&itab[j]);
                    188:                }
                    189:        }
                    190:        ino = 0;
                    191: #ifndef STANDALONE
                    192:        sync();
                    193: #endif
                    194:        bread((daddr_t)1, (char *)&sblock, sizeof(sblock));
                    195:        if (sflg) {
                    196:                makefree();
                    197:                close(fi);
                    198: #ifndef STANDALONE
                    199:                if (bmap)
                    200:                        free(bmap);
                    201: #endif
                    202:                return;
                    203:        }
                    204:        nfree = 0;
                    205:        while(n = alloc()) {
                    206:                if (chk(n, "free"))
                    207:                        break;
                    208:                nfree++;
                    209:        }
                    210:        close(fi);
                    211: #ifndef STANDALONE
                    212:        if (bmap)
                    213:                free(bmap);
                    214: #endif
                    215: 
                    216:        i = nrfile + ndfile + ncfile + nbfile + nlfile;
                    217: #ifndef STANDALONE
                    218:        printf("files %6u (r=%u,d=%u,b=%u,c=%u,l=%u)\n",
                    219:                i, nrfile, ndfile, nbfile, ncfile, nlfile);
                    220: #else
                    221:        printf("files %u (r=%u,d=%u,b=%u,c=%u,l=%u)\n",
                    222:                i, nrfile, ndfile, nbfile, ncfile, nlfile);
                    223: #endif
                    224:        n = ndirect + nindir + niindir + niiindir;
                    225: #ifdef STANDALONE
                    226:        printf("used %ld (i=%ld,ii=%ld,iii=%ld,d=%ld)\n",
                    227:                n, nindir, niindir, niiindir, ndirect);
                    228:        printf("free %ld\n", nfree);
                    229: #else
                    230:        printf("used %7ld (i=%ld,ii=%ld,iii=%ld,d=%ld)\n",
                    231:                n, nindir, niindir, niiindir, ndirect);
                    232:        printf("free %7ld\n", nfree);
                    233: #endif
                    234:        if(!dflg) {
                    235:                n = 0;
                    236:                for(d=(int)sblock.s_isize; d<sblock.s_fsize; d++)
                    237:                        if(!duped(d)) {
                    238:                                if(mflg)
                    239:                                        printf("%ld missing\n", d);
                    240:                                n++;
                    241:                        }
                    242:                printf("missing%5ld\n", n);
                    243:        }
                    244: }
                    245: 
                    246: pass1(ip)
                    247: register struct dinode *ip;
                    248: {
                    249:        daddr_t ind1[BIGNINDIR];
                    250:        daddr_t ind2[BIGNINDIR];
                    251:        daddr_t ind3[BIGNINDIR];
                    252:        register i, j;
                    253:        int k, l;
                    254: 
                    255:        i = ip->di_mode & IFMT;
                    256:        if(i == 0) {
                    257:                sblock.s_tinode++;
                    258:                return;
                    259:        }
                    260:        if(i == IFCHR) {
                    261:                ncfile++;
                    262:                return;
                    263:        }
                    264:        if(i == IFBLK) {
                    265:                nbfile++;
                    266:                return;
                    267:        }
                    268:        if(i == IFDIR)
                    269:                ndfile++;
                    270:        else if(i == IFREG)
                    271:                nrfile++;
                    272:        else if(i == IFLNK)
                    273:                nlfile++;
                    274:        else {
                    275:                printf("bad mode %u\n", ino);
                    276:                return;
                    277:        }
                    278:        l3tol(iaddr, ip->di_addr, NADDR);
                    279:        for(i=0; i<NADDR; i++) {
                    280:                if(iaddr[i] == 0)
                    281:                        continue;
                    282:                if(i < NADDR-3) {
                    283:                        ndirect++;
                    284:                        chk(iaddr[i], "data (small)");
                    285:                        continue;
                    286:                }
                    287:                nindir++;
                    288:                if (chk(iaddr[i], "1st indirect"))
                    289:                                continue;
                    290:                bread(iaddr[i], (char *)ind1, BSIZE(dev));
                    291:                for(j=0; j<NINDIR(dev); j++) {
                    292:                        if(ind1[j] == 0)
                    293:                                continue;
                    294:                        if(i == NADDR-3) {
                    295:                                ndirect++;
                    296:                                chk(ind1[j], "data (large)");
                    297:                                continue;
                    298:                        }
                    299:                        niindir++;
                    300:                        if(chk(ind1[j], "2nd indirect"))
                    301:                                continue;
                    302:                        bread(ind1[j], (char *)ind2, BSIZE(dev));
                    303:                        for(k=0; k<NINDIR(dev); k++) {
                    304:                                if(ind2[k] == 0)
                    305:                                        continue;
                    306:                                if(i == NADDR-2) {
                    307:                                        ndirect++;
                    308:                                        chk(ind2[k], "data (huge)");
                    309:                                        continue;
                    310:                                }
                    311:                                niiindir++;
                    312:                                if(chk(ind2[k], "3rd indirect"))
                    313:                                        continue;
                    314:                                bread(ind2[k], (char *)ind3, BSIZE(dev));
                    315:                                for(l=0; l<NINDIR(dev); l++)
                    316:                                        if(ind3[l]) {
                    317:                                                ndirect++;
                    318:                                                chk(ind3[l], "data (garg)");
                    319:                                        }
                    320:                        }
                    321:                }
                    322:        }
                    323: }
                    324: 
                    325: chk(bno, s)
                    326: daddr_t bno;
                    327: char *s;
                    328: {
                    329:        register n;
                    330: 
                    331:        if (bno<(int)sblock.s_isize || bno>=sblock.s_fsize) {
                    332:                printf("%ld bad; inode=%u, class=%s\n", bno, ino, s);
                    333:                return(1);
                    334:        }
                    335:        if(duped(bno)) {
                    336:                printf("%ld dup; inode=%u, class=%s\n", bno, ino, s);
                    337:                ndup++;
                    338:        }
                    339:        for (n=0; blist[n] != -1; n++)
                    340:                if (bno == blist[n])
                    341:                        printf("%ld arg; inode=%u, class=%s\n", bno, ino, s);
                    342:        return(0);
                    343: }
                    344: 
                    345: duped(bno)
                    346: daddr_t bno;
                    347: {
                    348:        daddr_t d;
                    349:        register m, n;
                    350: 
                    351:        if(dflg)
                    352:                return(0);
                    353:        d = bno - (int)sblock.s_isize;
                    354:        m = 1 << (d%BITS);
                    355:        n = (d/BITS);
                    356:        if(bmap[n] & m)
                    357:                return(1);
                    358:        bmap[n] |= m;
                    359:        return(0);
                    360: }
                    361: 
                    362: daddr_t
                    363: alloc()
                    364: {
                    365:        daddr_t bno;
                    366:        union {
                    367:                char    data[BIGBSIZE];
                    368:                struct  fblk fb;
                    369:        } buf;
                    370:        register int i, j;
                    371:        register long *p;
                    372: 
                    373:        sblock.s_tfree--;
                    374:        if (BITFS(dev)) {
                    375:                p = sblock.s_bfree;
                    376:                for(i = 0; i < BITMAP && !*p; i++, p++)
                    377:                        ;
                    378:                if(i >= BITMAP)
                    379:                        return (0);
                    380:                bno = sblock.s_isize + 32 * i;
                    381:                for(j = 0; j < 32; j++) /* BITS PER LONG */
                    382:                        if(*p & (1 << j))
                    383:                                break;
                    384:                if(j >= 32)
                    385:                        return (0);
                    386:                bno += j;
                    387:                if(bno >= sblock.s_fsize)
                    388:                        return (0);
                    389:                *p &= ~(1 << j);
                    390:                return (bno);
                    391:        }
                    392:        if (sblock.s_nfree<=0)
                    393:                return(0);
                    394:        if (sblock.s_nfree>NICFREE) {
                    395:                printf("Bad free list, s.b. count = %d\n", sblock.s_nfree);
                    396:                return(0);
                    397:        }
                    398:        bno = sblock.s_free[--sblock.s_nfree];
                    399:        sblock.s_free[sblock.s_nfree] = (daddr_t)0;
                    400:        if(bno == 0)
                    401:                return(bno);
                    402:        if(sblock.s_nfree <= 0) {
                    403:                bread(bno, buf.data, BSIZE(dev));
                    404:                sblock.s_nfree = buf.fb.df_nfree;
                    405:                if (sblock.s_nfree<0 || sblock.s_nfree>NICFREE) {
                    406:                        printf("Bad free list, entry count of block %ld = %d\n",
                    407:                                bno, sblock.s_nfree);
                    408:                        sblock.s_nfree = 0;
                    409:                        return(0);
                    410:                }
                    411:                for(i=0; i<NICFREE; i++)
                    412:                        sblock.s_free[i] = buf.fb.df_free[i];
                    413:        }
                    414:        return(bno);
                    415: }
                    416: 
                    417: bfree(bno)
                    418: daddr_t bno;
                    419: {
                    420:        union {
                    421:                char    data[BIGBSIZE];
                    422:                struct  fblk fb;
                    423:        } buf;
                    424:        int i;
                    425: 
                    426:        sblock.s_tfree++;
                    427:        if (BITFS(dev)) {
                    428:                bno -= sblock.s_isize;
                    429:                sblock.s_bfree[bno/32] |= (1 << (bno % 32));
                    430:                return;
                    431:        }
                    432:        if(sblock.s_nfree >= NICFREE) {
                    433:                for(i=0; i<BSIZE(dev); i++)
                    434:                        buf.data[i] = 0;
                    435:                buf.fb.df_nfree = sblock.s_nfree;
                    436:                for(i=0; i<NICFREE; i++)
                    437:                        buf.fb.df_free[i] = sblock.s_free[i];
                    438:                bwrite(bno, buf.data);
                    439:                sblock.s_nfree = 0;
                    440:        }
                    441:        sblock.s_free[sblock.s_nfree] = bno;
                    442:        sblock.s_nfree++;
                    443: }
                    444: 
                    445: bread(bno, buf, cnt)
                    446: daddr_t bno;
                    447: char *buf;
                    448: {
                    449:        register i;
                    450: 
                    451:        lseek(fi, bno*BSIZE(dev), 0);
                    452:        if (read(fi, buf, cnt) != cnt) {
                    453:                printf("read error %ld\n", bno);
                    454:                if (sflg) {
                    455:                        printf("No update\n");
                    456:                        sflg = 0;
                    457:                }
                    458:                for(i=0; i<BSIZE(dev); i++)
                    459:                        buf[i] = 0;
                    460:        }
                    461: }
                    462: 
                    463: bwrite(bno, buf)
                    464: daddr_t bno;
                    465: char   *buf;
                    466: {
                    467: 
                    468:        lseek(fi, bno*BSIZE(dev), 0);
                    469:        if (write(fi, buf, BSIZE(dev)) != BSIZE(dev))
                    470:                printf("write error %ld\n", bno);
                    471: }
                    472: 
                    473: makefree()
                    474: {
                    475:        char flg[MAXFN];
                    476:        int adr[MAXFN];
                    477:        register i, j;
                    478:        daddr_t f, d;
                    479:        int m, n;
                    480: 
                    481:        n = sblock.s_n;
                    482:        if(n <= 0 || n > MAXFN)
                    483:                n = MAXFN;
                    484:        sblock.s_n = n;
                    485:        m = sblock.s_m;
                    486:        if(m <= 0 || m > sblock.s_n)
                    487:                m = 3;
                    488:        sblock.s_m = m;
                    489: 
                    490:        for(i=0; i<n; i++)
                    491:                flg[i] = 0;
                    492:        i = 0;
                    493:        for(j=0; j<n; j++) {
                    494:                while(flg[i])
                    495:                        i = (i+1)%n;
                    496:                adr[j] = i+1;
                    497:                flg[i]++;
                    498:                i = (i+m)%n;
                    499:        }
                    500: 
                    501:        if (!BITFS(dev))
                    502:                sblock.s_nfree = 0;
                    503:        sblock.s_ninode = 0;
                    504:        sblock.s_flock = 0;
                    505:        sblock.s_ilock = 0;
                    506:        sblock.s_fmod = 0;
                    507:        sblock.s_ronly = 0;
                    508: #ifndef STANDALONE
                    509:        time(&sblock.s_time);
                    510: #endif
                    511: 
                    512:        if (!BITFS(dev))
                    513:                bfree((daddr_t)0);
                    514:        sblock.s_tfree = 0;
                    515:        sblock.s_tinode = 0;
                    516:        d = sblock.s_fsize-1;
                    517:        while(d%sblock.s_n)
                    518:                d++;
                    519:        for(; d > 0; d -= sblock.s_n)
                    520:        for(i=0; i<sblock.s_n; i++) {
                    521:                f = d - adr[i];
                    522:                if(f < sblock.s_fsize && f >= (int)sblock.s_isize)
                    523:                        if(!duped(f))
                    524:                                bfree(f);
                    525:        }
                    526:        bwrite((daddr_t)1, (char *)&sblock);
                    527: #ifndef STANDALONE
                    528:        sync();
                    529: #endif
                    530:        return;
                    531: }

unix.superglobalmegacorp.com

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