xref: /original-bsd/old/vpr/vpr.c (revision aba77441)
1 static char sccsid[] = "@(#)vpr.c	1.4	(Berkeley)	11/18/82";
2 
3 #include <signal.h>
4 #include <sys/param.h>
5 #define	BUFSIZ	MAXBSIZE
6 
7 /*
8  * 	vpr -- varian and versatec (as printers) spooler
9  */
10 
11 #define VAD		"/usr/lib/vad"
12 #define VPD		"/usr/lib/vpd"
13 char	VAtfname[] =	"/usr/spool/vad/tfaXXXXX";
14 char	VAcfname[] =	"/usr/spool/vad/cfaXXXXX";
15 char	VAdfname[] =	"/usr/spool/vad/dfaXXXXX";
16 char	VPtfname[] =	"/usr/spool/vpd/tfaXXXXX";
17 char	VPcfname[] =	"/usr/spool/vpd/cfaXXXXX";
18 char	VPdfname[] =	"/usr/spool/vpd/dfaXXXXX";
19 char	*tfname;
20 char	*cfname;
21 /* char	*lfname; */
22 char	*dfname;
23 int	wide;
24 int	literal;
25 int	nact;
26 int	tff;
27 int	mailflg;
28 char	person[10];
29 int	inchar;
30 int	maxrec	= 2000;
31 char	*width = "-w106";
32 int	troffit;
33 int     plotit;
34 char	*fonts[4];
35 
36 main(argc, argv)
37 	int argc;
38 	char *argv[];
39 {
40 	register char *arg, *remote;
41 	int c, f, fv, flag;
42 	int out();
43 
44 	umask(0);
45 	if (signal(SIGINT, SIG_IGN) == SIG_DFL)
46 		signal(SIGINT, out);
47 	if (signal(SIGQUIT, SIG_IGN) == SIG_DFL)
48 		signal(SIGQUIT, out);
49 	if (signal(SIGHUP, SIG_IGN) == SIG_DFL)
50 		signal(SIGHUP, out);
51 	if (signal(SIGTERM, SIG_IGN) == SIG_DFL)
52 		signal(SIGTERM, out);
53 	remote = "$	remote	**,onl";
54 	flag = 0;
55 	wide = 0;
56 	tfname = VAtfname;
57 	cfname = VAcfname;
58 	dfname = VAdfname;
59 	while (argc>1 && (arg = argv[1])[0]=='-') {
60 		if (arg[1] && arg[2]) {
61 			remote[12] = arg[1];
62 			remote[13] = arg[2];
63 			remote[14] = 0;
64 		} else switch (arg[1]) {
65 
66 		case 'W':
67 			wide++;
68 			tfname = VPtfname;
69 			cfname = VPcfname;
70 			dfname = VPdfname;
71 			break;
72 
73 		case '-':
74 			remote[12] = 'r';
75 			remote[13] = '1';
76 			remote[14] = '\0';
77 			break;
78 
79 		case 'c':
80 			flag = '+';
81 			break;
82 
83 		case 'r':
84 			flag = '-';
85 			break;
86 
87                 case 'v':
88                         plotit = 1;
89                         width = 0;
90                         break;
91 
92 		case 'm':
93 			mailflg = 1;
94 			break;
95 
96 		case 't':
97 			troffit = 1;
98 			width = 0;
99 			break;
100 
101 		case '4':
102 		case '3':
103 		case '2':
104 		case '1':
105 			fonts[arg[1] - '1'] = argv[2];
106 			troffit = 1;
107 			argv++;
108 			argc--;
109 			break;
110 
111 		case 'w':
112 			if (troffit)
113 				break;
114 			if (arg[2] == 0)
115 				width = 0;
116 			else
117 				width = arg;
118 			break;
119 
120 		case 'l':
121 			literal++;	/* Pass control chars through. */
122 			break;
123 		}
124 		argc--;
125 		argv++;
126 	}
127 	pidfn();
128 	tff = nfile(tfname);
129 	if (!wide)		/* varian doesn't use sidebyside. */
130 		width = 0;
131 	ident();
132 	if(argc == 1)
133 		copy(0);
134 	while(--argc > 0) {
135 		arg = *++argv;
136 /*
137 		if(flag == '+')
138 			goto cf;
139  * This may not work because the daemon runs as someone else, so don't bother
140 		if(*arg == '/' && flag != '-') {
141 			card(literal ? 'G' : 'F', arg);
142 			nact++;
143 			continue;
144 		}
145 		if(link(arg, lfname) < 0)
146 			goto cf;
147 		card(literal ? 'G' : 'F', lfname);
148 		card('U', lfname);
149 		lfname[inchar]++;
150 		nact++;
151 		goto df;
152  */
153 
154 	cf:
155 		f = open(arg, 0);
156 		if(f < 0) {
157 			printf("Cannot open %s\n", arg);
158 			if (plotit) {
159 				--argc;
160 				arg = *++argv;
161 			}
162 			continue;
163 		}
164                 if (plotit) {
165  			if (--argc > 0) {
166 				arg = *++argv;
167 				fv = open(arg, 0);
168 				if (fv < 0) {
169 					printf("Cannot open %s\n", arg);
170 					close(f);
171 					continue;
172 				}
173 			}
174 			else {
175 				printf("Versaplot requires parm and vector file\n");
176 				close(f);
177 				continue;
178 			}
179 			copy(fv);
180 			close(fv);
181 		}
182 		copy(f);
183 		close(f);
184 
185 	df:
186 		if(flag == '-') {
187 			f = unlink(arg);
188 			if(f < 0)
189 				printf("Cannot remove %s\n", arg);
190 		}
191 	}
192 
193 	if(nact) {
194 		tfname[inchar]--;
195 		f = link(tfname, dfname);
196 		if(f < 0) {
197 			printf("Cannot rename %s\n", dfname);
198 			tfname[inchar]++;
199 			out();
200 		}
201 		unlink(tfname);
202 		if (wide)
203 			execl(VPD, "vpd", "-n", "-3", 0);
204 		else
205 			execl(VAD, "vad", "-n", "-3", 0);
206 		dfname[inchar]++;
207 		printf("Daemon doesn't exist\n");
208 		exit(0);
209 	}
210 	out();
211 }
212 
213 copy(f)
214 int f;
215 {
216 	int ff, i, nr, nc;
217 	static char buf[BUFSIZ];
218 	int status;
219 
220 	for (i = 0; i < 3; i++)
221 		if (fonts[i])
222 			card('1' + i, fonts[i]);
223 	if (troffit)
224 		card('T', cfname);
225 	else if (plotit)
226 		card('P', cfname);
227 	else
228 		card(literal ? 'G' : 'F', cfname);
229 	card('U', cfname);
230 	ff = nfile(cfname);
231 	nc = 0;
232 	nr = 0;
233 	if (width) {
234 		int pvec[2];
235 		pipe(pvec);
236 		i = fork();
237 		if (i < 0) {
238 			printf("No more processes\n");
239 			out();
240 		}
241 		if (i == 0) {
242 			if (f != 0) {
243 				close(0);
244 				dup(f);
245 			}
246 			close(1);
247 			dup(pvec[1]);
248 			close(pvec[0]);
249 			close(pvec[1]);
250 			execl("/usr/lib/sidebyside", "sidebyside", width, 0);
251 			perror("/usr/lib/sidebyside");
252 			exit(1);
253 		}
254 		close(pvec[1]);
255 		close(f);
256 		f = pvec[0];
257 	}
258 	while((i = read(f, buf, BUFSIZ)) > 0) {
259 		write(ff, buf, i);
260 		nc += i;
261 		if(nc >= BUFSIZ) {
262 			nc -= BUFSIZ;
263 			nr++;
264 			if(nr > maxrec) {
265 				printf("Copy file is too large\n");
266 				break;
267 			}
268 		}
269 	}
270 	close(ff);
271 	nact++;
272 	wait(&status);
273 }
274 
275 card(c, s)
276 int c;
277 char s[];
278 {
279 	char *p1, *p2;
280 	static char buf[BUFSIZ];
281 	int col;
282 
283 	p1 = buf;
284 	p2 = s;
285 	col = 0;
286 	*p1++ = c;
287 	while((c = *p2++) != '\0') {
288 		*p1++ = c;
289 		col++;
290 	}
291 	*p1++ = '\n';
292 	write(tff, buf, col+2);
293 }
294 
295 ident()
296 {
297 	int c, n;
298 	register char *b1p, *pp, *b2p;
299 	static char b1[100], b2[100];
300 
301 	b1p = b1;
302 	if(getpw(getuid(), b1p)) {
303 		b1p = "pdp::::m0000,m000:";
304 	}
305 	n = 0;
306 	b2p = b2;
307 	while(*b2p++ = "$	ident	"[n++]);
308 	b2p--;
309 	n = 5;
310 	while(--n) while(*b1p++ != ':');
311 	while((*b2p++ = *b1p++) != ':');
312 	b2p[-1] = ',';
313 	b1p = b1;
314 	pp = person;
315 	while((c = *b1p++) != ':') {
316 		*b2p++ = c;
317 		*pp++ = c;
318 	}
319 	*b2p++ = 0;
320 	*pp++ = 0;
321 	card('L', person);
322 	if (mailflg)
323 		card('M', person);
324 }
325 
326 pidfn()
327 {
328 	register i, j, c;
329 	int s;
330 	int p;
331 
332 	s = p = getpid();
333 	p &= 077777;
334 	i = 0;
335 	while(tfname[i] != 'X')
336 		i++;
337 	i += 4;
338 	for(j=0; j<5; j++) {
339 		c = (p%10) + '0';
340 		if(s<0 && j==4)
341 			c += 4;
342 		p /= 10;
343 		tfname[i] = c;
344 		cfname[i] = c;
345 /*
346 		lfname[i] = c;
347 */
348 		dfname[i] = c;
349 		i--;
350 	}
351 	inchar = i;
352 }
353 
354 nfile(name)
355 char *name;
356 {
357 	register f;
358 
359 	f = creat(name, 0644);
360 	if(f < 0) {
361 		printf("Cannot create %s\n", name);
362 		out();
363 	}
364 	name[inchar]++;
365 	return(f);
366 }
367 
368 out()
369 {
370 	register i;
371 
372 	signal(SIGINT, SIG_IGN);
373 	signal(SIGQUIT, SIG_IGN);
374 	signal(SIGHUP, SIG_IGN);
375 	signal(SIGTERM, SIG_IGN);
376 	i = inchar;
377 	while(tfname[i] != 'a') {
378 		tfname[i]--;
379 		unlink(tfname);
380 	}
381 	while(cfname[i] != 'a') {
382 		cfname[i]--;
383 		unlink(cfname);
384 	}
385 /*
386 	while(lfname[i] != 'a') {
387 		lfname[i]--;
388 		unlink(lfname);
389 	}
390 */
391 	while(dfname[i] != 'a') {
392 		dfname[i]--;
393 		unlink(dfname);
394 	}
395 	exit(0);
396 }
397