|
|
1.1 root 1: static char *sccsid = "@(#)ncheck.c 4.1 (Berkeley) 10/1/80";
2: /*
3: * ncheck -- obtain file names from reading filesystem
4: */
5:
6: #define NI 4
7: #define NB 1000
8: #define HSIZE 8209
9:
10: #include <stdio.h>
11: #include <sys/param.h>
12: #include <sys/inode.h>
13: #include <sys/ino.h>
14: #include <sys/dir.h>
15: #include <sys/filsys.h>
16: #include <sys/fblk.h>
17: #include <sys/stat.h>
18:
19: #define BITFSBIT 64 /* should be in param.h */
20: #define BIGINOPB INOPB(BITFSBIT)
21: #define BIGBSIZE BSIZE(BITFSBIT)
22: #define BIGNINDIR NINDIR(BITFSBIT)
23: #define BIGNDIR (BIGBSIZE/sizeof(struct direct))
24:
25: #define NDIR(dev) (BSIZE(dev)/sizeof(struct direct))
26:
27: struct filsys sblock;
28: struct stat status;
29: #define dev status.st_rdev
30: struct dinode itab[BIGINOPB*NI];
31: daddr_t iaddr[NADDR];
32: ino_t ilist[NB];
33: unsigned short imodes[NB];
34: struct htab
35: {
36: ino_t h_ino;
37: ino_t h_pino;
38: char h_name[DIRSIZ];
39: } htab[HSIZE];
40:
41: int aflg;
42: int sflg;
43: int fi;
44: long ino;
45: int nhent;
46: int nxfile;
47: int bigflag;
48:
49: int nerror;
50: daddr_t bmap();
51: long atol();
52: struct htab *lookup();
53:
54: main(argc, argv)
55: char *argv[];
56: {
57: register i;
58: long n;
59:
60: setbuf(stdout, NULL);
61: nochk(1,0); /* secure unix */
62: nochk(2,0);
63: while (--argc) {
64: argv++;
65: if (**argv=='-')
66: switch ((*argv)[1]) {
67:
68: case 'a':
69: aflg++;
70: continue;
71:
72: case 'i':
73: for(i=0; i<NB; i++) {
74: n = atol(argv[1]);
75: if(n == 0)
76: break;
77: ilist[i] = n;
78: argv++;
79: argc--;
80: }
81: nxfile = i;
82: ilist[nxfile] = 0;
83: continue;
84:
85: case 's':
86: sflg++;
87: continue;
88:
89: case 'B':
90: bigflag = BITFSBIT;
91: continue;
92:
93: default:
94: fprintf(stderr, "ncheck: bad flag %c\n", (*argv)[1]);
95: nerror++;
96: }
97: check(*argv);
98: if(sflg) {
99: nxfile = 0;
100: ilist[nxfile] = 0;
101: }
102: }
103: return(nerror);
104: }
105:
106: check(file)
107: char *file;
108: {
109: register i, j;
110: long mino;
111: register nchunk;
112:
113: fi = open(file, 0);
114: if(fi < 0) {
115: fprintf(stderr, "ncheck: cannot open %s\n", file);
116: nerror++;
117: return;
118: }
119: if (fstat(fi, &status) < 0) {
120: fprintf(stderr, "ncheck: cannot stat %s\n", file);
121: nerror++;
122: close(fi);
123: return;
124: }
125: if ((status.st_mode & S_IFMT) == S_IFREG)
126: dev = makedev(0, bigflag);
127: nhent = 0;
128: printf("%s:\n", file);
129: sync();
130: bread((daddr_t)1, (char *)&sblock, BSIZE(dev));
131: mino = (sblock.s_isize-2) * INOPB(dev);
132: nchunk = INOPB(dev)*NI;
133: ino = 0;
134: for(i=2;; i+=NI) {
135: if(ino >= mino)
136: break;
137: bread((daddr_t)i, (char *)itab, BSIZE(dev)*NI);
138: for(j=0; j<nchunk; j++) {
139: if(ino >= mino)
140: break;
141: ino++;
142: pass1(&itab[j]);
143: }
144: }
145: ilist[nxfile] = 0;
146: ino = 0;
147: for(i=2;; i+=NI) {
148: if(ino >= mino)
149: break;
150: bread((daddr_t)i, (char *)itab, BSIZE(dev)*NI);
151: for(j=0; j<nchunk; j++) {
152: if(ino >= mino)
153: break;
154: ino++;
155: pass2(&itab[j]);
156: }
157: }
158: ino = 0;
159: for(i=2;; i+=NI) {
160: if(ino >= mino)
161: break;
162: bread((daddr_t)i, (char *)itab, BSIZE(dev)*NI);
163: for(j=0; j<nchunk; j++) {
164: if(ino >= mino)
165: break;
166: ino++;
167: pass3(&itab[j]);
168: }
169: }
170: }
171:
172: pass1(ip)
173: register struct dinode *ip;
174: {
175: register struct htab * hp;
176: int filtyp = ip->di_mode & IFMT;
177:
178: if(filtyp != IFDIR) {
179: if (sflg==0 || nxfile>=NB)
180: return;
181: if(filtyp==IFBLK || filtyp==IFCHR ||
182: ip->di_mode&(ISUID|ISGID) && !(ip->di_mode&ISYNC)
183: #ifdef lb_t
184: || ip->di_label.lb_t /* secure unix */
185: #endif
186: ) {
187: ilist[nxfile] = ino;
188: imodes[nxfile++] = ip->di_mode;
189: }
190: return;
191: }
192: lookup(ino, 1);
193: }
194:
195: pass2(ip)
196: register struct dinode *ip;
197: {
198: struct direct dbuf[BIGNDIR];
199: long doff;
200: struct direct *dp;
201: register i, j;
202: int k;
203: struct htab *hp;
204: daddr_t d;
205: ino_t kno;
206:
207: if((ip->di_mode&IFMT) != IFDIR)
208: return;
209: l3tol(iaddr, ip->di_addr, NADDR);
210: doff = 0;
211: for(i=0;; i++) {
212: if(doff >= ip->di_size)
213: break;
214: d = bmap(i);
215: if(d == 0)
216: break;
217: bread(d, (char *)dbuf, BSIZE(dev));
218: for(j=0; j<NDIR(dev); j++) {
219: if(doff >= ip->di_size)
220: break;
221: doff += sizeof(struct direct);
222: dp = dbuf+j;
223: kno = dp->d_ino;
224: if(kno == 0)
225: continue;
226: hp = lookup(kno, 0);
227: if(hp == 0)
228: continue;
229: if(dotname(dp))
230: continue;
231: hp->h_pino = ino;
232: for(k=0; k<DIRSIZ; k++)
233: hp->h_name[k] = dp->d_name[k];
234: }
235: }
236: }
237:
238: pass3(ip)
239: register struct dinode *ip;
240: {
241: struct direct dbuf[BIGNDIR];
242: long doff;
243: register struct direct *dp;
244: register i, j;
245: int k;
246: daddr_t d;
247: ino_t kno;
248: struct htab * hp;
249:
250: if((ip->di_mode&IFMT) != IFDIR)
251: return;
252: l3tol(iaddr, ip->di_addr, NADDR);
253: doff = 0;
254: for(i=0;; i++) {
255: if(doff >= ip->di_size)
256: break;
257: d = bmap(i);
258: if(d == 0)
259: break;
260: bread(d, (char *)dbuf, BSIZE(dev));
261: for(j=0; j<NDIR(dev); j++) {
262: if(doff >= ip->di_size)
263: break;
264: doff += sizeof(struct direct);
265: dp = dbuf+j;
266: kno = dp->d_ino;
267: if(kno == 0)
268: continue;
269: if(aflg==0 && dotname(dp))
270: continue;
271: if(ilist[0] || sflg) {
272: for(k=0; ilist[k] != 0; k++)
273: if(ilist[k] == kno)
274: goto pr;
275: continue;
276: }
277: pr:
278: hp = lookup(kno, 0);
279: printf("%u\t", kno);
280: if (sflg && kno == ilist[k])
281: printf("%o\t", imodes[k]);
282: pname(ino, 0);
283: printf("/%.14s", dp->d_name);
284: if (hp)
285: printf("/.");
286: printf("\n");
287: }
288: }
289: }
290:
291: dotname(dp)
292: register struct direct *dp;
293: {
294:
295: if (dp->d_name[0]=='.')
296: if (dp->d_name[1]==0 || (dp->d_name[1]=='.' && dp->d_name[2]==0))
297: return(1);
298: return(0);
299: }
300:
301: pname(i, lev)
302: ino_t i;
303: {
304: register struct htab *hp;
305:
306: if (i==ROOTINO)
307: return;
308: if ((hp = lookup(i, 0)) == 0) {
309: printf("???");
310: return;
311: }
312: if (lev > 10) {
313: printf("...");
314: return;
315: }
316: pname(hp->h_pino, ++lev);
317: printf("/%.14s", hp->h_name);
318: }
319:
320: struct htab *
321: lookup(i, ef)
322: ino_t i;
323: {
324: register struct htab *hp;
325:
326: for (hp = &htab[i%HSIZE]; hp->h_ino;) {
327: if (hp->h_ino==i)
328: return(hp);
329: if (++hp >= &htab[HSIZE])
330: hp = htab;
331: }
332: if (ef==0)
333: return(0);
334: if (++nhent >= HSIZE) {
335: fprintf(stderr, "ncheck: out of core-- increase HSIZE\n");
336: exit(1);
337: }
338: hp->h_ino = i;
339: return(hp);
340: }
341:
342: bread(bno, buf, cnt)
343: daddr_t bno;
344: char *buf;
345: {
346: register i;
347:
348: lseek(fi, bno*BSIZE(dev), 0);
349: if (read(fi, buf, cnt) != cnt) {
350: fprintf(stderr, "ncheck: read error %d\n", bno);
351: for(i=0; i<BSIZE(dev); i++)
352: buf[i] = 0;
353: }
354: }
355:
356: daddr_t
357: bmap(i)
358: {
359: daddr_t ibuf[BIGNINDIR];
360:
361: if(i < NADDR-3)
362: return(iaddr[i]);
363: i -= NADDR-3;
364: if(i > NINDIR(dev)) {
365: fprintf(stderr, "ncheck: %u - huge directory\n", ino);
366: return((daddr_t)0);
367: }
368: bread(iaddr[NADDR-3], (char *)ibuf, BSIZE(dev));
369: return(ibuf[i]);
370: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.