|
|
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.