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