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