Annotation of researchv8dc/cmd/icheck.c, revision 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.