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