1 /* $NetBSD: terminal.c,v 1.14 2004/03/20 23:26:05 heas Exp $ */
4 * Copyright (c) 1988, 1990, 1993
5 * The Regents of the University of California. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 #include <sys/cdefs.h>
35 static char sccsid
[] = "@(#)terminal.c 8.2 (Berkeley) 2/16/95";
37 __RCSID("$NetBSD: terminal.c,v 1.14 2004/03/20 23:26:05 heas Exp $");
41 #include <arpa/telnet.h>
42 #include <sys/types.h>
50 #include <libtelnet/encrypt.h>
53 Ring ttyoring
, ttyiring
;
54 unsigned char ttyobuf
[2*BUFSIZ
], ttyibuf
[BUFSIZ
];
55 char line
[] = { '\0' };
57 int termdata
; /* Debugging flag */
60 * initialize the terminal data structures.
66 if (ring_init(&ttyoring
, ttyobuf
, sizeof ttyobuf
) != 1) {
69 if (ring_init(&ttyiring
, ttyibuf
, sizeof ttyibuf
) != 1) {
72 autoflush
= TerminalAutoFlush();
77 * Send as much data as possible to the terminal, else exits if
78 * it encounters a permanent failure when writing to the tty.
81 * -1: No useful work done, data waiting to go out.
82 * 0: No data was waiting, so nothing was done.
83 * 1: All waiting data was written out.
84 * n: All data - n was written out.
93 n0
= ring_full_count(&ttyoring
);
94 if ((n1
= n
= ring_full_consecutive(&ttyoring
)) > 0) {
96 TerminalFlushOutput();
97 /* we leave 'n' alone! */
99 n
= TerminalWrite(ttyoring
.consume
, n
);
104 Dump('>', ttyoring
.consume
, n
);
107 * If we wrote everything, and the full count is
108 * larger than what we wrote, then write the
109 * rest of the buffer.
111 if (n1
== n
&& n0
> n
) {
114 n1
= TerminalWrite(ttyoring
.bottom
, n1
);
118 ring_consumed(&ttyoring
, n
);
121 if (errno
== EAGAIN
|| errno
== EINTR
) {
124 ring_consumed(&ttyoring
, ring_full_count(&ttyoring
));
128 fprintf(stderr
, "Connection closed by foreign host.\n");
142 * These routines decides on what the mode should be (based on the values
143 * of various global variables).
152 #ifdef KLUDGELINEMODE
153 extern int kludgelinemode
;
159 if (my_want_state_is_dont(TELOPT_ECHO
))
165 if (my_want_state_is_will(TELOPT_BINARY
))
168 if (his_want_state_is_will(TELOPT_BINARY
))
171 #ifdef KLUDGELINEMODE
172 if (kludgelinemode
) {
173 if (my_want_state_is_dont(TELOPT_SGA
)) {
174 mode
|= (MODE_TRAPSIG
|MODE_EDIT
);
175 if (dontlecho
&& (clocks
.echotoggle
> clocks
.modenegotiated
)) {
182 if (my_want_state_is_will(TELOPT_LINEMODE
))
188 setconnmode(int force
)
191 static int enc_passwd
= 0;
195 newmode
= getconnmode()|(force
?MODE_FORCE
:0);
197 TerminalNewMode(newmode
);
200 if ((newmode
& (MODE_ECHO
|MODE_EDIT
)) == MODE_EDIT
) {
201 if (my_want_state_is_will(TELOPT_ENCRYPT
)
202 && (enc_passwd
== 0) && !encrypt_output
) {
203 encrypt_request_start(0, 0);
208 encrypt_request_end();
212 #endif /* ENCRYPTION */