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