ignore & before array
[unix-history] / usr / src / old / vpr / vpr.c
CommitLineData
51094b1f 1static char sccsid[] = "@(#)vpr.c 1.4 (Berkeley) %G%";
45e6ec73 2
1be37bdb 3#include <signal.h>
45e6ec73
KM
4#include <sys/param.h>
5#define BUFSIZ MAXBSIZE
1be37bdb
BJ
6
7/*
8 * vpr -- varian and versatec (as printers) spooler
9 */
10
11#define VAD "/usr/lib/vad"
12#define VPD "/usr/lib/vpd"
13char VAtfname[] = "/usr/spool/vad/tfaXXXXX";
14char VAcfname[] = "/usr/spool/vad/cfaXXXXX";
15char VAdfname[] = "/usr/spool/vad/dfaXXXXX";
16char VPtfname[] = "/usr/spool/vpd/tfaXXXXX";
17char VPcfname[] = "/usr/spool/vpd/cfaXXXXX";
18char VPdfname[] = "/usr/spool/vpd/dfaXXXXX";
19char *tfname;
20char *cfname;
21/* char *lfname; */
22char *dfname;
23int wide;
24int literal;
25int nact;
26int tff;
27int mailflg;
28char person[10];
29int inchar;
30int maxrec = 2000;
31char *width = "-w106";
32int troffit;
33int plotit;
34char *fonts[4];
35
36main(argc, argv)
37 int argc;
38 char *argv[];
39{
40 register char *arg, *remote;
41 int c, f, fv, flag;
42 int out();
43
198929ab 44 umask(0);
1be37bdb
BJ
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)
51094b1f 203 execl(VPD, "vpd", "-n", "-3", 0);
1be37bdb 204 else
51094b1f 205 execl(VAD, "vad", "-n", "-3", 0);
1be37bdb
BJ
206 dfname[inchar]++;
207 printf("Daemon doesn't exist\n");
208 exit(0);
209 }
210 out();
211}
212
213copy(f)
214int 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
275card(c, s)
276int c;
277char 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
295ident()
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
326pidfn()
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
354nfile(name)
355char *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
368out()
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}