|
|
1.1 root 1: #
2:
3: /*
4: * Versatec printer daemon
5: */
6:
7: #include <stdio.h>
8: #include <sys/types.h>
9: #include <dir.h>
10: #include <signal.h>
11: #include <stat.h>
12: #include <sgtty.h>
13: #include <errno.h>
14:
15: extern int errno;
16:
17: #define SETSTATE (('v'<<8)|1)
18: #define VRAST "/usr/local/lib/vrast"
19: int prtmode[] = {0100, 0, 0};
20:
21: char line[128];
22: char linep[127];
23: char banbuf[64];
24: char printflag;
25: int linel;
26: FILE *dfb;
27: char dfname [27] = "/usr/vpd/";
28: int waittm = 6;
29: struct dir dbuf;
30: int onalrm ();
31: char fonts[4][50] =
32: {
33: "/usr/lib/vfont/R",
34: "/usr/lib/vfont/I",
35: "/usr/lib/vfont/B",
36: "/usr/lib/vfont/S"
37: };
38:
39: main (argc, argv)
40: {
41: char dp, n;
42: register char *p1, *p2;
43: register int df;
44: struct stat stb;
45: int offline = 0;
46: int i;
47:
48: signal (SIGHUP, SIG_IGN);
49: signal (SIGINT, SIG_IGN);
50: signal (SIGQUIT, SIG_IGN);
51: signal (SIGTERM, SIG_IGN);
52: /*
53: * Close all files, open root as 0, 1, 2
54: * to assure standard environment
55: */
56: for (df=0; df<=15; df++)
57: close (df);
58: open ("/", 0);
59: dup (0);
60: dup (0);
61: if (chdir ("/usr/vpd") < 0)
62: exit (1);
63: if (stat ("lock", &stb) >= 0)
64: exit ();
65: if ((df=creat ("lock", 0)) < 0)
66: exit ();
67: close (df);
68: i = fork ();
69: if (i < 0)
70: {
71: unlink ("lock");
72: exit ();
73: }
74: if (i != 0)
75: exit ();
76: for (;;)
77: {
78: if (open ("/dev/vp0", 1) == 3)
79: break;
80: if (errno != EIO)
81: {
82: perror ("/dev/vp0");
83: unlink ("lock");
84: exit ();
85: }
86: if (offline == 0)
87: {
88: int f = open ("/dev/tty", 1);
89: offline++;
90: if (f > 0)
91: {
92: write (f, "Versatec is offline\n", 20);
93: close (f);
94: }
95: }
96: sleep (10);
97: }
98: dp = open (".", 0);
99: /*
100: * the main loop
101: */
102: for (;;)
103: {
104: /*
105: * find the first queueable directory entry
106: */
107: lseek (dp, 0, 0);
108: for (;;)
109: {
110: n = read (dp, &dbuf, sizeof dbuf);
111: if (n <= 0)
112: {
113: /*
114: * if there was a job printed
115: * pull it out of the toner bath
116: */
117: if (printflag)
118: feedpage ();
119: unlink ("lock");
120: exit ();
121: }
122: if
123: (
124: dbuf.d_ino
125: &&
126: dbuf.d_name[0] == 'd'
127: &&
128: dbuf.d_name[1] == 'f'
129: )
130: {
131: break;
132: }
133: }
134: strcpy (&dfname [9], dbuf.d_name);
135: if (trysend (dfname) == 0) /* everything was ok */
136: {
137: write (3, "\n\n\n", 3);
138: printflag++;
139: }
140: }
141: }
142:
143: trysend (file)
144: char *file;
145: {
146: register int i;
147: extern int badexit ();
148: char plot;
149:
150: resfonts();
151: dfb = fopen (file, "r");
152: if (dfb == NULL)
153: return (0);
154: for (*banbuf = plot = 0; getline ();)
155: {
156: switch (line[0])
157: {
158: case 'L':
159: strcpy (banbuf, line + 1);
160: continue;
161:
162: case '1':
163: case '2':
164: case '3':
165: case '4':
166: strcpy (fonts[line[0]-'1'], line + 1);
167: continue;
168:
169: case 'F':
170: case 'T':
171: if (send (line[0]))
172: {
173: ioctl (3, SETSTATE, prtmode);
174: write (3, "\nJOB ABORTED***\n", 16);
175: }
176: continue;
177:
178: case 'P':
179: if (plot)
180: {
181: plot = 0;
182: if (send (line[0]))
183: {
184: ioctl (3, SETSTATE, prtmode);
185: write (3, "\nJOB ABORTED***\n", 16);
186: }
187: else
188: continue;
189: }
190: else
191: {
192: strcpy (linep, line + 1);
193: plot++;
194: continue;
195: }
196:
197: case 'U':
198: continue;
199:
200: case 'M':
201: continue;
202: }
203: }
204: /*
205: * Second pass.
206: * Unlink files and send mail.
207: */
208: fseek (dfb, 0, 0);
209: while (getline ())
210: {
211: switch (*line)
212: {
213: default:
214: continue;
215:
216: case 'U':
217: unlink (line + 1);
218: continue;
219:
220: case 'M':
221: sendmail ();
222: continue;
223: }
224: }
225: fclose (dfb);
226: unlink (file);
227: return (0);
228: }
229:
230: static char ifonts[4][50] =
231: {
232: "/usr/lib/vfont/R",
233: "/usr/lib/vfont/I",
234: "/usr/lib/vfont/B",
235: "/usr/lib/vfont/S"
236: };
237:
238: resfonts()
239: {
240: int i;
241: for (i = 0; i < 4; i++)
242: strcpy(fonts[i], ifonts[i]);
243: }
244: sendmail ()
245: {
246: static int p[2];
247: register i;
248: int stat;
249:
250: pipe (p);
251: if (fork ()==0)
252: {
253: alarm (0);
254: close (0);
255: dup (p[0]);
256: for (i=3; i<=15; i++)
257: close (i);
258: execl ("/bin/mail", "mail", &line[1], 0);
259: exit ();
260: }
261: close (1);
262: dup (p[1]);
263: printf ("Your versatec job is done\n");
264: close (1);
265: close (p[0]);
266: close (p[1]);
267: open ("/", 0);
268: wait (&stat);
269: }
270:
271: getline ()
272: {
273: register char *lp;
274: register int c;
275:
276: lp = line;
277: linel = 0;
278: while ((c = getc (dfb)) != '\n')
279: {
280: if (c<0)
281: return (0);
282: if (c=='\t')
283: {
284: do
285: {
286: *lp++ = ' ';
287: linel++;
288: } while ((linel & 07) != 0);
289: continue;
290: }
291: *lp++ = c;
292: linel++;
293: }
294: *lp++ = 0;
295: return (1);
296: }
297:
298: int pid;
299:
300: send (c)
301: char c;
302: {
303: int p;
304:
305: if (pid = fork ())
306: {
307: if (pid == -1)
308: return (1);
309: setexit ();
310: signal (SIGALRM, onalrm);
311: alarm (30);
312: wait (&p);
313: alarm (0);
314: return (p);
315: }
316: ioctl (3, SETSTATE, prtmode);
317: if (c == 'F')
318: {
319: if (banbuf[0])
320: {
321: execl ("/usr/lib/vpf", "vpf", "-b", banbuf, line+1, 0);
322: return (1);
323: }
324: execl ("/usr/lib/vpf", "vpf", line, 0);
325: }
326: else if (c == 'T')
327: {
328: int i;
329: int rm;
330: unlink (".railmag");
331: rm = creat (".railmag", 0666);
332: for (i = 0; i < 4; i++)
333: {
334: if (fonts[i][0] != '/')
335: write (rm, "/usr/lib/vfont/", strlen ("/usr/lib/vfont/"));
336: write (rm, fonts[i], strlen (fonts[i]));
337: write (rm, "\n", 1);
338: }
339: close (rm);
340: if (banbuf[0])
341: {
342: execl ("/usr/lib/vcat", "vcat", "-3", "-b", banbuf, line+1, 0);
343: return (1);
344: }
345: execl ("/usr/lib/vcat", "vcat", "-3", line+1, 0);
346: }
347: else if (c == 'P')
348: {
349: close (1);
350: dup (3);
351: if (banbuf[0])
352: {
353: execl (VRAST, "vrast", "-v", "-b", banbuf, line+1, linep, 0);
354: return (1);
355: }
356: execl (VRAST, "vrast", "-v", line+1, linep, 0);
357: }
358:
359: return (1);
360: }
361:
362: onalrm ()
363: {
364: struct stat stb;
365:
366: signal (SIGALRM, onalrm);
367: if (stat (dfname, &stb) < 0)
368: kill (pid, SIGEMT);
369: reset ();
370: }
371:
372: struct sgttyb ttyb =
373: {
374: B1200, B1200,
375: 0, 0,
376: XTABS|ANYP|NL2|CR2
377: };
378:
379: /*
380: * skip 16 inches
381: */
382: feedpage ()
383: {
384: char i;
385:
386: ioctl (3, SETSTATE, prtmode);
387: for (i = 0; i < 18; i++)
388: write (3, "\n\n\n\n\n\n\n\n", 8);
389: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.