1*1853Sroot #include <signal.h> 2*1853Sroot #include <pagsiz.h> 3*1853Sroot #define BUFSIZ BSIZE 4*1853Sroot 5*1853Sroot /* 6*1853Sroot * vpr -- varian and versatec (as printers) spooler 7*1853Sroot */ 8*1853Sroot 9*1853Sroot #define VAD "/usr/lib/vad" 10*1853Sroot #define VPD "/usr/lib/vpd" 11*1853Sroot char VAtfname[] = "/usr/spool/vad/tfaXXXXX"; 12*1853Sroot char VAcfname[] = "/usr/spool/vad/cfaXXXXX"; 13*1853Sroot char VAdfname[] = "/usr/spool/vad/dfaXXXXX"; 14*1853Sroot char VPtfname[] = "/usr/spool/vpd/tfaXXXXX"; 15*1853Sroot char VPcfname[] = "/usr/spool/vpd/cfaXXXXX"; 16*1853Sroot char VPdfname[] = "/usr/spool/vpd/dfaXXXXX"; 17*1853Sroot char *tfname; 18*1853Sroot char *cfname; 19*1853Sroot /* char *lfname; */ 20*1853Sroot char *dfname; 21*1853Sroot int wide; 22*1853Sroot int literal; 23*1853Sroot int nact; 24*1853Sroot int tff; 25*1853Sroot int mailflg; 26*1853Sroot char person[10]; 27*1853Sroot int inchar; 28*1853Sroot int maxrec = 2000; 29*1853Sroot char *width = "-w106"; 30*1853Sroot int troffit; 31*1853Sroot int plotit; 32*1853Sroot char *fonts[4]; 33*1853Sroot 34*1853Sroot main(argc, argv) 35*1853Sroot int argc; 36*1853Sroot char *argv[]; 37*1853Sroot { 38*1853Sroot register char *arg, *remote; 39*1853Sroot int c, f, fv, flag; 40*1853Sroot int out(); 41*1853Sroot 42*1853Sroot if (signal(SIGINT, SIG_IGN) == SIG_DFL) 43*1853Sroot signal(SIGINT, out); 44*1853Sroot if (signal(SIGQUIT, SIG_IGN) == SIG_DFL) 45*1853Sroot signal(SIGQUIT, out); 46*1853Sroot if (signal(SIGHUP, SIG_IGN) == SIG_DFL) 47*1853Sroot signal(SIGHUP, out); 48*1853Sroot if (signal(SIGTERM, SIG_IGN) == SIG_DFL) 49*1853Sroot signal(SIGTERM, out); 50*1853Sroot remote = "$ remote **,onl"; 51*1853Sroot flag = 0; 52*1853Sroot wide = 0; 53*1853Sroot tfname = VAtfname; 54*1853Sroot cfname = VAcfname; 55*1853Sroot dfname = VAdfname; 56*1853Sroot while (argc>1 && (arg = argv[1])[0]=='-') { 57*1853Sroot if (arg[1] && arg[2]) { 58*1853Sroot remote[12] = arg[1]; 59*1853Sroot remote[13] = arg[2]; 60*1853Sroot remote[14] = 0; 61*1853Sroot } else switch (arg[1]) { 62*1853Sroot 63*1853Sroot case 'W': 64*1853Sroot wide++; 65*1853Sroot tfname = VPtfname; 66*1853Sroot cfname = VPcfname; 67*1853Sroot dfname = VPdfname; 68*1853Sroot break; 69*1853Sroot 70*1853Sroot case '-': 71*1853Sroot remote[12] = 'r'; 72*1853Sroot remote[13] = '1'; 73*1853Sroot remote[14] = '\0'; 74*1853Sroot break; 75*1853Sroot 76*1853Sroot case 'c': 77*1853Sroot flag = '+'; 78*1853Sroot break; 79*1853Sroot 80*1853Sroot case 'r': 81*1853Sroot flag = '-'; 82*1853Sroot break; 83*1853Sroot 84*1853Sroot case 'v': 85*1853Sroot plotit = 1; 86*1853Sroot width = 0; 87*1853Sroot break; 88*1853Sroot 89*1853Sroot case 'm': 90*1853Sroot mailflg = 1; 91*1853Sroot break; 92*1853Sroot 93*1853Sroot case 't': 94*1853Sroot troffit = 1; 95*1853Sroot width = 0; 96*1853Sroot break; 97*1853Sroot 98*1853Sroot case '4': 99*1853Sroot case '3': 100*1853Sroot case '2': 101*1853Sroot case '1': 102*1853Sroot fonts[arg[1] - '1'] = argv[2]; 103*1853Sroot troffit = 1; 104*1853Sroot argv++; 105*1853Sroot argc--; 106*1853Sroot break; 107*1853Sroot 108*1853Sroot case 'w': 109*1853Sroot if (troffit) 110*1853Sroot break; 111*1853Sroot if (arg[2] == 0) 112*1853Sroot width = 0; 113*1853Sroot else 114*1853Sroot width = arg; 115*1853Sroot break; 116*1853Sroot 117*1853Sroot case 'l': 118*1853Sroot literal++; /* Pass control chars through. */ 119*1853Sroot break; 120*1853Sroot } 121*1853Sroot argc--; 122*1853Sroot argv++; 123*1853Sroot } 124*1853Sroot pidfn(); 125*1853Sroot tff = nfile(tfname); 126*1853Sroot if (!wide) /* varian doesn't use sidebyside. */ 127*1853Sroot width = 0; 128*1853Sroot ident(); 129*1853Sroot if(argc == 1) 130*1853Sroot copy(0); 131*1853Sroot while(--argc > 0) { 132*1853Sroot arg = *++argv; 133*1853Sroot /* 134*1853Sroot if(flag == '+') 135*1853Sroot goto cf; 136*1853Sroot * This may not work because the daemon runs as someone else, so don't bother 137*1853Sroot if(*arg == '/' && flag != '-') { 138*1853Sroot card(literal ? 'G' : 'F', arg); 139*1853Sroot nact++; 140*1853Sroot continue; 141*1853Sroot } 142*1853Sroot if(link(arg, lfname) < 0) 143*1853Sroot goto cf; 144*1853Sroot card(literal ? 'G' : 'F', lfname); 145*1853Sroot card('U', lfname); 146*1853Sroot lfname[inchar]++; 147*1853Sroot nact++; 148*1853Sroot goto df; 149*1853Sroot */ 150*1853Sroot 151*1853Sroot cf: 152*1853Sroot f = open(arg, 0); 153*1853Sroot if(f < 0) { 154*1853Sroot printf("Cannot open %s\n", arg); 155*1853Sroot if (plotit) { 156*1853Sroot --argc; 157*1853Sroot arg = *++argv; 158*1853Sroot } 159*1853Sroot continue; 160*1853Sroot } 161*1853Sroot if (plotit) { 162*1853Sroot if (--argc > 0) { 163*1853Sroot arg = *++argv; 164*1853Sroot fv = open(arg, 0); 165*1853Sroot if (fv < 0) { 166*1853Sroot printf("Cannot open %s\n", arg); 167*1853Sroot close(f); 168*1853Sroot continue; 169*1853Sroot } 170*1853Sroot } 171*1853Sroot else { 172*1853Sroot printf("Versaplot requires parm and vector file\n"); 173*1853Sroot close(f); 174*1853Sroot continue; 175*1853Sroot } 176*1853Sroot copy(fv); 177*1853Sroot close(fv); 178*1853Sroot } 179*1853Sroot copy(f); 180*1853Sroot close(f); 181*1853Sroot 182*1853Sroot df: 183*1853Sroot if(flag == '-') { 184*1853Sroot f = unlink(arg); 185*1853Sroot if(f < 0) 186*1853Sroot printf("Cannot remove %s\n", arg); 187*1853Sroot } 188*1853Sroot } 189*1853Sroot 190*1853Sroot if(nact) { 191*1853Sroot tfname[inchar]--; 192*1853Sroot f = link(tfname, dfname); 193*1853Sroot if(f < 0) { 194*1853Sroot printf("Cannot rename %s\n", dfname); 195*1853Sroot tfname[inchar]++; 196*1853Sroot out(); 197*1853Sroot } 198*1853Sroot unlink(tfname); 199*1853Sroot if (wide) 200*1853Sroot execl(VPD, "vpd", 0); 201*1853Sroot else 202*1853Sroot execl(VAD, "vad", 0); 203*1853Sroot dfname[inchar]++; 204*1853Sroot printf("Daemon doesn't exist\n"); 205*1853Sroot exit(0); 206*1853Sroot } 207*1853Sroot out(); 208*1853Sroot } 209*1853Sroot 210*1853Sroot copy(f) 211*1853Sroot int f; 212*1853Sroot { 213*1853Sroot int ff, i, nr, nc; 214*1853Sroot static char buf[BUFSIZ]; 215*1853Sroot int status; 216*1853Sroot 217*1853Sroot for (i = 0; i < 3; i++) 218*1853Sroot if (fonts[i]) 219*1853Sroot card('1' + i, fonts[i]); 220*1853Sroot if (troffit) 221*1853Sroot card('T', cfname); 222*1853Sroot else if (plotit) 223*1853Sroot card('P', cfname); 224*1853Sroot else 225*1853Sroot card(literal ? 'G' : 'F', cfname); 226*1853Sroot card('U', cfname); 227*1853Sroot ff = nfile(cfname); 228*1853Sroot nc = 0; 229*1853Sroot nr = 0; 230*1853Sroot if (width) { 231*1853Sroot int pvec[2]; 232*1853Sroot pipe(pvec); 233*1853Sroot i = fork(); 234*1853Sroot if (i < 0) { 235*1853Sroot printf("No more processes\n"); 236*1853Sroot out(); 237*1853Sroot } 238*1853Sroot if (i == 0) { 239*1853Sroot if (f != 0) { 240*1853Sroot close(0); 241*1853Sroot dup(f); 242*1853Sroot } 243*1853Sroot close(1); 244*1853Sroot dup(pvec[1]); 245*1853Sroot close(pvec[0]); 246*1853Sroot close(pvec[1]); 247*1853Sroot execl("/usr/lib/sidebyside", "sidebyside", width, 0); 248*1853Sroot perror("/usr/lib/sidebyside"); 249*1853Sroot exit(1); 250*1853Sroot } 251*1853Sroot close(pvec[1]); 252*1853Sroot close(f); 253*1853Sroot f = pvec[0]; 254*1853Sroot } 255*1853Sroot while((i = read(f, buf, BUFSIZ)) > 0) { 256*1853Sroot write(ff, buf, i); 257*1853Sroot nc += i; 258*1853Sroot if(nc >= BUFSIZ) { 259*1853Sroot nc -= BUFSIZ; 260*1853Sroot nr++; 261*1853Sroot if(nr > maxrec) { 262*1853Sroot printf("Copy file is too large\n"); 263*1853Sroot break; 264*1853Sroot } 265*1853Sroot } 266*1853Sroot } 267*1853Sroot close(ff); 268*1853Sroot nact++; 269*1853Sroot wait(&status); 270*1853Sroot } 271*1853Sroot 272*1853Sroot card(c, s) 273*1853Sroot int c; 274*1853Sroot char s[]; 275*1853Sroot { 276*1853Sroot char *p1, *p2; 277*1853Sroot static char buf[BUFSIZ]; 278*1853Sroot int col; 279*1853Sroot 280*1853Sroot p1 = buf; 281*1853Sroot p2 = s; 282*1853Sroot col = 0; 283*1853Sroot *p1++ = c; 284*1853Sroot while((c = *p2++) != '\0') { 285*1853Sroot *p1++ = c; 286*1853Sroot col++; 287*1853Sroot } 288*1853Sroot *p1++ = '\n'; 289*1853Sroot write(tff, buf, col+2); 290*1853Sroot } 291*1853Sroot 292*1853Sroot ident() 293*1853Sroot { 294*1853Sroot int c, n; 295*1853Sroot register char *b1p, *pp, *b2p; 296*1853Sroot static char b1[100], b2[100]; 297*1853Sroot 298*1853Sroot b1p = b1; 299*1853Sroot if(getpw(getuid(), b1p)) { 300*1853Sroot b1p = "pdp::::m0000,m000:"; 301*1853Sroot } 302*1853Sroot n = 0; 303*1853Sroot b2p = b2; 304*1853Sroot while(*b2p++ = "$ ident "[n++]); 305*1853Sroot b2p--; 306*1853Sroot n = 5; 307*1853Sroot while(--n) while(*b1p++ != ':'); 308*1853Sroot while((*b2p++ = *b1p++) != ':'); 309*1853Sroot b2p[-1] = ','; 310*1853Sroot b1p = b1; 311*1853Sroot pp = person; 312*1853Sroot while((c = *b1p++) != ':') { 313*1853Sroot *b2p++ = c; 314*1853Sroot *pp++ = c; 315*1853Sroot } 316*1853Sroot *b2p++ = 0; 317*1853Sroot *pp++ = 0; 318*1853Sroot card('L', person); 319*1853Sroot if (mailflg) 320*1853Sroot card('M', person); 321*1853Sroot } 322*1853Sroot 323*1853Sroot pidfn() 324*1853Sroot { 325*1853Sroot register i, j, c; 326*1853Sroot int s; 327*1853Sroot int p; 328*1853Sroot 329*1853Sroot s = p = getpid(); 330*1853Sroot p &= 077777; 331*1853Sroot i = 0; 332*1853Sroot while(tfname[i] != 'X') 333*1853Sroot i++; 334*1853Sroot i += 4; 335*1853Sroot for(j=0; j<5; j++) { 336*1853Sroot c = (p%10) + '0'; 337*1853Sroot if(s<0 && j==4) 338*1853Sroot c += 4; 339*1853Sroot p /= 10; 340*1853Sroot tfname[i] = c; 341*1853Sroot cfname[i] = c; 342*1853Sroot /* 343*1853Sroot lfname[i] = c; 344*1853Sroot */ 345*1853Sroot dfname[i] = c; 346*1853Sroot i--; 347*1853Sroot } 348*1853Sroot inchar = i; 349*1853Sroot } 350*1853Sroot 351*1853Sroot nfile(name) 352*1853Sroot char *name; 353*1853Sroot { 354*1853Sroot register f; 355*1853Sroot 356*1853Sroot f = creat(name, 0644); 357*1853Sroot if(f < 0) { 358*1853Sroot printf("Cannot create %s\n", name); 359*1853Sroot out(); 360*1853Sroot } 361*1853Sroot name[inchar]++; 362*1853Sroot return(f); 363*1853Sroot } 364*1853Sroot 365*1853Sroot out() 366*1853Sroot { 367*1853Sroot register i; 368*1853Sroot 369*1853Sroot signal(SIGINT, SIG_IGN); 370*1853Sroot signal(SIGQUIT, SIG_IGN); 371*1853Sroot signal(SIGHUP, SIG_IGN); 372*1853Sroot signal(SIGTERM, SIG_IGN); 373*1853Sroot i = inchar; 374*1853Sroot while(tfname[i] != 'a') { 375*1853Sroot tfname[i]--; 376*1853Sroot unlink(tfname); 377*1853Sroot } 378*1853Sroot while(cfname[i] != 'a') { 379*1853Sroot cfname[i]--; 380*1853Sroot unlink(cfname); 381*1853Sroot } 382*1853Sroot /* 383*1853Sroot while(lfname[i] != 'a') { 384*1853Sroot lfname[i]--; 385*1853Sroot unlink(lfname); 386*1853Sroot } 387*1853Sroot */ 388*1853Sroot while(dfname[i] != 'a') { 389*1853Sroot dfname[i]--; 390*1853Sroot unlink(dfname); 391*1853Sroot } 392*1853Sroot exit(0); 393*1853Sroot } 394