|
|
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.