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 } 397