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