Annotation of 41BSD/cmd/dcheck.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)dcheck.c    4.1 (Berkeley) 10/1/80";
                      2: /*
                      3:  * dcheck - check directory consistency
                      4:  */
                      5: #define        NI      16
                      6: #define        NB      10
                      7: #define        NDIR    (BSIZE/sizeof(struct direct))
                      8: 
                      9: #include <stdio.h>
                     10: #include <sys/param.h>
                     11: #include <sys/inode.h>
                     12: #include <sys/ino.h>
                     13: #include <sys/dir.h>
                     14: #include <sys/filsys.h>
                     15: #include <sys/fblk.h>
                     16: 
                     17: 
                     18: struct filsys  sblock;
                     19: struct dinode  itab[INOPB*NI];
                     20: daddr_t        iaddr[NADDR];
                     21: ino_t  ilist[NB];
                     22: 
                     23: int    fi;
                     24: ino_t  ino;
                     25: char   *ecount;
                     26: int    headpr;
                     27: unsigned       nfiles;
                     28: 
                     29: int    nerror;
                     30: daddr_t        bmap();
                     31: long   atol();
                     32: char   *malloc();
                     33: 
                     34: main(argc, argv)
                     35: char *argv[];
                     36: {
                     37:        register i;
                     38:        long n;
                     39: 
                     40:        while (--argc) {
                     41:                argv++;
                     42:                if (**argv=='-')
                     43:                switch ((*argv)[1]) {
                     44: 
                     45:                case 'i':
                     46:                        for(i=0; i<NB; i++) {
                     47:                                n = atol(argv[1]);
                     48:                                if(n == 0)
                     49:                                        break;
                     50:                                ilist[i] = n;
                     51:                                argv++;
                     52:                                argc--;
                     53:                        }
                     54:                        ilist[i] = 0;
                     55:                        continue;
                     56: 
                     57:                default:
                     58:                        printf("Bad flag %c\n", (*argv)[1]);
                     59:                        nerror++;
                     60:                }
                     61:                check(*argv);
                     62:        }
                     63:        return(nerror);
                     64: }
                     65: 
                     66: check(file)
                     67: char *file;
                     68: {
                     69:        register i;
                     70:        register j;
                     71: 
                     72:        fi = open(file, 0);
                     73:        if(fi < 0) {
                     74:                printf("cannot open %s\n", file);
                     75:                nerror++;
                     76:                return;
                     77:        }
                     78:        headpr = 0;
                     79:        printf("%s:\n", file);
                     80:        sync();
                     81:        bread((daddr_t)1, (char *)&sblock, sizeof(sblock));
                     82:        nfiles = (sblock.s_isize-2)*INOPB;
                     83:        if (nfiles > 250000) {
                     84:                printf("Only doing 250000 files\n");
                     85:                nfiles = 250000;
                     86:        }
                     87:        ecount = malloc(nfiles+1);
                     88:        if (ecount==NULL) {
                     89:                printf("Not enough core\n");
                     90:                exit(04);
                     91:        }
                     92:        for (i=0; i<=nfiles; i++)
                     93:                ecount[i] = 0;
                     94:        ino = 0;
                     95:        for(i=2;; i+=NI) {
                     96:                if(ino >= nfiles)
                     97:                        break;
                     98:                bread((daddr_t)i, (char *)itab, sizeof(itab));
                     99:                for(j=0; j<INOPB*NI; j++) {
                    100:                        if(ino >= nfiles)
                    101:                                break;
                    102:                        ino++;
                    103:                        pass1(&itab[j]);
                    104:                }
                    105:        }
                    106:        ino = 0;
                    107:        for(i=2;; i+=NI) {
                    108:                if(ino >= nfiles)
                    109:                        break;
                    110:                bread((daddr_t)i, (char *)itab, sizeof(itab));
                    111:                for(j=0; j<INOPB*NI; j++) {
                    112:                        if(ino >= nfiles)
                    113:                                break;
                    114:                        ino++;
                    115:                        pass2(&itab[j]);
                    116:                }
                    117:        }
                    118:        free(ecount);
                    119: }
                    120: 
                    121: pass1(ip)
                    122: register struct dinode *ip;
                    123: {
                    124:        struct direct dbuf[NDIR];
                    125:        long doff;
                    126:        struct direct *dp;
                    127:        register i, j;
                    128:        int k;
                    129:        daddr_t d;
                    130:        ino_t kno;
                    131: 
                    132:        if((ip->di_mode&IFMT) != IFDIR)
                    133:                return;
                    134:        l3tol(iaddr, ip->di_addr, NADDR);
                    135:        doff = 0;
                    136:        for(i=0;; i++) {
                    137:                if(doff >= ip->di_size)
                    138:                        break;
                    139:                d = bmap(i);
                    140:                if(d == 0)
                    141:                        break;
                    142:                bread(d, (char *)dbuf, BSIZE);
                    143:                for(j=0; j<NDIR; j++) {
                    144:                        if(doff >= ip->di_size)
                    145:                                break;
                    146:                        doff += sizeof(struct direct);
                    147:                        dp = &dbuf[j];
                    148:                        kno = dp->d_ino;
                    149:                        if(kno == 0)
                    150:                                continue;
                    151:                        if(kno > nfiles || kno <= 1) {
                    152:                                printf("%5u bad; %u/%.14s\n", kno, ino, dp->d_name);
                    153:                                nerror++;
                    154:                                continue;
                    155:                        }
                    156:                        for (k=0; ilist[k] != 0; k++)
                    157:                                if (ilist[k]==kno) {
                    158:                                        printf("%5u arg; %u/%.14s\n", kno, ino, dp->d_name);
                    159:                                        nerror++;
                    160:                                }
                    161:                        ecount[kno]++;
                    162:                        if (ecount[kno] == 0)
                    163:                                ecount[kno] = 0377;
                    164:                }
                    165:        }
                    166: }
                    167: 
                    168: pass2(ip)
                    169: register struct dinode *ip;
                    170: {
                    171:        register i;
                    172: 
                    173:        i = ino;
                    174:        if ((ip->di_mode&IFMT)==0 && ecount[i]==0)
                    175:                return;
                    176:        if (ip->di_nlink==((ecount[i])&0377) && ip->di_nlink!=0)
                    177:                return;
                    178:        if (headpr==0) {
                    179:                printf("     entries  link cnt\n");
                    180:                headpr++;
                    181:        }
                    182:        printf("%u      %d      %d\n", ino,
                    183:            ecount[i]&0377, ip->di_nlink);
                    184: }
                    185: 
                    186: bread(bno, buf, cnt)
                    187: daddr_t bno;
                    188: char *buf;
                    189: {
                    190:        register i;
                    191: 
                    192:        lseek(fi, bno*BSIZE, 0);
                    193:        if (read(fi, buf, cnt) != cnt) {
                    194:                printf("read error %d\n", bno);
                    195:                for(i=0; i<BSIZE; i++)
                    196:                        buf[i] = 0;
                    197:        }
                    198: }
                    199: 
                    200: 
                    201: daddr_t
                    202: bmap(i)
                    203: {
                    204:        daddr_t ibuf[NINDIR];
                    205: 
                    206:        if(i < NADDR-3)
                    207:                return(iaddr[i]);
                    208:        i -= NADDR-3;
                    209:        if(i > NINDIR) {
                    210:                printf("%u - huge directory\n", ino);
                    211:                return((daddr_t)0);
                    212:        }
                    213:        bread(iaddr[NADDR-3], (char *)ibuf, sizeof(ibuf));
                    214:        return(ibuf[i]);
                    215: }

unix.superglobalmegacorp.com

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