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