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