|
|
1.1 root 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"
10: char tfname[] = "/usr/vpd/tfaXXXXX";
11: char cfname[] = "/usr/vpd/cfaXXXXX";
12: /*
13: char lfname[] = "/usr/vpd/lfaXXXXX";
14: */
15: char dfname[] = "/usr/vpd/dfaXXXXX";
16: int nact;
17: int tff;
18: int mailflg;
19: char person[10];
20: int inchar;
21: int maxrec = 1000;
22: char *width = "-w106";
23: int troffit;
24: int plotit;
25: char *fonts[4];
26:
27: main(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:
183: copy(f)
184: int 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:
245: card(c, s)
246: int c;
247: char 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:
265: ident()
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:
296: pidfn()
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:
324: nfile(name)
325: char *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:
338: out()
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.