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