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