xref: /original-bsd/old/dump.4.1/dumpmain.c (revision e59fb703)
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.1 (Berkeley) 06/05/85";
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 = 160;	/* density in 0.1" units */
17 
18 main(argc, argv)
19 	int	argc;
20 	char	*argv[];
21 {
22 	char		*arg;
23 	register	i;
24 	float		fetapes;
25 	register	struct	fstab	*dt;
26 
27 	time(&(spcl.c_date));
28 
29 	tsize = 2300L*12L*10L;
30 	tape = TAPE;
31 	disk = DISK;
32 	increm = NINCREM;
33 
34 	incno = '9';
35 	uflag = 0;
36 	arg = "u";
37 	if(argc > 1) {
38 		argv++;
39 		argc--;
40 		arg = *argv;
41 		if (*arg == '-')
42 			argc++;
43 	}
44 	while(*arg)
45 	switch (*arg++) {
46 	case 'w':
47 		lastdump('w');		/* tell us only what has to be done */
48 		exit(0);
49 		break;
50 	case 'W':			/* what to do */
51 		lastdump('W');		/* tell us the current state of what has been done */
52 		exit(0);		/* do nothing else */
53 		break;
54 
55 	case 'J':			/* update old to new */
56 		o_nconvert();
57 		exit(0);		/* do nothing else */
58 		break;
59 
60 	case 'f':			/* output file */
61 		if(argc > 1) {
62 			argv++;
63 			argc--;
64 			tape = *argv;
65 		}
66 		break;
67 
68 	case 'd':			/* density, in bits per inch */
69 		if (argc > 1) {
70 			argv++;
71 			argc--;
72 			density = atoi(*argv) / 10;
73 		}
74 		break;
75 
76 	case 's':			/* tape size, feet */
77 		if(argc > 1) {
78 			argv++;
79 			argc--;
80 			tsize = atol(*argv);
81 			tsize *= 12L*10L;
82 		}
83 		break;
84 
85 	case '0':			/* dump level */
86 	case '1':
87 	case '2':
88 	case '3':
89 	case '4':
90 	case '5':
91 	case '6':
92 	case '7':
93 	case '8':
94 	case '9':
95 		incno = arg[-1];
96 		break;
97 
98 	case 'u':			/* update /etc/dumpdates */
99 		uflag++;
100 		break;
101 
102 	case 'n':			/* notify operators */
103 		notify++;
104 		break;
105 
106 	default:
107 		fprintf(stderr, "bad key '%c%'\n", arg[-1]);
108 		Exit(X_ABORT);
109 	}
110 	if(strcmp(tape, "-") == 0) {
111 		pipeout++;
112 		tape = "standard output";
113 	}
114 	if(argc > 1) {
115 		argv++;
116 		argc--;
117 		disk = *argv;
118 	}
119 
120 	if (signal(SIGHUP, sighup) == SIG_IGN)
121 		signal(SIGHUP, SIG_IGN);
122 	if (signal(SIGTRAP, sigtrap) == SIG_IGN)
123 		signal(SIGTRAP, SIG_IGN);
124 	if (signal(SIGFPE, sigfpe) == SIG_IGN)
125 		signal(SIGFPE, SIG_IGN);
126 	if (signal(SIGBUS, sigbus) == SIG_IGN)
127 		signal(SIGBUS, SIG_IGN);
128 	if (signal(SIGSEGV, sigsegv) == SIG_IGN)
129 		signal(SIGSEGV, SIG_IGN);
130 	if (signal(SIGTERM, sigterm) == SIG_IGN)
131 		signal(SIGTERM, SIG_IGN);
132 
133 
134 	if (signal(SIGINT, interrupt) == SIG_IGN)
135 		signal(SIGINT, SIG_IGN);
136 
137 	set_operators();	/* /etc/group snarfed */
138 	getfstab();		/* /etc/fstab snarfed */
139 	/*
140 	 *	disk can be either the full special file name,
141 	 *	the suffix of the special file name,
142 	 *	the special name missing the leading '/',
143 	 *	the file system name with or without the leading '/'.
144 	 */
145 	dt = fstabsearch(disk);
146 	if (dt != 0)
147 		disk = rawname(dt->fs_spec);
148 	getitime();		/* /etc/dumpdates snarfed */
149 
150 	msg("Date of this level %c dump: %s\n", incno, prdate(spcl.c_date));
151 	msg("Date of last level %c dump: %s\n", incno, prdate(spcl.c_ddate));
152 	msg("Dumping %s ", disk);
153 	if (dt != 0)
154 		msgtail("(%s) ", dt->fs_file);
155 	msgtail("to %s\n", tape);
156 
157 	fi = open(disk, 0);
158 	if (fi < 0) {
159 		msg("Cannot open %s\n", disk);
160 		Exit(X_ABORT);
161 	}
162 	CLR(clrmap);
163 	CLR(dirmap);
164 	CLR(nodmap);
165 	esize = 0;
166 
167 	msg("mapping (Pass I) [regular files]\n");
168 	pass(mark, (short *)NULL);		/* mark updates esize */
169 
170 	do {
171 		msg("mapping (Pass II) [directories]\n");
172 		nadded = 0;
173 		pass(add, dirmap);
174 	} while(nadded);
175 
176 	bmapest(clrmap);
177 	bmapest(nodmap);
178 
179 	fetapes =
180 		(	 esize		/* blocks */
181 			*BSIZE		/* bytes / block */
182 			*(1.0/density)	/* 0.1" / byte */
183 		  +
184 			 esize		/* blocks */
185 			*(1.0/NTREC)	/* IRG's / block */
186 			*7		/* 0.1" / IRG */
187 		) * (1.0 / tsize )	/* tape / 0.1" */
188 	;
189 	etapes = fetapes;		/* truncating assignment */
190 	etapes++;
191 	/*
192 	 *	esize is typically about 5% too low; we frob it here
193 	 */
194 	esize += ((5*esize)/100);
195 	msg("estimated %ld tape blocks on %3.2f tape(s).\n", esize, fetapes);
196 
197 	otape();			/* bitmap is the first to tape write */
198 	time(&(tstart_writing));
199 	bitmap(clrmap, TS_CLRI);
200 
201 	msg("dumping (Pass III) [directories]\n");
202 	pass(dump, dirmap);
203 
204 	msg("dumping (Pass IV) [regular files]\n");
205 	pass(dump, nodmap);
206 
207 	spcl.c_type = TS_END;
208 	for(i=0; i<NTREC; i++)
209 		spclrec();
210 	msg("DUMP: %ld tape blocks on %d tape(s)\n",spcl.c_tapea,spcl.c_volume);
211 	msg("DUMP IS DONE\n");
212 
213 	putitime();
214 	if (!pipeout) {
215 		close(to);
216 		rewind();
217 	}
218 	broadcast("DUMP IS DONE!\7\7\n");
219 	Exit(X_FINOK);
220 }
221 
222 int	sighup(){	msg("SIGHUP()  try rewriting\n"); sigAbort();}
223 int	sigtrap(){	msg("SIGTRAP()  try rewriting\n"); sigAbort();}
224 int	sigfpe(){	msg("SIGFPE()  try rewriting\n"); sigAbort();}
225 int	sigbus(){	msg("SIGBUS()  try rewriting\n"); sigAbort();}
226 int	sigsegv(){	msg("SIGSEGV()  ABORTING!\n"); abort();}
227 int	sigalrm(){	msg("SIGALRM()  try rewriting\n"); sigAbort();}
228 int	sigterm(){	msg("SIGTERM()  try rewriting\n"); sigAbort();}
229 
230 sigAbort()
231 {
232 	msg("Rewriting attempted as response to unknown signal.\n");
233 	fflush(stderr);
234 	fflush(stdout);
235 	close_rewind();
236 	exit(X_REWRITE);
237 }
238 
239 char *rawname(cp)
240 	char *cp;
241 {
242 	static char rawbuf[32];
243 	char *dp = (char *)rindex(cp, '/');
244 
245 	if (dp == 0)
246 		return (0);
247 	*dp = 0;
248 	strcpy(rawbuf, cp);
249 	*dp = '/';
250 	strcat(rawbuf, "/r");
251 	strcat(rawbuf, dp+1);
252 	return (rawbuf);
253 }
254