|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.