|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.