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 932531Sminshall Ring ttyoring, ttyiring; 1032531Sminshall 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); 2832531Sminshall 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 { 4532667Sminshall register int n, n0, n1; 4632148Sminshall 4732667Sminshall n0 = ring_full_count(&ttyoring); 4832667Sminshall if ((n1 = n = ring_full_consecutive(&ttyoring)) > 0) { 4932257Sminshall if (drop) { 5032148Sminshall TerminalFlushOutput(); 5132148Sminshall /* we leave 'n' alone! */ 5232257Sminshall } else { 53*33286Sminshall n = TerminalWrite(ttyoring.consume, n); 5432148Sminshall } 5532148Sminshall } 5632667Sminshall if (n > 0) { 5732667Sminshall /* 5832667Sminshall * If we wrote everything, and the full count is 5932667Sminshall * larger than what we wrote, then write the 6032667Sminshall * rest of the buffer. 6132667Sminshall */ 6232667Sminshall if (n1 == n && n0 > n) { 6332667Sminshall n1 = n0 - n; 6432667Sminshall if (!drop) 65*33286Sminshall n1 = TerminalWrite(ttyoring.bottom, n1); 6632667Sminshall n += n1; 6732667Sminshall } 6832528Sminshall ring_consumed(&ttyoring, n); 6932148Sminshall } 7032148Sminshall return n > 0; 7132148Sminshall } 7232148Sminshall 7332148Sminshall 7432148Sminshall /* 7532148Sminshall * These routines decides on what the mode should be (based on the values 7632148Sminshall * of various global variables). 7732148Sminshall */ 7832148Sminshall 7932148Sminshall 8032148Sminshall int 8132148Sminshall getconnmode() 8232148Sminshall { 8332148Sminshall static char newmode[16] = 8432148Sminshall { 4, 5, 3, 3, 2, 2, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6 }; 8532148Sminshall int modeindex = 0; 8632148Sminshall 8732148Sminshall if (dontlecho && (clocks.echotoggle > clocks.modenegotiated)) { 8832148Sminshall modeindex += 1; 8932148Sminshall } 9032148Sminshall if (hisopts[TELOPT_ECHO]) { 9132148Sminshall modeindex += 2; 9232148Sminshall } 9332148Sminshall if (hisopts[TELOPT_SGA]) { 9432148Sminshall modeindex += 4; 9532148Sminshall } 9632148Sminshall if (In3270) { 9732148Sminshall modeindex += 8; 9832148Sminshall } 9932148Sminshall return newmode[modeindex]; 10032148Sminshall } 10132148Sminshall 10232148Sminshall void 10332148Sminshall setconnmode() 10432148Sminshall { 105*33286Sminshall TerminalNewMode(getconnmode()); 10632148Sminshall } 10732148Sminshall 10832148Sminshall 10932148Sminshall void 11032148Sminshall setcommandmode() 11132148Sminshall { 112*33286Sminshall TerminalNewMode(0); 11332148Sminshall } 114