add umask(0)
[unix-history] / usr / src / old / vpr / vpr.c
CommitLineData
1be37bdb
BJ
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"
11char VAtfname[] = "/usr/spool/vad/tfaXXXXX";
12char VAcfname[] = "/usr/spool/vad/cfaXXXXX";
13char VAdfname[] = "/usr/spool/vad/dfaXXXXX";
14char VPtfname[] = "/usr/spool/vpd/tfaXXXXX";
15char VPcfname[] = "/usr/spool/vpd/cfaXXXXX";
16char VPdfname[] = "/usr/spool/vpd/dfaXXXXX";
17char *tfname;
18char *cfname;
19/* char *lfname; */
20char *dfname;
21int wide;
22int literal;
23int nact;
24int tff;
25int mailflg;
26char person[10];
27int inchar;
28int maxrec = 2000;
29char *width = "-w106";
30int troffit;
31int plotit;
32char *fonts[4];
33
34main(argc, argv)
35 int argc;
36 char *argv[];
37{
38 register char *arg, *remote;
39 int c, f, fv, flag;
40 int out();
41
198929ab 42 umask(0);
1be37bdb
BJ
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
211copy(f)
212int 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
273card(c, s)
274int c;
275char 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
293ident()
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
324pidfn()
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
352nfile(name)
353char *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
366out()
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}