|
|
1.1 root 1: static char *sccsid = "@(#)dumptraverse.c 1.1 (Berkeley) 10/13/80";
2: #include "dump.h"
3:
4: struct filsys sblock;
5: struct dinode itab[INOPB * NI];
6:
7: pass(fn, map)
8: int (*fn)();
9: short *map;
10: {
11: register i, j;
12: int bits;
13: ino_t mino;
14: daddr_t d;
15:
16: sync();
17: bread((daddr_t)1, (char *)&sblock, sizeof(sblock));
18: mino = (sblock.s_isize-2) * INOPB;
19: ino = 0;
20: for(i=2;; i+=NI) {
21: if(ino >= mino)
22: break;
23: d = (unsigned)i;
24: for(j=0; j<INOPB*NI; j++) {
25: if(ino >= mino)
26: break;
27: if((ino % MLEN) == 0) {
28: bits = ~0;
29: if(map != NULL)
30: bits = *map++;
31: }
32: ino++;
33: if(bits & 1) {
34: if(d != 0) {
35: bread(d, (char *)itab, sizeof(itab));
36: d = 0;
37: }
38: (*fn)(&itab[j]);
39: }
40: bits >>= 1;
41: }
42: }
43: }
44:
45: icat(ip, fn1, fn2)
46: struct dinode *ip;
47: int (*fn1)(), (*fn2)();
48: {
49: register i;
50: daddr_t d[NADDR];
51:
52: l3tol(&d[0], &ip->di_addr[0], NADDR);
53: (*fn2)(d, NADDR-3);
54: for(i=0; i<NADDR; i++) {
55: if(d[i] != 0) {
56: if(i < NADDR-3)
57: (*fn1)(d[i]); else
58: indir(d[i], fn1, fn2, i-(NADDR-3));
59: }
60: }
61: }
62:
63: indir(d, fn1, fn2, n)
64: daddr_t d;
65: int (*fn1)(), (*fn2)();
66: {
67: register i;
68: daddr_t idblk[NINDIR];
69:
70: bread(d, (char *)idblk, sizeof(idblk));
71: if(n <= 0) {
72: spcl.c_type = TS_ADDR;
73: (*fn2)(idblk, NINDIR);
74: for(i=0; i<NINDIR; i++) {
75: d = idblk[i];
76: if(d != 0)
77: (*fn1)(d);
78: }
79: } else {
80: n--;
81: for(i=0; i<NINDIR; i++) {
82: d = idblk[i];
83: if(d != 0)
84: indir(d, fn1, fn2, n);
85: }
86: }
87: }
88:
89: mark(ip)
90: struct dinode *ip;
91: {
92: register f;
93:
94: f = ip->di_mode & IFMT;
95: if(f == 0)
96: return;
97: BIS(ino, clrmap);
98: if(f == IFDIR)
99: BIS(ino, dirmap);
100: if(ip->di_mtime >= spcl.c_ddate ||
101: ip->di_ctime >= spcl.c_ddate) {
102: BIS(ino, nodmap);
103: if (f != IFREG){
104: esize += 1;
105: return;
106: }
107: est(ip);
108: }
109: }
110:
111: add(ip)
112: struct dinode *ip;
113: {
114:
115: if(BIT(ino, nodmap))
116: return;
117: nsubdir = 0;
118: dadded = 0;
119: icat(ip, dsrch, nullf);
120: if(dadded) {
121: BIS(ino, nodmap);
122: est(ip);
123: nadded++;
124: }
125: if(nsubdir == 0)
126: if(!BIT(ino, nodmap))
127: BIC(ino, dirmap);
128: }
129:
130: dump(ip)
131: struct dinode *ip;
132: {
133: register i;
134:
135: if(newtape) {
136: newtape = 0;
137: bitmap(nodmap, TS_BITS);
138: }
139: BIC(ino, nodmap);
140: spcl.c_dinode = *ip;
141: spcl.c_type = TS_INODE;
142: spcl.c_count = 0;
143: i = ip->di_mode & IFMT;
144: if(i != IFDIR && i != IFREG) {
145: spclrec();
146: return;
147: }
148: icat(ip, tapsrec, dmpspc);
149: }
150:
151: dmpspc(dp, n)
152: daddr_t *dp;
153: {
154: register i, t;
155:
156: spcl.c_count = n;
157: for(i=0; i<n; i++) {
158: t = 0;
159: if(dp[i] != 0)
160: t++;
161: spcl.c_addr[i] = t;
162: }
163: spclrec();
164: }
165:
166: bitmap(map, typ)
167: short *map;
168: {
169: register i, n;
170: char *cp;
171:
172: n = -1;
173: for(i=0; i<MSIZ; i++)
174: if(map[i])
175: n = i;
176: if(n < 0)
177: return;
178: spcl.c_type = typ;
179: spcl.c_count = (n*sizeof(map[0]) + BSIZE)/BSIZE;
180: spclrec();
181: cp = (char *)map;
182: for(i=0; i<spcl.c_count; i++) {
183: taprec(cp);
184: cp += BSIZE;
185: }
186: }
187:
188: spclrec()
189: {
190: register i, *ip, s;
191:
192: spcl.c_inumber = ino;
193: spcl.c_magic = MAGIC;
194: spcl.c_checksum = 0;
195: ip = (int *)&spcl;
196: s = 0;
197: for(i=0; i<BSIZE/sizeof(*ip); i++)
198: s += *ip++;
199: spcl.c_checksum = CHECKSUM - s;
200: taprec((char *)&spcl);
201: }
202:
203: dsrch(d)
204: daddr_t d;
205: {
206: register char *cp;
207: register i;
208: register ino_t in;
209: struct direct dblk[DIRPB];
210:
211: if(dadded)
212: return;
213: bread(d, (char *)dblk, sizeof(dblk));
214: for(i=0; i<DIRPB; i++) {
215: in = dblk[i].d_ino;
216: if(in == 0)
217: continue;
218: cp = dblk[i].d_name;
219: if(cp[0] == '.') {
220: if(cp[1] == '\0')
221: continue;
222: if(cp[1] == '.' && cp[2] == '\0')
223: continue;
224: }
225: if(BIT(in, nodmap)) {
226: dadded++;
227: return;
228: }
229: if(BIT(in, dirmap))
230: nsubdir++;
231: }
232: }
233:
234: nullf()
235: {
236: }
237:
238: int breaderrors = 0;
239: #define BREADEMAX 32
240:
241: bread(da, ba, c)
242: daddr_t da;
243: char *ba;
244: int c;
245: {
246: register n;
247: register regc;
248:
249: if (lseek(fi, (long)(da*BSIZE), 0) < 0){
250: msg("bread: lseek fails\n");
251: }
252: regc = c; /* put c someplace safe; it gets clobbered */
253: n = read(fi, ba, c);
254: if(n != c || regc != c){
255: msg("(This should not happen)bread from %s [block %d]: c=0x%x, regc=0x%x, &c=0x%x, n=0x%x\n",
256: disk, da, c, regc, &c, n);
257: #ifdef ERNIE
258: msg("Notify Robert Henry of this error.\n");
259: #endif
260: if (++breaderrors > BREADEMAX){
261: msg("More than %d block read errors from %d\n",
262: BREADEMAX, disk);
263: broadcast("DUMP IS AILING!\n");
264: msg("This is an unrecoverable error.\n");
265: if (!query("Do you want to attempt to continue?")){
266: dumpabort();
267: /*NOTREACHED*/
268: } else
269: breaderrors = 0;
270: }
271: }
272: }
273:
274: CLR(map)
275: register short *map;
276: {
277: register n;
278:
279: n = MSIZ;
280: do
281: *map++ = 0;
282: while(--n);
283: }
284:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.