|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1988 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted provided ! 6: * that: (1) source distributions retain this entire copyright notice and ! 7: * comment, and (2) distributions including binaries display the following ! 8: * acknowledgement: ``This product includes software developed by the ! 9: * University of California, Berkeley and its contributors'' in the ! 10: * documentation or other materials provided with the distribution and in ! 11: * all advertising materials mentioning features or use of this software. ! 12: * Neither the name of the University nor the names of its contributors may ! 13: * be used to endorse or promote products derived from this software without ! 14: * specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 16: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 17: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: */ ! 19: ! 20: #ifndef lint ! 21: static char sccsid[] = "@(#)terminal.c 1.21 (Berkeley) 6/28/90"; ! 22: #endif /* not lint */ ! 23: ! 24: #include <arpa/telnet.h> ! 25: #include <sys/types.h> ! 26: ! 27: #include "ring.h" ! 28: ! 29: #include "externs.h" ! 30: #include "types.h" ! 31: ! 32: Ring ttyoring, ttyiring; ! 33: char ttyobuf[2*BUFSIZ], ttyibuf[BUFSIZ]; ! 34: ! 35: int termdata; /* Debugging flag */ ! 36: ! 37: #ifdef USE_TERMIO ! 38: # ifndef VFLUSHO ! 39: cc_t termFlushChar; ! 40: # endif ! 41: # ifndef VLNEXT ! 42: cc_t termLiteralNextChar; ! 43: # endif ! 44: # ifndef VSUSP ! 45: cc_t termSuspChar; ! 46: # endif ! 47: # ifndef VWERASE ! 48: cc_t termWerasChar; ! 49: # endif ! 50: # ifndef VREPRINT ! 51: cc_t termRprntChar; ! 52: # endif ! 53: # ifndef VSTART ! 54: cc_t termStartChar; ! 55: # endif ! 56: # ifndef VSTOP ! 57: cc_t termStopChar; ! 58: # endif ! 59: # ifndef VEOL ! 60: cc_t termForw1Char; ! 61: # endif ! 62: # ifndef VEOL2 ! 63: cc_t termForw2Char; ! 64: # endif ! 65: #else ! 66: cc_t termForw2Char; ! 67: #endif ! 68: ! 69: /* ! 70: * initialize the terminal data structures. ! 71: */ ! 72: ! 73: init_terminal() ! 74: { ! 75: if (ring_init(&ttyoring, ttyobuf, sizeof ttyobuf) != 1) { ! 76: exit(1); ! 77: } ! 78: if (ring_init(&ttyiring, ttyibuf, sizeof ttyibuf) != 1) { ! 79: exit(1); ! 80: } ! 81: autoflush = TerminalAutoFlush(); ! 82: } ! 83: ! 84: ! 85: /* ! 86: * Send as much data as possible to the terminal. ! 87: * ! 88: * Return value: ! 89: * -1: No useful work done, data waiting to go out. ! 90: * 0: No data was waiting, so nothing was done. ! 91: * 1: All waiting data was written out. ! 92: * n: All data - n was written out. ! 93: */ ! 94: ! 95: ! 96: int ! 97: ttyflush(drop) ! 98: int drop; ! 99: { ! 100: register int n, n0, n1; ! 101: ! 102: n0 = ring_full_count(&ttyoring); ! 103: if ((n1 = n = ring_full_consecutive(&ttyoring)) > 0) { ! 104: if (drop) { ! 105: TerminalFlushOutput(); ! 106: /* we leave 'n' alone! */ ! 107: } else { ! 108: n = TerminalWrite(ttyoring.consume, n); ! 109: } ! 110: } ! 111: if (n > 0) { ! 112: if (termdata && n) { ! 113: Dump('>', ttyoring.consume, n); ! 114: } ! 115: /* ! 116: * If we wrote everything, and the full count is ! 117: * larger than what we wrote, then write the ! 118: * rest of the buffer. ! 119: */ ! 120: if (n1 == n && n0 > n) { ! 121: n1 = n0 - n; ! 122: if (!drop) ! 123: n1 = TerminalWrite(ttyoring.bottom, n1); ! 124: n += n1; ! 125: } ! 126: ring_consumed(&ttyoring, n); ! 127: } ! 128: if (n < 0) ! 129: return -1; ! 130: if (n == n0) { ! 131: if (n0) ! 132: return -1; ! 133: return 0; ! 134: } ! 135: return n0 - n + 1; ! 136: } ! 137: ! 138: ! 139: /* ! 140: * These routines decides on what the mode should be (based on the values ! 141: * of various global variables). ! 142: */ ! 143: ! 144: ! 145: int ! 146: getconnmode() ! 147: { ! 148: extern int linemode; ! 149: int mode = 0; ! 150: #ifdef KLUDGELINEMODE ! 151: extern int kludgelinemode; ! 152: #endif ! 153: ! 154: if (In3270) ! 155: return(MODE_FLOW); ! 156: ! 157: if (my_want_state_is_dont(TELOPT_ECHO)) ! 158: mode |= MODE_ECHO; ! 159: ! 160: if (localflow) ! 161: mode |= MODE_FLOW; ! 162: ! 163: if (my_want_state_is_will(TELOPT_BINARY)) ! 164: mode |= MODE_INBIN; ! 165: ! 166: if (his_want_state_is_will(TELOPT_BINARY)) ! 167: mode |= MODE_OUTBIN; ! 168: ! 169: #ifdef KLUDGELINEMODE ! 170: if (kludgelinemode) { ! 171: if (my_want_state_is_dont(TELOPT_SGA)) { ! 172: mode |= (MODE_TRAPSIG|MODE_EDIT); ! 173: if (dontlecho && (clocks.echotoggle > clocks.modenegotiated)) { ! 174: mode &= ~MODE_ECHO; ! 175: } ! 176: } ! 177: return(mode); ! 178: } ! 179: #endif ! 180: if (my_want_state_is_will(TELOPT_LINEMODE)) ! 181: mode |= linemode; ! 182: return(mode); ! 183: } ! 184: ! 185: void ! 186: setconnmode(force) ! 187: { ! 188: TerminalNewMode(getconnmode()|(force?MODE_FORCE:0)); ! 189: } ! 190: ! 191: ! 192: void ! 193: setcommandmode() ! 194: { ! 195: TerminalNewMode(-1); ! 196: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.