1*7664Smckusick static char sccsid[] = "@(#)vpr.c 1.3 (Berkeley) 08/06/82"; 2*7664Smckusick 31853Sroot #include <signal.h> 4*7664Smckusick #include <sys/param.h> 5*7664Smckusick #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 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) 2031853Sroot execl(VPD, "vpd", 0); 2041853Sroot else 2051853Sroot execl(VAD, "vad", 0); 2061853Sroot dfname[inchar]++; 2071853Sroot printf("Daemon doesn't exist\n"); 2081853Sroot exit(0); 2091853Sroot } 2101853Sroot out(); 2111853Sroot } 2121853Sroot 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 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 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 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 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 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