xref: /csrg-svn/usr.bin/telnet/tn3270.c (revision 32257)
132185Sminshall void
232185Sminshall tn3270_init()
332185Sminshall {
432185Sminshall #if	defined(TN3270)
532185Sminshall     Sent3270TerminalType = 0;
632185Sminshall     Ifrontp = Ibackp = Ibuf;
732185Sminshall     init_ctlr();		/* Initialize some things */
832185Sminshall     init_keyboard();
932185Sminshall     init_screen();
1032185Sminshall     init_system();
1132185Sminshall #endif	/* defined(TN3270) */
1232185Sminshall }
1332185Sminshall 
1432185Sminshall #if	defined(TN3270)
1532185Sminshall 
1632185Sminshall /*
1732185Sminshall  * DataToNetwork - queue up some data to go to network.  If "done" is set,
1832185Sminshall  * then when last byte is queued, we add on an IAC EOR sequence (so,
1932185Sminshall  * don't call us with "done" until you want that done...)
2032185Sminshall  *
2132185Sminshall  * We actually do send all the data to the network buffer, since our
2232185Sminshall  * only client needs for us to do that.
2332185Sminshall  */
2432185Sminshall 
2532185Sminshall int
2632185Sminshall DataToNetwork(buffer, count, done)
2732185Sminshall register char	*buffer;	/* where the data is */
2832185Sminshall register int	count;		/* how much to send */
2932185Sminshall int		done;		/* is this the last of a logical block */
3032185Sminshall {
3132185Sminshall     register int c;
3232185Sminshall     int origCount;
3332185Sminshall     fd_set o;
3432185Sminshall 
3532185Sminshall     origCount = count;
3632185Sminshall     FD_ZERO(&o);
3732185Sminshall 
3832185Sminshall     while (count) {
3932185Sminshall 	if ((netobuf+sizeof netobuf - nfrontp) < 6) {
4032185Sminshall 	    netflush();
4132185Sminshall 	    while ((netobuf+sizeof netobuf - nfrontp) < 6) {
4232185Sminshall 		FD_SET(net, &o);
4332185Sminshall 		(void) select(net+1, (fd_set *) 0, &o, (fd_set *) 0,
4432185Sminshall 						(struct timeval *) 0);
4532185Sminshall 		netflush();
4632185Sminshall 	    }
4732185Sminshall 	}
4832185Sminshall 	c = *buffer++;
4932185Sminshall 	count--;
5032185Sminshall 	if (c == IAC) {
5132185Sminshall 	    *nfrontp++ = IAC;
5232185Sminshall 	    *nfrontp++ = IAC;
5332185Sminshall 	} else {
5432185Sminshall 	    *nfrontp++ = c;
5532185Sminshall 	}
5632185Sminshall     }
5732185Sminshall 
5832185Sminshall     if (done && !count) {
5932185Sminshall 	*nfrontp++ = IAC;
6032185Sminshall 	*nfrontp++ = EOR;
6132185Sminshall 	netflush();		/* try to move along as quickly as ... */
6232185Sminshall     }
6332185Sminshall     return(origCount - count);
6432185Sminshall }
6532185Sminshall 
6632185Sminshall 
6732185Sminshall #if	defined(unix)
6832185Sminshall static void
6932185Sminshall inputAvailable()
7032185Sminshall {
7132185Sminshall     HaveInput = 1;
7232185Sminshall }
7332185Sminshall #endif	/* defined(unix) */
7432185Sminshall 
7532185Sminshall void
7632185Sminshall outputPurge()
7732185Sminshall {
78*32257Sminshall     ttyflush(1);
7932185Sminshall }
8032185Sminshall 
8132185Sminshall 
8232185Sminshall /*
8332185Sminshall  * The following routines are places where the various tn3270
8432185Sminshall  * routines make calls into telnet.c.
8532185Sminshall  */
8632185Sminshall 
8732185Sminshall /* TtyChars() - returns the number of characters in the TTY buffer */
8832185Sminshall TtyChars()
8932185Sminshall {
9032185Sminshall     return(tfrontp-tbackp);
9132185Sminshall }
9232185Sminshall 
9332185Sminshall /* DataToTerminal - queue up some data to go to terminal. */
9432185Sminshall 
9532185Sminshall int
9632185Sminshall DataToTerminal(buffer, count)
9732185Sminshall register char	*buffer;		/* where the data is */
9832185Sminshall register int	count;			/* how much to send */
9932185Sminshall {
10032185Sminshall     int origCount;
10132185Sminshall #if	defined(unix)
10232185Sminshall     fd_set	o;
10332185Sminshall 
10432185Sminshall     FD_ZERO(&o);
10532185Sminshall #endif	/* defined(unix) */
10632185Sminshall     origCount = count;
10732185Sminshall 
10832185Sminshall     while (count) {
10932185Sminshall 	if (tfrontp >= ttyobuf+sizeof ttyobuf) {
110*32257Sminshall 	    ttyflush(0);
11132185Sminshall 	    while (tfrontp >= ttyobuf+sizeof ttyobuf) {
11232185Sminshall #if	defined(unix)
11332185Sminshall 		FD_SET(tout, &o);
11432185Sminshall 		(void) select(tout+1, (fd_set *) 0, &o, (fd_set *) 0,
11532185Sminshall 						(struct timeval *) 0);
11632185Sminshall #endif	/* defined(unix) */
117*32257Sminshall 		ttyflush(0);
11832185Sminshall 	    }
11932185Sminshall 	}
12032185Sminshall 	*tfrontp++ = *buffer++;
12132185Sminshall 	count--;
12232185Sminshall     }
12332185Sminshall     return(origCount - count);
12432185Sminshall }
12532185Sminshall 
12632185Sminshall /* EmptyTerminal - called to make sure that the terminal buffer is empty.
12732185Sminshall  *			Note that we consider the buffer to run all the
12832185Sminshall  *			way to the kernel (thus the select).
12932185Sminshall  */
13032185Sminshall 
13132185Sminshall void
13232185Sminshall EmptyTerminal()
13332185Sminshall {
13432185Sminshall #if	defined(unix)
13532185Sminshall     fd_set	o;
13632185Sminshall 
13732185Sminshall     FD_ZERO(&o);
13832185Sminshall #endif	/* defined(unix) */
13932185Sminshall 
14032185Sminshall     if (tfrontp == tbackp) {
14132185Sminshall #if	defined(unix)
14232185Sminshall 	FD_SET(tout, &o);
14332185Sminshall 	(void) select(tout+1, (int *) 0, &o, (int *) 0,
14432185Sminshall 			(struct timeval *) 0);	/* wait for TTLOWAT */
14532185Sminshall #endif	/* defined(unix) */
14632185Sminshall     } else {
14732185Sminshall 	while (tfrontp != tbackp) {
148*32257Sminshall 	    ttyflush(0);
14932185Sminshall #if	defined(unix)
15032185Sminshall 	    FD_SET(tout, &o);
15132185Sminshall 	    (void) select(tout+1, (int *) 0, &o, (int *) 0,
15232185Sminshall 				(struct timeval *) 0);	/* wait for TTLOWAT */
15332185Sminshall #endif	/* defined(unix) */
15432185Sminshall 	}
15532185Sminshall     }
15632185Sminshall }
15732185Sminshall 
15832185Sminshall 
15932185Sminshall /*
16032185Sminshall  * Push3270 - Try to send data along the 3270 output (to screen) direction.
16132185Sminshall  */
16232185Sminshall 
16332185Sminshall static int
16432185Sminshall Push3270()
16532185Sminshall {
16632185Sminshall     int save = scc;
16732185Sminshall 
16832185Sminshall     if (scc) {
16932185Sminshall 	if (Ifrontp+scc > Ibuf+sizeof Ibuf) {
17032185Sminshall 	    if (Ibackp != Ibuf) {
17132185Sminshall 		memcpy(Ibuf, Ibackp, Ifrontp-Ibackp);
17232185Sminshall 		Ifrontp -= (Ibackp-Ibuf);
17332185Sminshall 		Ibackp = Ibuf;
17432185Sminshall 	    }
17532185Sminshall 	}
17632185Sminshall 	if (Ifrontp+scc < Ibuf+sizeof Ibuf) {
17732185Sminshall 	    telrcv();
17832185Sminshall 	}
17932185Sminshall     }
18032185Sminshall     return save != scc;
18132185Sminshall }
18232185Sminshall 
18332185Sminshall 
18432185Sminshall /*
18532185Sminshall  * Finish3270 - get the last dregs of 3270 data out to the terminal
18632185Sminshall  *		before quitting.
18732185Sminshall  */
18832185Sminshall 
18932185Sminshall static void
19032185Sminshall Finish3270()
19132185Sminshall {
19232185Sminshall     while (Push3270() || !DoTerminalOutput()) {
19332185Sminshall #if	defined(unix)
19432185Sminshall 	HaveInput = 0;
19532185Sminshall #endif	/* defined(unix) */
19632185Sminshall 	;
19732185Sminshall     }
19832185Sminshall }
19932185Sminshall 
20032185Sminshall 
20132185Sminshall /* StringToTerminal - output a null terminated string to the terminal */
20232185Sminshall 
20332185Sminshall void
20432185Sminshall StringToTerminal(s)
20532185Sminshall char *s;
20632185Sminshall {
20732185Sminshall     int count;
20832185Sminshall 
20932185Sminshall     count = strlen(s);
21032185Sminshall     if (count) {
21132185Sminshall 	(void) DataToTerminal(s, count);	/* we know it always goes... */
21232185Sminshall     }
21332185Sminshall }
21432185Sminshall 
21532185Sminshall 
21632185Sminshall #if	((!defined(NOT43)) || defined(PUTCHAR))
21732185Sminshall /* _putchar - output a single character to the terminal.  This name is so that
21832185Sminshall  *	curses(3x) can call us to send out data.
21932185Sminshall  */
22032185Sminshall 
22132185Sminshall void
22232185Sminshall _putchar(c)
22332185Sminshall char c;
22432185Sminshall {
22532185Sminshall     if (tfrontp >= ttyobuf+sizeof ttyobuf) {
22632185Sminshall 	(void) DataToTerminal(&c, 1);
22732185Sminshall     } else {
22832185Sminshall 	*tfrontp++ = c;		/* optimize if possible. */
22932185Sminshall     }
23032185Sminshall }
23132185Sminshall #endif	/* ((!defined(NOT43)) || defined(PUTCHAR)) */
23232185Sminshall 
23332185Sminshall #endif	/* defined(TN3270) */
234