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