Annotation of 40BSD/cmd/icheck.c, revision 1.1

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

unix.superglobalmegacorp.com

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