132148Sminshall #include <arpa/telnet.h> 2*32381Sminshall #include <sys/types.h> 332148Sminshall 4*32381Sminshall #include "ring.h" 5*32381Sminshall 632148Sminshall #include "externs.h" 732148Sminshall #include "types.h" 832148Sminshall 9*32381Sminshall Ring ttyoring; 10*32381Sminshall char ttyobuf[2*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 { 27*32381Sminshall ring_init(&ttyoring, ttyobuf, sizeof ttyobuf); 2832148Sminshall autoflush = TerminalAutoFlush(); 2932148Sminshall } 3032148Sminshall 3132148Sminshall 3232148Sminshall /* 3332148Sminshall * Send as much data as possible to the terminal. 3432148Sminshall * 3532148Sminshall * The return value indicates whether we did any 3632148Sminshall * useful work. 3732148Sminshall */ 3832148Sminshall 3932148Sminshall 4032148Sminshall int 4132257Sminshall ttyflush(drop) 4232257Sminshall int drop; 4332148Sminshall { 4432148Sminshall int n; 4532148Sminshall 46*32381Sminshall if ((n = ring_unsent_consecutive(&ttyoring)) > 0) { 4732257Sminshall if (drop) { 4832148Sminshall TerminalFlushOutput(); 4932148Sminshall /* we leave 'n' alone! */ 5032257Sminshall } else { 51*32381Sminshall n = TerminalWrite(tout, ttyoring.send, n); 5232148Sminshall } 5332148Sminshall } 5432148Sminshall if (n >= 0) { 55*32381Sminshall ring_sent(&ttyoring, n); 5632148Sminshall } 5732148Sminshall return n > 0; 5832148Sminshall } 5932148Sminshall 6032148Sminshall 6132148Sminshall #if defined(unix) 6232148Sminshall /* 6332148Sminshall * Various signal handling routines. 6432148Sminshall */ 6532148Sminshall 6632148Sminshall void 6732148Sminshall deadpeer() 6832148Sminshall { 6932148Sminshall setcommandmode(); 7032148Sminshall longjmp(peerdied, -1); 7132148Sminshall } 7232148Sminshall 7332148Sminshall void 7432148Sminshall intr() 7532148Sminshall { 7632148Sminshall if (localchars) { 7732148Sminshall intp(); 7832148Sminshall return; 7932148Sminshall } 8032148Sminshall setcommandmode(); 8132148Sminshall longjmp(toplevel, -1); 8232148Sminshall } 8332148Sminshall 8432148Sminshall void 8532148Sminshall intr2() 8632148Sminshall { 8732148Sminshall if (localchars) { 8832148Sminshall sendbrk(); 8932148Sminshall return; 9032148Sminshall } 9132148Sminshall } 9232148Sminshall 9332148Sminshall void 9432148Sminshall doescape() 9532148Sminshall { 9632148Sminshall command(0); 9732148Sminshall } 9832148Sminshall #endif /* defined(unix) */ 9932148Sminshall 10032148Sminshall /* 10132148Sminshall * These routines decides on what the mode should be (based on the values 10232148Sminshall * of various global variables). 10332148Sminshall */ 10432148Sminshall 10532148Sminshall 10632148Sminshall int 10732148Sminshall getconnmode() 10832148Sminshall { 10932148Sminshall static char newmode[16] = 11032148Sminshall { 4, 5, 3, 3, 2, 2, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6 }; 11132148Sminshall int modeindex = 0; 11232148Sminshall 11332148Sminshall if (dontlecho && (clocks.echotoggle > clocks.modenegotiated)) { 11432148Sminshall modeindex += 1; 11532148Sminshall } 11632148Sminshall if (hisopts[TELOPT_ECHO]) { 11732148Sminshall modeindex += 2; 11832148Sminshall } 11932148Sminshall if (hisopts[TELOPT_SGA]) { 12032148Sminshall modeindex += 4; 12132148Sminshall } 12232148Sminshall if (In3270) { 12332148Sminshall modeindex += 8; 12432148Sminshall } 12532148Sminshall return newmode[modeindex]; 12632148Sminshall } 12732148Sminshall 12832148Sminshall void 12932148Sminshall setconnmode() 13032148Sminshall { 13132148Sminshall TerminalNewMode(tin, tout, getconnmode()); 13232148Sminshall } 13332148Sminshall 13432148Sminshall 13532148Sminshall void 13632148Sminshall setcommandmode() 13732148Sminshall { 13832148Sminshall TerminalNewMode(tin, tout, 0); 13932148Sminshall } 140