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