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