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