xref: /csrg-svn/old/vpr/vpr.c (revision 4249)
11853Sroot #include <signal.h>
21853Sroot #include <pagsiz.h>
31853Sroot #define	BUFSIZ	BSIZE
41853Sroot 
51853Sroot /*
61853Sroot  * 	vpr -- varian and versatec (as printers) spooler
71853Sroot  */
81853Sroot 
91853Sroot #define VAD		"/usr/lib/vad"
101853Sroot #define VPD		"/usr/lib/vpd"
111853Sroot char	VAtfname[] =	"/usr/spool/vad/tfaXXXXX";
121853Sroot char	VAcfname[] =	"/usr/spool/vad/cfaXXXXX";
131853Sroot char	VAdfname[] =	"/usr/spool/vad/dfaXXXXX";
141853Sroot char	VPtfname[] =	"/usr/spool/vpd/tfaXXXXX";
151853Sroot char	VPcfname[] =	"/usr/spool/vpd/cfaXXXXX";
161853Sroot char	VPdfname[] =	"/usr/spool/vpd/dfaXXXXX";
171853Sroot char	*tfname;
181853Sroot char	*cfname;
191853Sroot /* char	*lfname; */
201853Sroot char	*dfname;
211853Sroot int	wide;
221853Sroot int	literal;
231853Sroot int	nact;
241853Sroot int	tff;
251853Sroot int	mailflg;
261853Sroot char	person[10];
271853Sroot int	inchar;
281853Sroot int	maxrec	= 2000;
291853Sroot char	*width = "-w106";
301853Sroot int	troffit;
311853Sroot int     plotit;
321853Sroot char	*fonts[4];
331853Sroot 
341853Sroot main(argc, argv)
351853Sroot 	int argc;
361853Sroot 	char *argv[];
371853Sroot {
381853Sroot 	register char *arg, *remote;
391853Sroot 	int c, f, fv, flag;
401853Sroot 	int out();
411853Sroot 
42*4249Sroot 	umask(0);
431853Sroot 	if (signal(SIGINT, SIG_IGN) == SIG_DFL)
441853Sroot 		signal(SIGINT, out);
451853Sroot 	if (signal(SIGQUIT, SIG_IGN) == SIG_DFL)
461853Sroot 		signal(SIGQUIT, out);
471853Sroot 	if (signal(SIGHUP, SIG_IGN) == SIG_DFL)
481853Sroot 		signal(SIGHUP, out);
491853Sroot 	if (signal(SIGTERM, SIG_IGN) == SIG_DFL)
501853Sroot 		signal(SIGTERM, out);
511853Sroot 	remote = "$	remote	**,onl";
521853Sroot 	flag = 0;
531853Sroot 	wide = 0;
541853Sroot 	tfname = VAtfname;
551853Sroot 	cfname = VAcfname;
561853Sroot 	dfname = VAdfname;
571853Sroot 	while (argc>1 && (arg = argv[1])[0]=='-') {
581853Sroot 		if (arg[1] && arg[2]) {
591853Sroot 			remote[12] = arg[1];
601853Sroot 			remote[13] = arg[2];
611853Sroot 			remote[14] = 0;
621853Sroot 		} else switch (arg[1]) {
631853Sroot 
641853Sroot 		case 'W':
651853Sroot 			wide++;
661853Sroot 			tfname = VPtfname;
671853Sroot 			cfname = VPcfname;
681853Sroot 			dfname = VPdfname;
691853Sroot 			break;
701853Sroot 
711853Sroot 		case '-':
721853Sroot 			remote[12] = 'r';
731853Sroot 			remote[13] = '1';
741853Sroot 			remote[14] = '\0';
751853Sroot 			break;
761853Sroot 
771853Sroot 		case 'c':
781853Sroot 			flag = '+';
791853Sroot 			break;
801853Sroot 
811853Sroot 		case 'r':
821853Sroot 			flag = '-';
831853Sroot 			break;
841853Sroot 
851853Sroot                 case 'v':
861853Sroot                         plotit = 1;
871853Sroot                         width = 0;
881853Sroot                         break;
891853Sroot 
901853Sroot 		case 'm':
911853Sroot 			mailflg = 1;
921853Sroot 			break;
931853Sroot 
941853Sroot 		case 't':
951853Sroot 			troffit = 1;
961853Sroot 			width = 0;
971853Sroot 			break;
981853Sroot 
991853Sroot 		case '4':
1001853Sroot 		case '3':
1011853Sroot 		case '2':
1021853Sroot 		case '1':
1031853Sroot 			fonts[arg[1] - '1'] = argv[2];
1041853Sroot 			troffit = 1;
1051853Sroot 			argv++;
1061853Sroot 			argc--;
1071853Sroot 			break;
1081853Sroot 
1091853Sroot 		case 'w':
1101853Sroot 			if (troffit)
1111853Sroot 				break;
1121853Sroot 			if (arg[2] == 0)
1131853Sroot 				width = 0;
1141853Sroot 			else
1151853Sroot 				width = arg;
1161853Sroot 			break;
1171853Sroot 
1181853Sroot 		case 'l':
1191853Sroot 			literal++;	/* Pass control chars through. */
1201853Sroot 			break;
1211853Sroot 		}
1221853Sroot 		argc--;
1231853Sroot 		argv++;
1241853Sroot 	}
1251853Sroot 	pidfn();
1261853Sroot 	tff = nfile(tfname);
1271853Sroot 	if (!wide)		/* varian doesn't use sidebyside. */
1281853Sroot 		width = 0;
1291853Sroot 	ident();
1301853Sroot 	if(argc == 1)
1311853Sroot 		copy(0);
1321853Sroot 	while(--argc > 0) {
1331853Sroot 		arg = *++argv;
1341853Sroot /*
1351853Sroot 		if(flag == '+')
1361853Sroot 			goto cf;
1371853Sroot  * This may not work because the daemon runs as someone else, so don't bother
1381853Sroot 		if(*arg == '/' && flag != '-') {
1391853Sroot 			card(literal ? 'G' : 'F', arg);
1401853Sroot 			nact++;
1411853Sroot 			continue;
1421853Sroot 		}
1431853Sroot 		if(link(arg, lfname) < 0)
1441853Sroot 			goto cf;
1451853Sroot 		card(literal ? 'G' : 'F', lfname);
1461853Sroot 		card('U', lfname);
1471853Sroot 		lfname[inchar]++;
1481853Sroot 		nact++;
1491853Sroot 		goto df;
1501853Sroot  */
1511853Sroot 
1521853Sroot 	cf:
1531853Sroot 		f = open(arg, 0);
1541853Sroot 		if(f < 0) {
1551853Sroot 			printf("Cannot open %s\n", arg);
1561853Sroot 			if (plotit) {
1571853Sroot 				--argc;
1581853Sroot 				arg = *++argv;
1591853Sroot 			}
1601853Sroot 			continue;
1611853Sroot 		}
1621853Sroot                 if (plotit) {
1631853Sroot  			if (--argc > 0) {
1641853Sroot 				arg = *++argv;
1651853Sroot 				fv = open(arg, 0);
1661853Sroot 				if (fv < 0) {
1671853Sroot 					printf("Cannot open %s\n", arg);
1681853Sroot 					close(f);
1691853Sroot 					continue;
1701853Sroot 				}
1711853Sroot 			}
1721853Sroot 			else {
1731853Sroot 				printf("Versaplot requires parm and vector file\n");
1741853Sroot 				close(f);
1751853Sroot 				continue;
1761853Sroot 			}
1771853Sroot 			copy(fv);
1781853Sroot 			close(fv);
1791853Sroot 		}
1801853Sroot 		copy(f);
1811853Sroot 		close(f);
1821853Sroot 
1831853Sroot 	df:
1841853Sroot 		if(flag == '-') {
1851853Sroot 			f = unlink(arg);
1861853Sroot 			if(f < 0)
1871853Sroot 				printf("Cannot remove %s\n", arg);
1881853Sroot 		}
1891853Sroot 	}
1901853Sroot 
1911853Sroot 	if(nact) {
1921853Sroot 		tfname[inchar]--;
1931853Sroot 		f = link(tfname, dfname);
1941853Sroot 		if(f < 0) {
1951853Sroot 			printf("Cannot rename %s\n", dfname);
1961853Sroot 			tfname[inchar]++;
1971853Sroot 			out();
1981853Sroot 		}
1991853Sroot 		unlink(tfname);
2001853Sroot 		if (wide)
2011853Sroot 			execl(VPD, "vpd", 0);
2021853Sroot 		else
2031853Sroot 			execl(VAD, "vad", 0);
2041853Sroot 		dfname[inchar]++;
2051853Sroot 		printf("Daemon doesn't exist\n");
2061853Sroot 		exit(0);
2071853Sroot 	}
2081853Sroot 	out();
2091853Sroot }
2101853Sroot 
2111853Sroot copy(f)
2121853Sroot int f;
2131853Sroot {
2141853Sroot 	int ff, i, nr, nc;
2151853Sroot 	static char buf[BUFSIZ];
2161853Sroot 	int status;
2171853Sroot 
2181853Sroot 	for (i = 0; i < 3; i++)
2191853Sroot 		if (fonts[i])
2201853Sroot 			card('1' + i, fonts[i]);
2211853Sroot 	if (troffit)
2221853Sroot 		card('T', cfname);
2231853Sroot 	else if (plotit)
2241853Sroot 		card('P', cfname);
2251853Sroot 	else
2261853Sroot 		card(literal ? 'G' : 'F', cfname);
2271853Sroot 	card('U', cfname);
2281853Sroot 	ff = nfile(cfname);
2291853Sroot 	nc = 0;
2301853Sroot 	nr = 0;
2311853Sroot 	if (width) {
2321853Sroot 		int pvec[2];
2331853Sroot 		pipe(pvec);
2341853Sroot 		i = fork();
2351853Sroot 		if (i < 0) {
2361853Sroot 			printf("No more processes\n");
2371853Sroot 			out();
2381853Sroot 		}
2391853Sroot 		if (i == 0) {
2401853Sroot 			if (f != 0) {
2411853Sroot 				close(0);
2421853Sroot 				dup(f);
2431853Sroot 			}
2441853Sroot 			close(1);
2451853Sroot 			dup(pvec[1]);
2461853Sroot 			close(pvec[0]);
2471853Sroot 			close(pvec[1]);
2481853Sroot 			execl("/usr/lib/sidebyside", "sidebyside", width, 0);
2491853Sroot 			perror("/usr/lib/sidebyside");
2501853Sroot 			exit(1);
2511853Sroot 		}
2521853Sroot 		close(pvec[1]);
2531853Sroot 		close(f);
2541853Sroot 		f = pvec[0];
2551853Sroot 	}
2561853Sroot 	while((i = read(f, buf, BUFSIZ)) > 0) {
2571853Sroot 		write(ff, buf, i);
2581853Sroot 		nc += i;
2591853Sroot 		if(nc >= BUFSIZ) {
2601853Sroot 			nc -= BUFSIZ;
2611853Sroot 			nr++;
2621853Sroot 			if(nr > maxrec) {
2631853Sroot 				printf("Copy file is too large\n");
2641853Sroot 				break;
2651853Sroot 			}
2661853Sroot 		}
2671853Sroot 	}
2681853Sroot 	close(ff);
2691853Sroot 	nact++;
2701853Sroot 	wait(&status);
2711853Sroot }
2721853Sroot 
2731853Sroot card(c, s)
2741853Sroot int c;
2751853Sroot char s[];
2761853Sroot {
2771853Sroot 	char *p1, *p2;
2781853Sroot 	static char buf[BUFSIZ];
2791853Sroot 	int col;
2801853Sroot 
2811853Sroot 	p1 = buf;
2821853Sroot 	p2 = s;
2831853Sroot 	col = 0;
2841853Sroot 	*p1++ = c;
2851853Sroot 	while((c = *p2++) != '\0') {
2861853Sroot 		*p1++ = c;
2871853Sroot 		col++;
2881853Sroot 	}
2891853Sroot 	*p1++ = '\n';
2901853Sroot 	write(tff, buf, col+2);
2911853Sroot }
2921853Sroot 
2931853Sroot ident()
2941853Sroot {
2951853Sroot 	int c, n;
2961853Sroot 	register char *b1p, *pp, *b2p;
2971853Sroot 	static char b1[100], b2[100];
2981853Sroot 
2991853Sroot 	b1p = b1;
3001853Sroot 	if(getpw(getuid(), b1p)) {
3011853Sroot 		b1p = "pdp::::m0000,m000:";
3021853Sroot 	}
3031853Sroot 	n = 0;
3041853Sroot 	b2p = b2;
3051853Sroot 	while(*b2p++ = "$	ident	"[n++]);
3061853Sroot 	b2p--;
3071853Sroot 	n = 5;
3081853Sroot 	while(--n) while(*b1p++ != ':');
3091853Sroot 	while((*b2p++ = *b1p++) != ':');
3101853Sroot 	b2p[-1] = ',';
3111853Sroot 	b1p = b1;
3121853Sroot 	pp = person;
3131853Sroot 	while((c = *b1p++) != ':') {
3141853Sroot 		*b2p++ = c;
3151853Sroot 		*pp++ = c;
3161853Sroot 	}
3171853Sroot 	*b2p++ = 0;
3181853Sroot 	*pp++ = 0;
3191853Sroot 	card('L', person);
3201853Sroot 	if (mailflg)
3211853Sroot 		card('M', person);
3221853Sroot }
3231853Sroot 
3241853Sroot pidfn()
3251853Sroot {
3261853Sroot 	register i, j, c;
3271853Sroot 	int s;
3281853Sroot 	int p;
3291853Sroot 
3301853Sroot 	s = p = getpid();
3311853Sroot 	p &= 077777;
3321853Sroot 	i = 0;
3331853Sroot 	while(tfname[i] != 'X')
3341853Sroot 		i++;
3351853Sroot 	i += 4;
3361853Sroot 	for(j=0; j<5; j++) {
3371853Sroot 		c = (p%10) + '0';
3381853Sroot 		if(s<0 && j==4)
3391853Sroot 			c += 4;
3401853Sroot 		p /= 10;
3411853Sroot 		tfname[i] = c;
3421853Sroot 		cfname[i] = c;
3431853Sroot /*
3441853Sroot 		lfname[i] = c;
3451853Sroot */
3461853Sroot 		dfname[i] = c;
3471853Sroot 		i--;
3481853Sroot 	}
3491853Sroot 	inchar = i;
3501853Sroot }
3511853Sroot 
3521853Sroot nfile(name)
3531853Sroot char *name;
3541853Sroot {
3551853Sroot 	register f;
3561853Sroot 
3571853Sroot 	f = creat(name, 0644);
3581853Sroot 	if(f < 0) {
3591853Sroot 		printf("Cannot create %s\n", name);
3601853Sroot 		out();
3611853Sroot 	}
3621853Sroot 	name[inchar]++;
3631853Sroot 	return(f);
3641853Sroot }
3651853Sroot 
3661853Sroot out()
3671853Sroot {
3681853Sroot 	register i;
3691853Sroot 
3701853Sroot 	signal(SIGINT, SIG_IGN);
3711853Sroot 	signal(SIGQUIT, SIG_IGN);
3721853Sroot 	signal(SIGHUP, SIG_IGN);
3731853Sroot 	signal(SIGTERM, SIG_IGN);
3741853Sroot 	i = inchar;
3751853Sroot 	while(tfname[i] != 'a') {
3761853Sroot 		tfname[i]--;
3771853Sroot 		unlink(tfname);
3781853Sroot 	}
3791853Sroot 	while(cfname[i] != 'a') {
3801853Sroot 		cfname[i]--;
3811853Sroot 		unlink(cfname);
3821853Sroot 	}
3831853Sroot /*
3841853Sroot 	while(lfname[i] != 'a') {
3851853Sroot 		lfname[i]--;
3861853Sroot 		unlink(lfname);
3871853Sroot 	}
3881853Sroot */
3891853Sroot 	while(dfname[i] != 'a') {
3901853Sroot 		dfname[i]--;
3911853Sroot 		unlink(dfname);
3921853Sroot 	}
3931853Sroot 	exit(0);
3941853Sroot }
395