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