|
|
1.1 root 1: /* D.L.Buck and Associates, Inc. - 8/27/84
2: *
3: * COPYRIGHT NOTICE:
4: * Copyright c 8/27/84 - An unpublished work by
5: * D.L.Buck and Associates, Inc.
6: *
7: * PROPRIETARY RIGHTS NOTICE:
8: * All rights reserved. This document and program contains
9: * proprietary information of D.L.Buck and Associates,Inc.
10: * of San Jose, California, U.S.A., embodying confidential
11: * information, ideas, and expressions, no part of which
12: * may be reproduced, or transmitted in any form or by any
13: * means, electronic, mechanical, or otherwise, without
14: * the written permission of D.L.Buck and Associates, Inc.
15: *
16: * NAME
17: * em_printers
18: *
19: * SYNOPSIS
20: * em_printers()
21: *
22: * DESCRIPTION
23: * em_printers emulates IBM 328x printers.
24: *
25: * ALGORITHM
26: * While there's something to read:
27: * I. Read from the comm device
28: * II. process the received print buffer
29: * A. Call emprbuf()
30: * III. print the processed buffer
31: * A. Call emprtr()
32: */
33: #include <signal.h>
34: #include "local.h"
35: #include <bsc/bscio.h>
36: #include <empr.h>
37:
38: #define ERROR -1
39:
40: #ifndef lint
41: static char sccsid[] = "@(#)emprinters.c 1.10 ";
42: #endif
43:
44: /* myscr[4096+5] makes sure there's room for characters leftover from the last
45: buffer processing (emprocbuf) at the beginning of this buffer. E.g.
46: an SBA came across in the last buffer and the 2-byte address supposed
47: to be attached to it didn't */
48: char myscr[4096+5];
49:
50: /* device busy status messages */
51: char adbsptpt[] = {'%','R',0x02,'H',' '}; /* ascii, point-to-point */
52: char edbsptpt[] = {0x6c,0xd9,0x02,0xc8,0x40}; /* ebcdic, point-to-point */
53: char adbsmpt[] = {'%','R',0x02,0,0,'H',' '}; /* ascii, multipoint */
54: char edbsmpt[] = {0x6c,0xd9,0x02,0,0,0xc8,0x40};/* ebcdic, multipoint */
55:
56: extern int devfd;
57: extern int errno;
58: extern int wflag;
59: extern char wcc;
60: extern char hostname[];
61: extern char devname[];
62: extern char audname[];
63: extern char new_audnm[];
64: extern char auditlock[];
65: extern char output[];
66: extern char outtype;
67: extern FILE *outfd;
68: extern FILE *aud;
69:
70: extern struct bscio p; /* bsc driver parameter structure */
71: extern int pt_to_pt;
72: extern int devfd;
73: extern int stationid;
74: extern int ascii;
75: extern char termid;
76: extern char note[];
77:
78: int sigint(); /* deal with signal interrupts */
79: void exit();
80: unsigned sleep();
81:
82: em_printers()
83: {
84: register int len; /* number of chars read in thru devfd */
85: register char *myptr;
86: register int mylen;
87: register unsigned mysize;
88: int i; /* convenient index */
89:
90: char tbuf[512]; /* temp buffer */
91: FILE *fopen();
92: FILE *popen();
93: #ifdef DEBUG
94: int f; /* debug file descriptor */
95: #endif
96:
97: /* set signals */
98: if (isatty(0)) {
99: signal(SIGINT,sigint);
100: signal(SIGHUP,sigint);
101: } else {
102: signal(SIGTERM,sigint);
103: signal(SIGINT,SIG_IGN);
104: signal(SIGQUIT,SIG_IGN);
105: signal(SIGHUP,SIG_IGN);
106: }
107:
108: fiximage(0);
109: #ifdef DEBUG
110: len = 0;
111: if (outtype == 'P') wflag = 0;
112: f = open("buffer",0);
113:
114: /* do proper open for type of output: device, pipe, or file */
115: if (outtype == 'F' || outtype == 'P')
116: if (outtype == 'F')
117: outfd = fopen(output, "a");
118: else
119: outfd = popen(output, "a");
120: else outfd = stdout;
121:
122: len=read(f,&myscr[5],sizeof myscr-5);
123:
124: emprbuf(&myscr[5],len); /* process received file */
125: emprtr(); /* print received file */
126: close(f); /* close received file */
127: if (outtype == 'F')
128: fclose(outfd);
129: else if (outtype == 'P' && wflag)
130: pclose(outfd);
131: cleanup();
132: exit(0);
133: #else
134: /* do proper open for type of output: device, pipe, or file */
135: if (outtype == 'F' || outtype == 'P')
136: if (outtype == 'F')
137: outfd = fopen(output, "a");
138: else
139: outfd = popen(output, "a");
140: else
141: outfd = stdout;
142:
143: while (1) {
144: myptr = &myscr[5];
145: mysize = sizeof myscr - 5;
146: mylen = 0;
147:
148: READ: /* read from the comm device */
149: while ((len = read(devfd,myptr,mysize)) > 0) {
150: myptr += len;
151: mysize -= len;
152: mylen += len;
153:
154: (void) sleep((unsigned)5);
155: read(devfd, tbuf, sizeof tbuf);
156: ioctl(devfd, BSCGET, &p);
157: break;
158: }
159:
160: if (len < 0 && errno == EINTR && mylen != 0)
161: goto READ;
162:
163: /* For EAGAIN, there is no data, so wait (long) while */
164: if (len < 0 && errno == EAGAIN) {
165: /***** sleep((unsigned)5); *****/
166: goto READ;
167: }
168:
169: if (len < 0 ) {
170: (void)get_errors();
171: if (p.b_flags == BSCNDSR ||
172: p.b_flags == BSCTXTO) {
173: /* update the audit file */
174: write_aud("D", note);
175: cleanup();
176: exit(1);
177: }
178:
179: if (p.b_flags == BSCRXTO) {
180: if (outtype == 'F' && outfd) {
181: fclose(outfd);
182: /* send printer status msg */
183: send_stat();
184: outfd = fopen(output,"a");
185: }
186: else if (outtype == 'P' && wflag) {
187: wflag =0;
188: pclose(outfd);
189: /* send printer status msg */
190: send_stat();
191: outfd = popen(output,"w");
192: }
193: continue;
194: }
195: p.b_flags = 0;
196: }
197:
198: if (mylen) {
199: /* send device busy status -- we're busy processing */
200: if (pt_to_pt == BSCMPT) {
201: ioctl (devfd, BSCID, &stationid);
202: ioctl(devfd,BSCSOH,0); /* set SOH mode & */
203: ioctl(devfd,BSCLAST,0); /* LAST message flag */
204: if (ascii) {
205: adbsmpt[3] = termid; /* poll addr */
206: adbsmpt[4]= stationid; /* subdev addr */
207: i=write(devfd, adbsmpt, sizeof adbsmpt);
208: } else {
209: edbsmpt[3] = termid; /* poll addr */
210: edbsmpt[4] =stationid; /* subdev addr */
211: i=write(devfd, edbsmpt, sizeof edbsmpt);
212: }
213: } else
214: /* Send status message for pt-pt */
215: i= write(devfd,ascii?adbsptpt:edbsptpt,
216: sizeof adbsptpt);
217:
218: ioctl(devfd,BSCNSOH,0); /* end SOH mode */
219: /* ignore any errors from the write */
220: if (i < 0) ioctl(devfd, BSCGET, &p);
221: emprbuf(&myscr[5],mylen); /* process buffer */
222: if (stprt(wcc)) /* if start print set in wcc, */
223: emprtr(); /* print buffer */
224: send_stat();
225: }
226: }
227: #endif
228: }
229:
230: /* sigint -- signal interrupt processing routine. This is the only way out of
231: em3280 */
232: sigint(signum)
233: {
234: char msg[50];
235: sprintf(msg,"Interrupt signal %d received",signum);
236: /* update the audit file */
237: write_aud("D",msg);
238: cleanup();
239: exit(2);
240: }
241:
242: /* send_stat() -- send printer status message */
243: char ascsptpt[] = {'%','R',0x02,0x42,0x20}; /* ascii, point-to-point */
244: char ebcsptpt[] = {0x6c,0xd9,0x02,0xc2,0x40}; /* ebcdic, point-to-point */
245: char ascsmpt[] = {'%','R',0x02,0,0,0x42,0x20}; /* ascii, multipoint */
246: char ebcsmpt[] = {0x6c,0xd9,0x02,0,0,0xc2,0x40}; /* ebcdic, multipoint */
247:
248: send_stat()
249: {
250: int i = 0; /* catch write errors here */
251: #ifndef DEBUG
252: /* Send status message: SOH % R STX ..... ETX */
253: if (pt_to_pt == BSCMPT) {
254: ioctl (devfd, BSCID, &stationid);
255: ioctl(devfd,BSCSOH,0); /* set SOH mode */
256: ioctl(devfd,BSCLAST,0); /* set LAST message flag */
257: if (ascii) {
258: ascsmpt[3] = termid; /* poll addr */
259: ascsmpt[4] = stationid; /* subdev addr */
260: i = write(devfd, ascsmpt, sizeof ascsmpt);
261: } else {
262: ebcsmpt[3] = termid; /* poll addr */
263: ebcsmpt[4] = stationid; /* subdev addr */
264: i = write(devfd, ebcsmpt, sizeof ebcsmpt);
265: }
266: } else
267: /* Send status message for pt-pt */
268: i= write(devfd,ascii?ascsptpt:ebcsptpt,sizeof ascsptpt);
269:
270: ioctl(devfd,BSCNSOH,0); /* end SOH mode */
271: /* ignore any errors from the write */
272: if (i < 0) ioctl(devfd, BSCGET, &p);
273: #endif
274: }
275:
276: /* cleanup -- do end processing */
277: cleanup()
278: {
279: /* close output */
280: if (outfd) {
281: if (outtype == 'F')
282: fclose(outfd);
283: else if (outtype == 'P' && wflag)
284: pclose(outfd);
285: outfd = (FILE *)0;
286: wflag = 0;
287: }
288: if (devfd > 0) {
289: close (devfd);
290: devfd = -1;
291: disconnect(hostname,devname);
292: }
293:
294: if (aud) {
295: fclose(aud);
296: if (link(audname, new_audnm) >= 0)
297: unlink(audname);
298: unlink(auditlock);
299: }
300: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.