|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.