* Copyright (c) 1988, 1990, 1993
* The Regents of the University of California. All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
static char sccsid
[] = "@(#)terminal.c 8.1 (Berkeley) 6/6/93";
unsigned char ttyobuf
[2*BUFSIZ
], ttyibuf
[BUFSIZ
];
int termdata
; /* Debugging flag */
cc_t termLiteralNextChar
;
* initialize the terminal data structures.
if (ring_init(&ttyoring
, ttyobuf
, sizeof ttyobuf
) != 1) {
if (ring_init(&ttyiring
, ttyibuf
, sizeof ttyibuf
) != 1) {
autoflush
= TerminalAutoFlush();
* Send as much data as possible to the terminal.
* -1: No useful work done, data waiting to go out.
* 0: No data was waiting, so nothing was done.
* 1: All waiting data was written out.
* n: All data - n was written out.
n0
= ring_full_count(&ttyoring
);
if ((n1
= n
= ring_full_consecutive(&ttyoring
)) > 0) {
/* we leave 'n' alone! */
n
= TerminalWrite(ttyoring
.consume
, n
);
Dump('>', ttyoring
.consume
, n
);
* If we wrote everything, and the full count is
* larger than what we wrote, then write the
n1
= TerminalWrite(ttyoring
.bottom
, n1
);
ring_consumed(&ttyoring
, n
);
* These routines decides on what the mode should be (based on the values
* of various global variables).
extern int kludgelinemode
;
if (my_want_state_is_dont(TELOPT_ECHO
))
if (my_want_state_is_will(TELOPT_BINARY
))
if (his_want_state_is_will(TELOPT_BINARY
))
if (my_want_state_is_dont(TELOPT_SGA
)) {
mode
|= (MODE_TRAPSIG
|MODE_EDIT
);
if (dontlecho
&& (clocks
.echotoggle
> clocks
.modenegotiated
)) {
if (my_want_state_is_will(TELOPT_LINEMODE
))
static int enc_passwd
= 0;
newmode
= getconnmode()|(force
?MODE_FORCE
:0);
TerminalNewMode(newmode
);
if ((newmode
& (MODE_ECHO
|MODE_EDIT
)) == MODE_EDIT
) {
if (my_want_state_is_will(TELOPT_ENCRYPT
)
&& (enc_passwd
== 0) && !encrypt_output
) {
encrypt_request_start(0, 0);