|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: static char sccsid[] = "@(#)dumpmain.c 5.6 (Berkeley) 2/23/87";
9: #endif not lint
10:
11: #include "dump.h"
12:
13: int notify = 0; /* notify operator flag */
14: int blockswritten = 0; /* number of blocks written on current tape */
15: int tapeno = 0; /* current tape number */
16: int density = 0; /* density in bytes/0.1" */
17: int ntrec = NTREC; /* # tape blocks in each tape record */
18: int cartridge = 0; /* Assume non-cartridge tape */
19: long dev_bsize = 1; /* recalculated below */
20: #ifdef RDUMP
21: char *host;
22: #endif
23: int anydskipped; /* set true in mark() if any directories are skipped */
24: /* this lets us avoid map pass 2 in some cases */
25:
26: main(argc, argv)
27: int argc;
28: char *argv[];
29: {
30: char *arg;
31: int bflag = 0, i;
32: float fetapes;
33: register struct fstab *dt;
34:
35: time(&(spcl.c_date));
36:
37: tsize = 0; /* Default later, based on 'c' option for cart tapes */
38: tape = TAPE;
39: disk = DISK;
40: increm = NINCREM;
41: temp = TEMP;
42: if (TP_BSIZE / DEV_BSIZE == 0 || TP_BSIZE % DEV_BSIZE != 0) {
43: msg("TP_BSIZE must be a multiple of DEV_BSIZE\n");
44: dumpabort();
45: }
46: incno = '9';
47: uflag = 0;
48: arg = "u";
49: if(argc > 1) {
50: argv++;
51: argc--;
52: arg = *argv;
53: if (*arg == '-')
54: argc++;
55: }
56: while(*arg)
57: switch (*arg++) {
58: case 'w':
59: lastdump('w'); /* tell us only what has to be done */
60: exit(0);
61: break;
62: case 'W': /* what to do */
63: lastdump('W'); /* tell us the current state of what has been done */
64: exit(0); /* do nothing else */
65: break;
66:
67: case 'f': /* output file */
68: if(argc > 1) {
69: argv++;
70: argc--;
71: tape = *argv;
72: }
73: break;
74:
75: case 'd': /* density, in bits per inch */
76: if (argc > 1) {
77: argv++;
78: argc--;
79: density = atoi(*argv) / 10;
80: if (density >= 625 && !bflag)
81: ntrec = HIGHDENSITYTREC;
82: }
83: break;
84:
85: case 's': /* tape size, feet */
86: if(argc > 1) {
87: argv++;
88: argc--;
89: tsize = atol(*argv);
90: tsize *= 12L*10L;
91: }
92: break;
93:
94: case 'b': /* blocks per tape write */
95: if(argc > 1) {
96: argv++;
97: argc--;
98: bflag++;
99: ntrec = atol(*argv);
100: }
101: break;
102:
103: case 'c': /* Tape is cart. not 9-track */
104: cartridge++;
105: break;
106:
107: case '0': /* dump level */
108: case '1':
109: case '2':
110: case '3':
111: case '4':
112: case '5':
113: case '6':
114: case '7':
115: case '8':
116: case '9':
117: incno = arg[-1];
118: break;
119:
120: case 'u': /* update /etc/dumpdates */
121: uflag++;
122: break;
123:
124: case 'n': /* notify operators */
125: notify++;
126: break;
127:
128: default:
129: fprintf(stderr, "bad key '%c%'\n", arg[-1]);
130: Exit(X_ABORT);
131: }
132: if(argc > 1) {
133: argv++;
134: argc--;
135: disk = *argv;
136: }
137: if (strcmp(tape, "-") == 0) {
138: pipeout++;
139: tape = "standard output";
140: }
141:
142: /*
143: * Determine how to default tape size and density
144: *
145: * density tape size
146: * 9-track 1600 bpi (160 bytes/.1") 2300 ft.
147: * 9-track 6250 bpi (625 bytes/.1") 2300 ft.
148: * cartridge 8000 bpi (100 bytes/.1") 1700 ft. (450*4 - slop)
149: */
150: if (density == 0)
151: density = cartridge ? 100 : 160;
152: if (tsize == 0)
153: tsize = cartridge ? 1700L*120L : 2300L*120L;
154:
155: #ifdef RDUMP
156: { char *index();
157: host = tape;
158: tape = index(host, ':');
159: if (tape == 0) {
160: msg("need keyletter ``f'' and device ``host:tape''\n");
161: exit(1);
162: }
163: *tape++ = 0;
164: if (rmthost(host) == 0)
165: exit(X_ABORT);
166: }
167: setuid(getuid()); /* rmthost() is the only reason to be setuid */
168: #endif
169: if (signal(SIGHUP, sighup) == SIG_IGN)
170: signal(SIGHUP, SIG_IGN);
171: if (signal(SIGTRAP, sigtrap) == SIG_IGN)
172: signal(SIGTRAP, SIG_IGN);
173: if (signal(SIGFPE, sigfpe) == SIG_IGN)
174: signal(SIGFPE, SIG_IGN);
175: if (signal(SIGBUS, sigbus) == SIG_IGN)
176: signal(SIGBUS, SIG_IGN);
177: if (signal(SIGSEGV, sigsegv) == SIG_IGN)
178: signal(SIGSEGV, SIG_IGN);
179: if (signal(SIGTERM, sigterm) == SIG_IGN)
180: signal(SIGTERM, SIG_IGN);
181:
182:
183: if (signal(SIGINT, interrupt) == SIG_IGN)
184: signal(SIGINT, SIG_IGN);
185:
186: set_operators(); /* /etc/group snarfed */
187: getfstab(); /* /etc/fstab snarfed */
188: /*
189: * disk can be either the full special file name,
190: * the suffix of the special file name,
191: * the special name missing the leading '/',
192: * the file system name with or without the leading '/'.
193: */
194: dt = fstabsearch(disk);
195: if (dt != 0) {
196: disk = rawname(dt->fs_spec);
197: strncpy(spcl.c_dev, dt->fs_spec, NAMELEN);
198: strncpy(spcl.c_filesys, dt->fs_file, NAMELEN);
199: } else {
200: strncpy(spcl.c_dev, disk, NAMELEN);
201: strncpy(spcl.c_filesys, "an unlisted file system", NAMELEN);
202: }
203: strcpy(spcl.c_label, "none");
204: gethostname(spcl.c_host, NAMELEN);
205: spcl.c_level = incno - '0';
206: spcl.c_type = TS_TAPE;
207: getitime(); /* /etc/dumpdates snarfed */
208:
209: msg("Date of this level %c dump: %s\n", incno, prdate(spcl.c_date));
210: msg("Date of last level %c dump: %s\n",
211: lastincno, prdate(spcl.c_ddate));
212: msg("Dumping %s ", disk);
213: if (dt != 0)
214: msgtail("(%s) ", dt->fs_file);
215: #ifdef RDUMP
216: msgtail("to %s on host %s\n", tape, host);
217: #else
218: msgtail("to %s\n", tape);
219: #endif
220:
221: fi = open(disk, 0);
222: if (fi < 0) {
223: msg("Cannot open %s\n", disk);
224: Exit(X_ABORT);
225: }
226: esize = 0;
227: sblock = (struct fs *)buf;
228: sync();
229: bread(SBOFF, sblock, SBSIZE);
230: if (sblock->fs_magic != FS_MAGIC) {
231: msg("bad sblock magic number\n");
232: dumpabort();
233: }
234: dev_bsize = sblock->fs_fsize / fsbtodb(sblock, 1);
235: msiz = roundup(howmany(sblock->fs_ipg * sblock->fs_ncg, NBBY),
236: TP_BSIZE);
237: clrmap = (char *)calloc(msiz, sizeof(char));
238: dirmap = (char *)calloc(msiz, sizeof(char));
239: nodmap = (char *)calloc(msiz, sizeof(char));
240:
241: anydskipped = 0;
242: msg("mapping (Pass I) [regular files]\n");
243: pass(mark, (char *)NULL); /* mark updates esize */
244:
245: if (anydskipped) {
246: do {
247: msg("mapping (Pass II) [directories]\n");
248: nadded = 0;
249: pass(add, dirmap);
250: } while(nadded);
251: } else /* keep the operators happy */
252: msg("mapping (Pass II) [directories]\n");
253:
254: bmapest(clrmap);
255: bmapest(nodmap);
256:
257: if (cartridge) {
258: /* Estimate number of tapes, assuming streaming stops at
259: the end of each block written, and not in mid-block.
260: Assume no erroneous blocks; this can be compensated for
261: with an artificially low tape size. */
262: fetapes =
263: ( esize /* blocks */
264: * TP_BSIZE /* bytes/block */
265: * (1.0/density) /* 0.1" / byte */
266: +
267: esize /* blocks */
268: * (1.0/ntrec) /* streaming-stops per block */
269: * 15.48 /* 0.1" / streaming-stop */
270: ) * (1.0 / tsize ); /* tape / 0.1" */
271: } else {
272: /* Estimate number of tapes, for old fashioned 9-track tape */
273: int tenthsperirg = (density == 625) ? 3 : 7;
274: fetapes =
275: ( esize /* blocks */
276: * TP_BSIZE /* bytes / block */
277: * (1.0/density) /* 0.1" / byte */
278: +
279: esize /* blocks */
280: * (1.0/ntrec) /* IRG's / block */
281: * tenthsperirg /* 0.1" / IRG */
282: ) * (1.0 / tsize ); /* tape / 0.1" */
283: }
284: etapes = fetapes; /* truncating assignment */
285: etapes++;
286: /* count the nodemap on each additional tape */
287: for (i = 1; i < etapes; i++)
288: bmapest(nodmap);
289: esize += i + 10; /* headers + 10 trailer blocks */
290: msg("estimated %ld tape blocks on %3.2f tape(s).\n", esize, fetapes);
291:
292: alloctape(); /* Allocate tape buffer */
293:
294: otape(); /* bitmap is the first to tape write */
295: time(&(tstart_writing));
296: bitmap(clrmap, TS_CLRI);
297:
298: msg("dumping (Pass III) [directories]\n");
299: pass(dirdump, dirmap);
300:
301: msg("dumping (Pass IV) [regular files]\n");
302: pass(dump, nodmap);
303:
304: spcl.c_type = TS_END;
305: #ifndef RDUMP
306: for(i=0; i<ntrec; i++)
307: spclrec();
308: #endif
309: msg("DUMP: %ld tape blocks on %d tape(s)\n",spcl.c_tapea,spcl.c_volume);
310: msg("DUMP IS DONE\n");
311:
312: putitime();
313: #ifndef RDUMP
314: if (!pipeout) {
315: close(to);
316: rewind();
317: }
318: #else
319: tflush(1);
320: rewind();
321: #endif
322: broadcast("DUMP IS DONE!\7\7\n");
323: Exit(X_FINOK);
324: }
325:
326: int sighup(){ msg("SIGHUP() try rewriting\n"); sigAbort();}
327: int sigtrap(){ msg("SIGTRAP() try rewriting\n"); sigAbort();}
328: int sigfpe(){ msg("SIGFPE() try rewriting\n"); sigAbort();}
329: int sigbus(){ msg("SIGBUS() try rewriting\n"); sigAbort();}
330: int sigsegv(){ msg("SIGSEGV() ABORTING!\n"); abort();}
331: int sigalrm(){ msg("SIGALRM() try rewriting\n"); sigAbort();}
332: int sigterm(){ msg("SIGTERM() try rewriting\n"); sigAbort();}
333:
334: sigAbort()
335: {
336: if (pipeout) {
337: msg("Unknown signal, cannot recover\n");
338: dumpabort();
339: }
340: msg("Rewriting attempted as response to unknown signal.\n");
341: fflush(stderr);
342: fflush(stdout);
343: close_rewind();
344: exit(X_REWRITE);
345: }
346:
347: char *rawname(cp)
348: char *cp;
349: {
350: static char rawbuf[32];
351: char *rindex();
352: char *dp = rindex(cp, '/');
353:
354: if (dp == 0)
355: return (0);
356: *dp = 0;
357: strcpy(rawbuf, cp);
358: *dp = '/';
359: strcat(rawbuf, "/r");
360: strcat(rawbuf, dp+1);
361: return (rawbuf);
362: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.