xref: /csrg-svn/usr.bin/telnet/tn3270.c (revision 32185)
1*32185Sminshall void
2*32185Sminshall tn3270_init()
3*32185Sminshall {
4*32185Sminshall #if	defined(TN3270)
5*32185Sminshall     Sent3270TerminalType = 0;
6*32185Sminshall     Ifrontp = Ibackp = Ibuf;
7*32185Sminshall     init_ctlr();		/* Initialize some things */
8*32185Sminshall     init_keyboard();
9*32185Sminshall     init_screen();
10*32185Sminshall     init_system();
11*32185Sminshall #endif	/* defined(TN3270) */
12*32185Sminshall }
13*32185Sminshall 
14*32185Sminshall #if	defined(TN3270)
15*32185Sminshall 
16*32185Sminshall /*
17*32185Sminshall  * DataToNetwork - queue up some data to go to network.  If "done" is set,
18*32185Sminshall  * then when last byte is queued, we add on an IAC EOR sequence (so,
19*32185Sminshall  * don't call us with "done" until you want that done...)
20*32185Sminshall  *
21*32185Sminshall  * We actually do send all the data to the network buffer, since our
22*32185Sminshall  * only client needs for us to do that.
23*32185Sminshall  */
24*32185Sminshall 
25*32185Sminshall int
26*32185Sminshall DataToNetwork(buffer, count, done)
27*32185Sminshall register char	*buffer;	/* where the data is */
28*32185Sminshall register int	count;		/* how much to send */
29*32185Sminshall int		done;		/* is this the last of a logical block */
30*32185Sminshall {
31*32185Sminshall     register int c;
32*32185Sminshall     int origCount;
33*32185Sminshall     fd_set o;
34*32185Sminshall 
35*32185Sminshall     origCount = count;
36*32185Sminshall     FD_ZERO(&o);
37*32185Sminshall 
38*32185Sminshall     while (count) {
39*32185Sminshall 	if ((netobuf+sizeof netobuf - nfrontp) < 6) {
40*32185Sminshall 	    netflush();
41*32185Sminshall 	    while ((netobuf+sizeof netobuf - nfrontp) < 6) {
42*32185Sminshall 		FD_SET(net, &o);
43*32185Sminshall 		(void) select(net+1, (fd_set *) 0, &o, (fd_set *) 0,
44*32185Sminshall 						(struct timeval *) 0);
45*32185Sminshall 		netflush();
46*32185Sminshall 	    }
47*32185Sminshall 	}
48*32185Sminshall 	c = *buffer++;
49*32185Sminshall 	count--;
50*32185Sminshall 	if (c == IAC) {
51*32185Sminshall 	    *nfrontp++ = IAC;
52*32185Sminshall 	    *nfrontp++ = IAC;
53*32185Sminshall 	} else {
54*32185Sminshall 	    *nfrontp++ = c;
55*32185Sminshall 	}
56*32185Sminshall     }
57*32185Sminshall 
58*32185Sminshall     if (done && !count) {
59*32185Sminshall 	*nfrontp++ = IAC;
60*32185Sminshall 	*nfrontp++ = EOR;
61*32185Sminshall 	netflush();		/* try to move along as quickly as ... */
62*32185Sminshall     }
63*32185Sminshall     return(origCount - count);
64*32185Sminshall }
65*32185Sminshall 
66*32185Sminshall 
67*32185Sminshall #if	defined(unix)
68*32185Sminshall static void
69*32185Sminshall inputAvailable()
70*32185Sminshall {
71*32185Sminshall     HaveInput = 1;
72*32185Sminshall }
73*32185Sminshall #endif	/* defined(unix) */
74*32185Sminshall 
75*32185Sminshall void
76*32185Sminshall outputPurge()
77*32185Sminshall {
78*32185Sminshall     int tmp = flushout;
79*32185Sminshall 
80*32185Sminshall     flushout = 1;
81*32185Sminshall 
82*32185Sminshall     ttyflush();
83*32185Sminshall 
84*32185Sminshall     flushout = tmp;
85*32185Sminshall }
86*32185Sminshall 
87*32185Sminshall 
88*32185Sminshall /*
89*32185Sminshall  * The following routines are places where the various tn3270
90*32185Sminshall  * routines make calls into telnet.c.
91*32185Sminshall  */
92*32185Sminshall 
93*32185Sminshall /* TtyChars() - returns the number of characters in the TTY buffer */
94*32185Sminshall TtyChars()
95*32185Sminshall {
96*32185Sminshall     return(tfrontp-tbackp);
97*32185Sminshall }
98*32185Sminshall 
99*32185Sminshall /* DataToTerminal - queue up some data to go to terminal. */
100*32185Sminshall 
101*32185Sminshall int
102*32185Sminshall DataToTerminal(buffer, count)
103*32185Sminshall register char	*buffer;		/* where the data is */
104*32185Sminshall register int	count;			/* how much to send */
105*32185Sminshall {
106*32185Sminshall     int origCount;
107*32185Sminshall #if	defined(unix)
108*32185Sminshall     fd_set	o;
109*32185Sminshall 
110*32185Sminshall     FD_ZERO(&o);
111*32185Sminshall #endif	/* defined(unix) */
112*32185Sminshall     origCount = count;
113*32185Sminshall 
114*32185Sminshall     while (count) {
115*32185Sminshall 	if (tfrontp >= ttyobuf+sizeof ttyobuf) {
116*32185Sminshall 	    ttyflush();
117*32185Sminshall 	    while (tfrontp >= ttyobuf+sizeof ttyobuf) {
118*32185Sminshall #if	defined(unix)
119*32185Sminshall 		FD_SET(tout, &o);
120*32185Sminshall 		(void) select(tout+1, (fd_set *) 0, &o, (fd_set *) 0,
121*32185Sminshall 						(struct timeval *) 0);
122*32185Sminshall #endif	/* defined(unix) */
123*32185Sminshall 		ttyflush();
124*32185Sminshall 	    }
125*32185Sminshall 	}
126*32185Sminshall 	*tfrontp++ = *buffer++;
127*32185Sminshall 	count--;
128*32185Sminshall     }
129*32185Sminshall     return(origCount - count);
130*32185Sminshall }
131*32185Sminshall 
132*32185Sminshall /* EmptyTerminal - called to make sure that the terminal buffer is empty.
133*32185Sminshall  *			Note that we consider the buffer to run all the
134*32185Sminshall  *			way to the kernel (thus the select).
135*32185Sminshall  */
136*32185Sminshall 
137*32185Sminshall void
138*32185Sminshall EmptyTerminal()
139*32185Sminshall {
140*32185Sminshall #if	defined(unix)
141*32185Sminshall     fd_set	o;
142*32185Sminshall 
143*32185Sminshall     FD_ZERO(&o);
144*32185Sminshall #endif	/* defined(unix) */
145*32185Sminshall 
146*32185Sminshall     if (tfrontp == tbackp) {
147*32185Sminshall #if	defined(unix)
148*32185Sminshall 	FD_SET(tout, &o);
149*32185Sminshall 	(void) select(tout+1, (int *) 0, &o, (int *) 0,
150*32185Sminshall 			(struct timeval *) 0);	/* wait for TTLOWAT */
151*32185Sminshall #endif	/* defined(unix) */
152*32185Sminshall     } else {
153*32185Sminshall 	while (tfrontp != tbackp) {
154*32185Sminshall 	    ttyflush();
155*32185Sminshall #if	defined(unix)
156*32185Sminshall 	    FD_SET(tout, &o);
157*32185Sminshall 	    (void) select(tout+1, (int *) 0, &o, (int *) 0,
158*32185Sminshall 				(struct timeval *) 0);	/* wait for TTLOWAT */
159*32185Sminshall #endif	/* defined(unix) */
160*32185Sminshall 	}
161*32185Sminshall     }
162*32185Sminshall }
163*32185Sminshall 
164*32185Sminshall 
165*32185Sminshall /*
166*32185Sminshall  * Push3270 - Try to send data along the 3270 output (to screen) direction.
167*32185Sminshall  */
168*32185Sminshall 
169*32185Sminshall static int
170*32185Sminshall Push3270()
171*32185Sminshall {
172*32185Sminshall     int save = scc;
173*32185Sminshall 
174*32185Sminshall     if (scc) {
175*32185Sminshall 	if (Ifrontp+scc > Ibuf+sizeof Ibuf) {
176*32185Sminshall 	    if (Ibackp != Ibuf) {
177*32185Sminshall 		memcpy(Ibuf, Ibackp, Ifrontp-Ibackp);
178*32185Sminshall 		Ifrontp -= (Ibackp-Ibuf);
179*32185Sminshall 		Ibackp = Ibuf;
180*32185Sminshall 	    }
181*32185Sminshall 	}
182*32185Sminshall 	if (Ifrontp+scc < Ibuf+sizeof Ibuf) {
183*32185Sminshall 	    telrcv();
184*32185Sminshall 	}
185*32185Sminshall     }
186*32185Sminshall     return save != scc;
187*32185Sminshall }
188*32185Sminshall 
189*32185Sminshall 
190*32185Sminshall /*
191*32185Sminshall  * Finish3270 - get the last dregs of 3270 data out to the terminal
192*32185Sminshall  *		before quitting.
193*32185Sminshall  */
194*32185Sminshall 
195*32185Sminshall static void
196*32185Sminshall Finish3270()
197*32185Sminshall {
198*32185Sminshall     while (Push3270() || !DoTerminalOutput()) {
199*32185Sminshall #if	defined(unix)
200*32185Sminshall 	HaveInput = 0;
201*32185Sminshall #endif	/* defined(unix) */
202*32185Sminshall 	;
203*32185Sminshall     }
204*32185Sminshall }
205*32185Sminshall 
206*32185Sminshall 
207*32185Sminshall /* StringToTerminal - output a null terminated string to the terminal */
208*32185Sminshall 
209*32185Sminshall void
210*32185Sminshall StringToTerminal(s)
211*32185Sminshall char *s;
212*32185Sminshall {
213*32185Sminshall     int count;
214*32185Sminshall 
215*32185Sminshall     count = strlen(s);
216*32185Sminshall     if (count) {
217*32185Sminshall 	(void) DataToTerminal(s, count);	/* we know it always goes... */
218*32185Sminshall     }
219*32185Sminshall }
220*32185Sminshall 
221*32185Sminshall 
222*32185Sminshall #if	((!defined(NOT43)) || defined(PUTCHAR))
223*32185Sminshall /* _putchar - output a single character to the terminal.  This name is so that
224*32185Sminshall  *	curses(3x) can call us to send out data.
225*32185Sminshall  */
226*32185Sminshall 
227*32185Sminshall void
228*32185Sminshall _putchar(c)
229*32185Sminshall char c;
230*32185Sminshall {
231*32185Sminshall     if (tfrontp >= ttyobuf+sizeof ttyobuf) {
232*32185Sminshall 	(void) DataToTerminal(&c, 1);
233*32185Sminshall     } else {
234*32185Sminshall 	*tfrontp++ = c;		/* optimize if possible. */
235*32185Sminshall     }
236*32185Sminshall }
237*32185Sminshall #endif	/* ((!defined(NOT43)) || defined(PUTCHAR)) */
238*32185Sminshall 
239*32185Sminshall #endif	/* defined(TN3270) */
240