xref: /minix3/usr.bin/telnet/tn3270.c (revision 7348b5c52b47a1c199a1754a40bbfa360b536de2)
1*7348b5c5SDavid van Moolenbroek /*	$NetBSD: tn3270.c,v 1.22 2006/10/07 17:27:57 elad Exp $	*/
2*7348b5c5SDavid van Moolenbroek 
3*7348b5c5SDavid van Moolenbroek /*
4*7348b5c5SDavid van Moolenbroek  * Copyright (c) 1988, 1993
5*7348b5c5SDavid van Moolenbroek  *	The Regents of the University of California.  All rights reserved.
6*7348b5c5SDavid van Moolenbroek  *
7*7348b5c5SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
8*7348b5c5SDavid van Moolenbroek  * modification, are permitted provided that the following conditions
9*7348b5c5SDavid van Moolenbroek  * are met:
10*7348b5c5SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
11*7348b5c5SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
12*7348b5c5SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
13*7348b5c5SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in the
14*7348b5c5SDavid van Moolenbroek  *    documentation and/or other materials provided with the distribution.
15*7348b5c5SDavid van Moolenbroek  * 3. Neither the name of the University nor the names of its contributors
16*7348b5c5SDavid van Moolenbroek  *    may be used to endorse or promote products derived from this software
17*7348b5c5SDavid van Moolenbroek  *    without specific prior written permission.
18*7348b5c5SDavid van Moolenbroek  *
19*7348b5c5SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20*7348b5c5SDavid van Moolenbroek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*7348b5c5SDavid van Moolenbroek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*7348b5c5SDavid van Moolenbroek  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23*7348b5c5SDavid van Moolenbroek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24*7348b5c5SDavid van Moolenbroek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25*7348b5c5SDavid van Moolenbroek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26*7348b5c5SDavid van Moolenbroek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27*7348b5c5SDavid van Moolenbroek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28*7348b5c5SDavid van Moolenbroek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29*7348b5c5SDavid van Moolenbroek  * SUCH DAMAGE.
30*7348b5c5SDavid van Moolenbroek  */
31*7348b5c5SDavid van Moolenbroek 
32*7348b5c5SDavid van Moolenbroek #include <sys/cdefs.h>
33*7348b5c5SDavid van Moolenbroek #ifndef lint
34*7348b5c5SDavid van Moolenbroek #if 0
35*7348b5c5SDavid van Moolenbroek static char sccsid[] = "@(#)tn3270.c	8.2 (Berkeley) 5/30/95";
36*7348b5c5SDavid van Moolenbroek #else
37*7348b5c5SDavid van Moolenbroek __RCSID("$NetBSD: tn3270.c,v 1.22 2006/10/07 17:27:57 elad Exp $");
38*7348b5c5SDavid van Moolenbroek #endif
39*7348b5c5SDavid van Moolenbroek #endif /* not lint */
40*7348b5c5SDavid van Moolenbroek 
41*7348b5c5SDavid van Moolenbroek #include <sys/types.h>
42*7348b5c5SDavid van Moolenbroek #include <sys/time.h>
43*7348b5c5SDavid van Moolenbroek #include <arpa/telnet.h>
44*7348b5c5SDavid van Moolenbroek #include <unistd.h>
45*7348b5c5SDavid van Moolenbroek #include <poll.h>
46*7348b5c5SDavid van Moolenbroek 
47*7348b5c5SDavid van Moolenbroek #include "general.h"
48*7348b5c5SDavid van Moolenbroek #include "defines.h"
49*7348b5c5SDavid van Moolenbroek #include "ring.h"
50*7348b5c5SDavid van Moolenbroek #include "externs.h"
51*7348b5c5SDavid van Moolenbroek 
52*7348b5c5SDavid van Moolenbroek #ifdef TN3270
53*7348b5c5SDavid van Moolenbroek 
54*7348b5c5SDavid van Moolenbroek #include "../ctlr/screen.h"
55*7348b5c5SDavid van Moolenbroek #include "../ctlr/declare.h"
56*7348b5c5SDavid van Moolenbroek 
57*7348b5c5SDavid van Moolenbroek #include "../ascii/state.h"
58*7348b5c5SDavid van Moolenbroek 
59*7348b5c5SDavid van Moolenbroek #include "../general/globals.h"
60*7348b5c5SDavid van Moolenbroek 
61*7348b5c5SDavid van Moolenbroek #include "../sys_curses/telextrn.h"
62*7348b5c5SDavid van Moolenbroek 
63*7348b5c5SDavid van Moolenbroek int
64*7348b5c5SDavid van Moolenbroek 	HaveInput,		/* There is input available to scan */
65*7348b5c5SDavid van Moolenbroek 	cursesdata,		/* Do we dump curses data? */
66*7348b5c5SDavid van Moolenbroek 	sigiocount;		/* Number of times we got a SIGIO */
67*7348b5c5SDavid van Moolenbroek 
68*7348b5c5SDavid van Moolenbroek char	tline[200];
69*7348b5c5SDavid van Moolenbroek char	*transcom = 0;	/* transparent mode command (default: none) */
70*7348b5c5SDavid van Moolenbroek 
71*7348b5c5SDavid van Moolenbroek char	Ibuf[8*BUFSIZ], *Ifrontp, *Ibackp;
72*7348b5c5SDavid van Moolenbroek 
73*7348b5c5SDavid van Moolenbroek static char	sb_terminal[] = { IAC, SB,
74*7348b5c5SDavid van Moolenbroek 			TELOPT_TTYPE, TELQUAL_IS,
75*7348b5c5SDavid van Moolenbroek 			'I', 'B', 'M', '-', '3', '2', '7', '8', '-', '2',
76*7348b5c5SDavid van Moolenbroek 			IAC, SE };
77*7348b5c5SDavid van Moolenbroek #define	SBTERMMODEL	13
78*7348b5c5SDavid van Moolenbroek 
79*7348b5c5SDavid van Moolenbroek static int
80*7348b5c5SDavid van Moolenbroek 	Sent3270TerminalType;	/* Have we said we are a 3270? */
81*7348b5c5SDavid van Moolenbroek 
82*7348b5c5SDavid van Moolenbroek #endif	/* defined(TN3270) */
83*7348b5c5SDavid van Moolenbroek 
84*7348b5c5SDavid van Moolenbroek 
85*7348b5c5SDavid van Moolenbroek #ifdef TN3270
86*7348b5c5SDavid van Moolenbroek void
init_3270(void)87*7348b5c5SDavid van Moolenbroek init_3270(void)
88*7348b5c5SDavid van Moolenbroek {
89*7348b5c5SDavid van Moolenbroek     HaveInput = 0;
90*7348b5c5SDavid van Moolenbroek     sigiocount = 0;
91*7348b5c5SDavid van Moolenbroek     Sent3270TerminalType = 0;
92*7348b5c5SDavid van Moolenbroek     Ifrontp = Ibackp = Ibuf;
93*7348b5c5SDavid van Moolenbroek     init_ctlr();		/* Initialize some things */
94*7348b5c5SDavid van Moolenbroek     init_keyboard();
95*7348b5c5SDavid van Moolenbroek     init_screen();
96*7348b5c5SDavid van Moolenbroek     init_system();
97*7348b5c5SDavid van Moolenbroek }
98*7348b5c5SDavid van Moolenbroek #endif	/* defined(TN3270) */
99*7348b5c5SDavid van Moolenbroek 
100*7348b5c5SDavid van Moolenbroek 
101*7348b5c5SDavid van Moolenbroek #ifdef TN3270
102*7348b5c5SDavid van Moolenbroek 
103*7348b5c5SDavid van Moolenbroek /*
104*7348b5c5SDavid van Moolenbroek  * DataToNetwork - queue up some data to go to network.  If "done" is set,
105*7348b5c5SDavid van Moolenbroek  * then when last byte is queued, we add on an IAC EOR sequence (so,
106*7348b5c5SDavid van Moolenbroek  * don't call us with "done" until you want that done...)
107*7348b5c5SDavid van Moolenbroek  *
108*7348b5c5SDavid van Moolenbroek  * We actually do send all the data to the network buffer, since our
109*7348b5c5SDavid van Moolenbroek  * only client needs for us to do that.
110*7348b5c5SDavid van Moolenbroek  */
111*7348b5c5SDavid van Moolenbroek 
112*7348b5c5SDavid van Moolenbroek int
DataToNetwork(char * buffer,int count,int done)113*7348b5c5SDavid van Moolenbroek DataToNetwork(char *buffer,	/* where the data is */
114*7348b5c5SDavid van Moolenbroek     int  count,	/* how much to send */
115*7348b5c5SDavid van Moolenbroek     int		  done)		/* is this the last of a logical block */
116*7348b5c5SDavid van Moolenbroek {
117*7348b5c5SDavid van Moolenbroek     int loop, c;
118*7348b5c5SDavid van Moolenbroek     int origCount;
119*7348b5c5SDavid van Moolenbroek 
120*7348b5c5SDavid van Moolenbroek     origCount = count;
121*7348b5c5SDavid van Moolenbroek 
122*7348b5c5SDavid van Moolenbroek     while (count) {
123*7348b5c5SDavid van Moolenbroek 	/* If not enough room for EORs, IACs, etc., wait */
124*7348b5c5SDavid van Moolenbroek 	if (NETROOM() < 6) {
125*7348b5c5SDavid van Moolenbroek 	    struct pollfd set[1];
126*7348b5c5SDavid van Moolenbroek 
127*7348b5c5SDavid van Moolenbroek 	    set[0].fd = net;
128*7348b5c5SDavid van Moolenbroek 	    set[0].events = POLLOUT;
129*7348b5c5SDavid van Moolenbroek 	    netflush();
130*7348b5c5SDavid van Moolenbroek 	    while (NETROOM() < 6) {
131*7348b5c5SDavid van Moolenbroek 		(void) poll(set, 1, INFTIM);
132*7348b5c5SDavid van Moolenbroek 		netflush();
133*7348b5c5SDavid van Moolenbroek 	    }
134*7348b5c5SDavid van Moolenbroek 	}
135*7348b5c5SDavid van Moolenbroek 	c = ring_empty_count(&netoring);
136*7348b5c5SDavid van Moolenbroek 	if (c > count) {
137*7348b5c5SDavid van Moolenbroek 	    c = count;
138*7348b5c5SDavid van Moolenbroek 	}
139*7348b5c5SDavid van Moolenbroek 	loop = c;
140*7348b5c5SDavid van Moolenbroek 	while (loop) {
141*7348b5c5SDavid van Moolenbroek 	    if (((unsigned char)*buffer) == IAC) {
142*7348b5c5SDavid van Moolenbroek 		break;
143*7348b5c5SDavid van Moolenbroek 	    }
144*7348b5c5SDavid van Moolenbroek 	    buffer++;
145*7348b5c5SDavid van Moolenbroek 	    loop--;
146*7348b5c5SDavid van Moolenbroek 	}
147*7348b5c5SDavid van Moolenbroek 	if ((c = c-loop)) {
148*7348b5c5SDavid van Moolenbroek 	    ring_supply_data(&netoring, buffer-c, c);
149*7348b5c5SDavid van Moolenbroek 	    count -= c;
150*7348b5c5SDavid van Moolenbroek 	}
151*7348b5c5SDavid van Moolenbroek 	if (loop) {
152*7348b5c5SDavid van Moolenbroek 	    NET2ADD(IAC, IAC);
153*7348b5c5SDavid van Moolenbroek 	    count--;
154*7348b5c5SDavid van Moolenbroek 	    buffer++;
155*7348b5c5SDavid van Moolenbroek 	}
156*7348b5c5SDavid van Moolenbroek     }
157*7348b5c5SDavid van Moolenbroek 
158*7348b5c5SDavid van Moolenbroek     if (done) {
159*7348b5c5SDavid van Moolenbroek 	NET2ADD(IAC, EOR);
160*7348b5c5SDavid van Moolenbroek 	netflush();		/* try to move along as quickly as ... */
161*7348b5c5SDavid van Moolenbroek     }
162*7348b5c5SDavid van Moolenbroek     return(origCount - count);
163*7348b5c5SDavid van Moolenbroek }
164*7348b5c5SDavid van Moolenbroek 
165*7348b5c5SDavid van Moolenbroek 
166*7348b5c5SDavid van Moolenbroek void
inputAvailable(int signo)167*7348b5c5SDavid van Moolenbroek inputAvailable(int signo)
168*7348b5c5SDavid van Moolenbroek {
169*7348b5c5SDavid van Moolenbroek     HaveInput = 1;
170*7348b5c5SDavid van Moolenbroek     sigiocount++;
171*7348b5c5SDavid van Moolenbroek }
172*7348b5c5SDavid van Moolenbroek 
173*7348b5c5SDavid van Moolenbroek void
outputPurge(void)174*7348b5c5SDavid van Moolenbroek outputPurge(void)
175*7348b5c5SDavid van Moolenbroek {
176*7348b5c5SDavid van Moolenbroek     (void) ttyflush(1);
177*7348b5c5SDavid van Moolenbroek }
178*7348b5c5SDavid van Moolenbroek 
179*7348b5c5SDavid van Moolenbroek 
180*7348b5c5SDavid van Moolenbroek /*
181*7348b5c5SDavid van Moolenbroek  * The following routines are places where the various tn3270
182*7348b5c5SDavid van Moolenbroek  * routines make calls into telnet.c.
183*7348b5c5SDavid van Moolenbroek  */
184*7348b5c5SDavid van Moolenbroek 
185*7348b5c5SDavid van Moolenbroek /*
186*7348b5c5SDavid van Moolenbroek  * DataToTerminal - queue up some data to go to terminal.
187*7348b5c5SDavid van Moolenbroek  *
188*7348b5c5SDavid van Moolenbroek  * Note: there are people who call us and depend on our processing
189*7348b5c5SDavid van Moolenbroek  * *all* the data at one time (thus the poll).
190*7348b5c5SDavid van Moolenbroek  */
191*7348b5c5SDavid van Moolenbroek 
192*7348b5c5SDavid van Moolenbroek int
DataToTerminal(char * buffer,int count)193*7348b5c5SDavid van Moolenbroek DataToTerminal(
194*7348b5c5SDavid van Moolenbroek     char	*buffer,		/* where the data is */
195*7348b5c5SDavid van Moolenbroek     int	count)			/* how much to send */
196*7348b5c5SDavid van Moolenbroek {
197*7348b5c5SDavid van Moolenbroek     int c;
198*7348b5c5SDavid van Moolenbroek     int origCount;
199*7348b5c5SDavid van Moolenbroek 
200*7348b5c5SDavid van Moolenbroek     origCount = count;
201*7348b5c5SDavid van Moolenbroek 
202*7348b5c5SDavid van Moolenbroek     while (count) {
203*7348b5c5SDavid van Moolenbroek 	if (TTYROOM() == 0) {
204*7348b5c5SDavid van Moolenbroek 	    struct pollfd set[1];
205*7348b5c5SDavid van Moolenbroek 
206*7348b5c5SDavid van Moolenbroek 	    set[0].fd = tout;
207*7348b5c5SDavid van Moolenbroek 	    set[0].events = POLLOUT;
208*7348b5c5SDavid van Moolenbroek 	    (void) ttyflush(0);
209*7348b5c5SDavid van Moolenbroek 	    while (TTYROOM() == 0) {
210*7348b5c5SDavid van Moolenbroek 		(void) poll(set, 1, INFTIM);
211*7348b5c5SDavid van Moolenbroek 		(void) ttyflush(0);
212*7348b5c5SDavid van Moolenbroek 	    }
213*7348b5c5SDavid van Moolenbroek 	}
214*7348b5c5SDavid van Moolenbroek 	c = TTYROOM();
215*7348b5c5SDavid van Moolenbroek 	if (c > count) {
216*7348b5c5SDavid van Moolenbroek 	    c = count;
217*7348b5c5SDavid van Moolenbroek 	}
218*7348b5c5SDavid van Moolenbroek 	ring_supply_data(&ttyoring, buffer, c);
219*7348b5c5SDavid van Moolenbroek 	count -= c;
220*7348b5c5SDavid van Moolenbroek 	buffer += c;
221*7348b5c5SDavid van Moolenbroek     }
222*7348b5c5SDavid van Moolenbroek     return(origCount);
223*7348b5c5SDavid van Moolenbroek }
224*7348b5c5SDavid van Moolenbroek 
225*7348b5c5SDavid van Moolenbroek 
226*7348b5c5SDavid van Moolenbroek /*
227*7348b5c5SDavid van Moolenbroek  * Push3270 - Try to send data along the 3270 output (to screen) direction.
228*7348b5c5SDavid van Moolenbroek  */
229*7348b5c5SDavid van Moolenbroek 
230*7348b5c5SDavid van Moolenbroek int
Push3270(void)231*7348b5c5SDavid van Moolenbroek Push3270(void)
232*7348b5c5SDavid van Moolenbroek {
233*7348b5c5SDavid van Moolenbroek     int save = ring_full_count(&netiring);
234*7348b5c5SDavid van Moolenbroek 
235*7348b5c5SDavid van Moolenbroek     if (save) {
236*7348b5c5SDavid van Moolenbroek 	if (Ifrontp+save > Ibuf+sizeof Ibuf) {
237*7348b5c5SDavid van Moolenbroek 	    if (Ibackp != Ibuf) {
238*7348b5c5SDavid van Moolenbroek 		memmove(Ibuf, Ibackp, Ifrontp-Ibackp);
239*7348b5c5SDavid van Moolenbroek 		Ifrontp -= (Ibackp-Ibuf);
240*7348b5c5SDavid van Moolenbroek 		Ibackp = Ibuf;
241*7348b5c5SDavid van Moolenbroek 	    }
242*7348b5c5SDavid van Moolenbroek 	}
243*7348b5c5SDavid van Moolenbroek 	if (Ifrontp+save < Ibuf+sizeof Ibuf) {
244*7348b5c5SDavid van Moolenbroek 	    (void)telrcv();
245*7348b5c5SDavid van Moolenbroek 	}
246*7348b5c5SDavid van Moolenbroek     }
247*7348b5c5SDavid van Moolenbroek     return save != ring_full_count(&netiring);
248*7348b5c5SDavid van Moolenbroek }
249*7348b5c5SDavid van Moolenbroek 
250*7348b5c5SDavid van Moolenbroek 
251*7348b5c5SDavid van Moolenbroek /*
252*7348b5c5SDavid van Moolenbroek  * Finish3270 - get the last dregs of 3270 data out to the terminal
253*7348b5c5SDavid van Moolenbroek  *		before quitting.
254*7348b5c5SDavid van Moolenbroek  */
255*7348b5c5SDavid van Moolenbroek 
256*7348b5c5SDavid van Moolenbroek void
Finish3270(void)257*7348b5c5SDavid van Moolenbroek Finish3270(void)
258*7348b5c5SDavid van Moolenbroek {
259*7348b5c5SDavid van Moolenbroek     while (Push3270() || !DoTerminalOutput()) {
260*7348b5c5SDavid van Moolenbroek 	HaveInput = 0;
261*7348b5c5SDavid van Moolenbroek 	;
262*7348b5c5SDavid van Moolenbroek     }
263*7348b5c5SDavid van Moolenbroek }
264*7348b5c5SDavid van Moolenbroek 
265*7348b5c5SDavid van Moolenbroek 
266*7348b5c5SDavid van Moolenbroek /* StringToTerminal - output a null terminated string to the terminal */
267*7348b5c5SDavid van Moolenbroek 
268*7348b5c5SDavid van Moolenbroek void
StringToTerminal(char * s)269*7348b5c5SDavid van Moolenbroek StringToTerminal(char *s)
270*7348b5c5SDavid van Moolenbroek {
271*7348b5c5SDavid van Moolenbroek     int count;
272*7348b5c5SDavid van Moolenbroek 
273*7348b5c5SDavid van Moolenbroek     count = strlen(s);
274*7348b5c5SDavid van Moolenbroek     if (count) {
275*7348b5c5SDavid van Moolenbroek 	(void) DataToTerminal(s, count);	/* we know it always goes... */
276*7348b5c5SDavid van Moolenbroek     }
277*7348b5c5SDavid van Moolenbroek }
278*7348b5c5SDavid van Moolenbroek 
279*7348b5c5SDavid van Moolenbroek 
280*7348b5c5SDavid van Moolenbroek /* _putchar - output a single character to the terminal.  This name is so that
281*7348b5c5SDavid van Moolenbroek  *	curses(3x) can call us to send out data.
282*7348b5c5SDavid van Moolenbroek  */
283*7348b5c5SDavid van Moolenbroek 
284*7348b5c5SDavid van Moolenbroek int
_putchar(int cc)285*7348b5c5SDavid van Moolenbroek _putchar(int cc)
286*7348b5c5SDavid van Moolenbroek {
287*7348b5c5SDavid van Moolenbroek     char c = (char)cc;
288*7348b5c5SDavid van Moolenbroek     if (cursesdata) {
289*7348b5c5SDavid van Moolenbroek 	Dump('>', &c, 1);
290*7348b5c5SDavid van Moolenbroek     }
291*7348b5c5SDavid van Moolenbroek     if (!TTYROOM()) {
292*7348b5c5SDavid van Moolenbroek 	(void) DataToTerminal(&c, 1);
293*7348b5c5SDavid van Moolenbroek     } else {
294*7348b5c5SDavid van Moolenbroek 	TTYADD(c);
295*7348b5c5SDavid van Moolenbroek     }
296*7348b5c5SDavid van Moolenbroek 
297*7348b5c5SDavid van Moolenbroek     return (0);
298*7348b5c5SDavid van Moolenbroek }
299*7348b5c5SDavid van Moolenbroek 
300*7348b5c5SDavid van Moolenbroek void
SetIn3270(void)301*7348b5c5SDavid van Moolenbroek SetIn3270(void)
302*7348b5c5SDavid van Moolenbroek {
303*7348b5c5SDavid van Moolenbroek     if (Sent3270TerminalType && my_want_state_is_will(TELOPT_BINARY)
304*7348b5c5SDavid van Moolenbroek 		&& my_want_state_is_do(TELOPT_BINARY) && !donebinarytoggle) {
305*7348b5c5SDavid van Moolenbroek 	if (!In3270) {
306*7348b5c5SDavid van Moolenbroek 	    In3270 = 1;
307*7348b5c5SDavid van Moolenbroek 	    Init3270();		/* Initialize 3270 functions */
308*7348b5c5SDavid van Moolenbroek 	    /* initialize terminal key mapping */
309*7348b5c5SDavid van Moolenbroek 	    InitTerminal();	/* Start terminal going */
310*7348b5c5SDavid van Moolenbroek 	    setconnmode(0);
311*7348b5c5SDavid van Moolenbroek 	}
312*7348b5c5SDavid van Moolenbroek     } else {
313*7348b5c5SDavid van Moolenbroek 	if (In3270) {
314*7348b5c5SDavid van Moolenbroek 	    StopScreen(1);
315*7348b5c5SDavid van Moolenbroek 	    In3270 = 0;
316*7348b5c5SDavid van Moolenbroek 	    Stop3270();		/* Tell 3270 we aren't here anymore */
317*7348b5c5SDavid van Moolenbroek 	    setconnmode(0);
318*7348b5c5SDavid van Moolenbroek 	}
319*7348b5c5SDavid van Moolenbroek     }
320*7348b5c5SDavid van Moolenbroek }
321*7348b5c5SDavid van Moolenbroek 
322*7348b5c5SDavid van Moolenbroek /*
323*7348b5c5SDavid van Moolenbroek  * tn3270_ttype()
324*7348b5c5SDavid van Moolenbroek  *
325*7348b5c5SDavid van Moolenbroek  *	Send a response to a terminal type negotiation.
326*7348b5c5SDavid van Moolenbroek  *
327*7348b5c5SDavid van Moolenbroek  *	Return '0' if no more responses to send; '1' if a response sent.
328*7348b5c5SDavid van Moolenbroek  */
329*7348b5c5SDavid van Moolenbroek 
330*7348b5c5SDavid van Moolenbroek int
tn3270_ttype(void)331*7348b5c5SDavid van Moolenbroek tn3270_ttype(void)
332*7348b5c5SDavid van Moolenbroek {
333*7348b5c5SDavid van Moolenbroek     /*
334*7348b5c5SDavid van Moolenbroek      * Try to send a 3270 type terminal name.  Decide which one based
335*7348b5c5SDavid van Moolenbroek      * on the format of our screen, and (in the future) color
336*7348b5c5SDavid van Moolenbroek      * capaiblities.
337*7348b5c5SDavid van Moolenbroek      */
338*7348b5c5SDavid van Moolenbroek     InitTerminal();		/* Sets MaxNumberColumns, MaxNumberLines */
339*7348b5c5SDavid van Moolenbroek     if ((MaxNumberLines >= 24) && (MaxNumberColumns >= 80)) {
340*7348b5c5SDavid van Moolenbroek 	Sent3270TerminalType = 1;
341*7348b5c5SDavid van Moolenbroek 	if ((MaxNumberLines >= 27) && (MaxNumberColumns >= 132)) {
342*7348b5c5SDavid van Moolenbroek 	    MaxNumberLines = 27;
343*7348b5c5SDavid van Moolenbroek 	    MaxNumberColumns = 132;
344*7348b5c5SDavid van Moolenbroek 	    sb_terminal[SBTERMMODEL] = '5';
345*7348b5c5SDavid van Moolenbroek 	} else if (MaxNumberLines >= 43) {
346*7348b5c5SDavid van Moolenbroek 	    MaxNumberLines = 43;
347*7348b5c5SDavid van Moolenbroek 	    MaxNumberColumns = 80;
348*7348b5c5SDavid van Moolenbroek 	    sb_terminal[SBTERMMODEL] = '4';
349*7348b5c5SDavid van Moolenbroek 	} else if (MaxNumberLines >= 32) {
350*7348b5c5SDavid van Moolenbroek 	    MaxNumberLines = 32;
351*7348b5c5SDavid van Moolenbroek 	    MaxNumberColumns = 80;
352*7348b5c5SDavid van Moolenbroek 	    sb_terminal[SBTERMMODEL] = '3';
353*7348b5c5SDavid van Moolenbroek 	} else {
354*7348b5c5SDavid van Moolenbroek 	    MaxNumberLines = 24;
355*7348b5c5SDavid van Moolenbroek 	    MaxNumberColumns = 80;
356*7348b5c5SDavid van Moolenbroek 	    sb_terminal[SBTERMMODEL] = '2';
357*7348b5c5SDavid van Moolenbroek 	}
358*7348b5c5SDavid van Moolenbroek 	NumberLines = 24;		/* before we start out... */
359*7348b5c5SDavid van Moolenbroek 	NumberColumns = 80;
360*7348b5c5SDavid van Moolenbroek 	ScreenSize = NumberLines*NumberColumns;
361*7348b5c5SDavid van Moolenbroek 	if ((MaxNumberLines*MaxNumberColumns) > MAXSCREENSIZE) {
362*7348b5c5SDavid van Moolenbroek 	    ExitString("Programming error:  MAXSCREENSIZE too small.\n",
363*7348b5c5SDavid van Moolenbroek 								1);
364*7348b5c5SDavid van Moolenbroek 	    /*NOTREACHED*/
365*7348b5c5SDavid van Moolenbroek 	}
366*7348b5c5SDavid van Moolenbroek 	printsub('>', sb_terminal+2, sizeof sb_terminal-2);
367*7348b5c5SDavid van Moolenbroek 	ring_supply_data(&netoring, sb_terminal, sizeof sb_terminal);
368*7348b5c5SDavid van Moolenbroek 	return 1;
369*7348b5c5SDavid van Moolenbroek     } else {
370*7348b5c5SDavid van Moolenbroek 	return 0;
371*7348b5c5SDavid van Moolenbroek     }
372*7348b5c5SDavid van Moolenbroek }
373*7348b5c5SDavid van Moolenbroek 
374*7348b5c5SDavid van Moolenbroek int
settranscom(int argc,char * argv[])375*7348b5c5SDavid van Moolenbroek settranscom(int argc, char *argv[])
376*7348b5c5SDavid van Moolenbroek {
377*7348b5c5SDavid van Moolenbroek 	int i;
378*7348b5c5SDavid van Moolenbroek 
379*7348b5c5SDavid van Moolenbroek 	if (argc == 1 && transcom) {
380*7348b5c5SDavid van Moolenbroek 	   transcom = 0;
381*7348b5c5SDavid van Moolenbroek 	}
382*7348b5c5SDavid van Moolenbroek 	if (argc == 1) {
383*7348b5c5SDavid van Moolenbroek 	   return 1;
384*7348b5c5SDavid van Moolenbroek 	}
385*7348b5c5SDavid van Moolenbroek 	transcom = tline;
386*7348b5c5SDavid van Moolenbroek 	(void) strlcpy(tline, argv[1], sizeof(tline));
387*7348b5c5SDavid van Moolenbroek 	for (i = 2; i < argc; ++i) {
388*7348b5c5SDavid van Moolenbroek 	    (void) strlcat(tline, " ", sizeof(tline));
389*7348b5c5SDavid van Moolenbroek 	    (void) strlcat(tline, argv[i], sizeof(tline));
390*7348b5c5SDavid van Moolenbroek 	}
391*7348b5c5SDavid van Moolenbroek 	return 1;
392*7348b5c5SDavid van Moolenbroek }
393*7348b5c5SDavid van Moolenbroek 
394*7348b5c5SDavid van Moolenbroek #endif	/* defined(TN3270) */
395