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

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

unix.superglobalmegacorp.com

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