xref: /csrg-svn/usr.bin/telnet/terminal.c (revision 32531)
132148Sminshall #include <arpa/telnet.h>
232381Sminshall #include <sys/types.h>
332148Sminshall 
432381Sminshall #include "ring.h"
532381Sminshall 
632148Sminshall #include "externs.h"
732148Sminshall #include "types.h"
832148Sminshall 
9*32531Sminshall Ring	ttyoring, ttyiring;
10*32531Sminshall char	ttyobuf[2*BUFSIZ], ttyibuf[BUFSIZ];
1132148Sminshall 
1232148Sminshall char
1332148Sminshall     termEofChar,
1432148Sminshall     termEraseChar,
1532148Sminshall     termFlushChar,
1632148Sminshall     termIntChar,
1732148Sminshall     termKillChar,
1832148Sminshall     termLiteralNextChar,
1932148Sminshall     termQuitChar;
2032148Sminshall 
2132148Sminshall /*
2232148Sminshall  * initialize the terminal data structures.
2332148Sminshall  */
2432148Sminshall 
2532148Sminshall init_terminal()
2632148Sminshall {
2732381Sminshall     ring_init(&ttyoring, ttyobuf, sizeof ttyobuf);
28*32531Sminshall     ring_init(&ttyiring, ttyibuf, sizeof ttyibuf);
2932148Sminshall     autoflush = TerminalAutoFlush();
3032148Sminshall }
3132148Sminshall 
3232148Sminshall 
3332148Sminshall /*
3432148Sminshall  *		Send as much data as possible to the terminal.
3532148Sminshall  *
3632148Sminshall  *		The return value indicates whether we did any
3732148Sminshall  *	useful work.
3832148Sminshall  */
3932148Sminshall 
4032148Sminshall 
4132148Sminshall int
4232257Sminshall ttyflush(drop)
4332257Sminshall int drop;
4432148Sminshall {
4532148Sminshall     int n;
4632148Sminshall 
4732528Sminshall     if ((n = ring_full_consecutive(&ttyoring)) > 0) {
4832257Sminshall 	if (drop) {
4932148Sminshall 	    TerminalFlushOutput();
5032148Sminshall 	    /* we leave 'n' alone! */
5132257Sminshall 	} else {
5232528Sminshall 	    n = TerminalWrite(tout, ttyoring.consume, n);
5332148Sminshall 	}
5432148Sminshall     }
5532148Sminshall     if (n >= 0) {
5632528Sminshall 	ring_consumed(&ttyoring, n);
5732148Sminshall     }
5832148Sminshall     return n > 0;
5932148Sminshall }
6032148Sminshall 
6132148Sminshall 
6232148Sminshall #if	defined(unix)
6332148Sminshall /*
6432148Sminshall  * Various signal handling routines.
6532148Sminshall  */
6632148Sminshall 
6732148Sminshall void
6832148Sminshall deadpeer()
6932148Sminshall {
7032148Sminshall 	setcommandmode();
7132148Sminshall 	longjmp(peerdied, -1);
7232148Sminshall }
7332148Sminshall 
7432148Sminshall void
7532148Sminshall intr()
7632148Sminshall {
7732148Sminshall     if (localchars) {
7832148Sminshall 	intp();
7932148Sminshall 	return;
8032148Sminshall     }
8132148Sminshall     setcommandmode();
8232148Sminshall     longjmp(toplevel, -1);
8332148Sminshall }
8432148Sminshall 
8532148Sminshall void
8632148Sminshall intr2()
8732148Sminshall {
8832148Sminshall     if (localchars) {
8932148Sminshall 	sendbrk();
9032148Sminshall 	return;
9132148Sminshall     }
9232148Sminshall }
9332148Sminshall 
9432148Sminshall void
9532148Sminshall doescape()
9632148Sminshall {
9732148Sminshall     command(0);
9832148Sminshall }
9932148Sminshall #endif	/* defined(unix) */
10032148Sminshall 
10132148Sminshall /*
10232148Sminshall  * These routines decides on what the mode should be (based on the values
10332148Sminshall  * of various global variables).
10432148Sminshall  */
10532148Sminshall 
10632148Sminshall 
10732148Sminshall int
10832148Sminshall getconnmode()
10932148Sminshall {
11032148Sminshall     static char newmode[16] =
11132148Sminshall 			{ 4, 5, 3, 3, 2, 2, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6 };
11232148Sminshall     int modeindex = 0;
11332148Sminshall 
11432148Sminshall     if (dontlecho && (clocks.echotoggle > clocks.modenegotiated)) {
11532148Sminshall 	modeindex += 1;
11632148Sminshall     }
11732148Sminshall     if (hisopts[TELOPT_ECHO]) {
11832148Sminshall 	modeindex += 2;
11932148Sminshall     }
12032148Sminshall     if (hisopts[TELOPT_SGA]) {
12132148Sminshall 	modeindex += 4;
12232148Sminshall     }
12332148Sminshall     if (In3270) {
12432148Sminshall 	modeindex += 8;
12532148Sminshall     }
12632148Sminshall     return newmode[modeindex];
12732148Sminshall }
12832148Sminshall 
12932148Sminshall void
13032148Sminshall setconnmode()
13132148Sminshall {
13232148Sminshall     TerminalNewMode(tin, tout, getconnmode());
13332148Sminshall }
13432148Sminshall 
13532148Sminshall 
13632148Sminshall void
13732148Sminshall setcommandmode()
13832148Sminshall {
13932148Sminshall     TerminalNewMode(tin, tout, 0);
14032148Sminshall }
141