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