-/* $OpenBSD: ttymodes.c,v 1.26 2006/08/03 03:34:42 deraadt Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
*/
#include "includes.h"
-
-#include <sys/types.h>
-
-#include <errno.h>
-#include <string.h>
-#include <termios.h>
-#include <stdarg.h>
+RCSID("$OpenBSD: ttymodes.c,v 1.14 2001/06/24 17:18:31 markus Exp $");
#include "packet.h"
#include "log.h"
#include "ssh1.h"
#include "compat.h"
#include "buffer.h"
+#include "bufaux.h"
#define TTY_OP_END 0
/*
}
}
-/*
- * Encode a special character into SSH line format.
- */
-static u_int
-special_char_encode(cc_t c)
-{
-#ifdef _POSIX_VDISABLE
- if (c == _POSIX_VDISABLE)
- return 255;
-#endif /* _POSIX_VDISABLE */
- return c;
-}
-
-/*
- * Decode a special character from SSH line format.
- */
-static cc_t
-special_char_decode(u_int c)
-{
-#ifdef _POSIX_VDISABLE
- if (c == 255)
- return _POSIX_VDISABLE;
-#endif /* _POSIX_VDISABLE */
- return c;
-}
-
/*
* Encodes terminal modes for the terminal referenced by fd
* or tiop in a portable manner, and appends the modes to a packet
if (tiop == NULL) {
if (tcgetattr(fd, &tio) == -1) {
- logit("tcgetattr: %.100s", strerror(errno));
+ log("tcgetattr: %.100s", strerror(errno));
goto end;
}
} else
#define TTYCHAR(NAME, OP) \
debug3("tty_make_modes: %d %d", OP, tio.c_cc[NAME]); \
buffer_put_char(&buf, OP); \
- put_arg(&buf, special_char_encode(tio.c_cc[NAME]));
+ put_arg(&buf, tio.c_cc[NAME]);
#define TTYMODE(NAME, FIELD, OP) \
debug3("tty_make_modes: %d %d", OP, ((tio.FIELD & NAME) != 0)); \
else
packet_put_raw(buffer_ptr(&buf), buffer_len(&buf));
buffer_free(&buf);
+ return;
}
/*
* modes, they will initially have reasonable values.
*/
if (tcgetattr(fd, &tio) == -1) {
- logit("tcgetattr: %.100s", strerror(errno));
+ log("tcgetattr: %.100s", strerror(errno));
failure = -1;
}
n_bytes += 4;
baud = packet_get_int();
debug3("tty_parse_modes: ispeed %d", baud);
- if (failure != -1 &&
- cfsetispeed(&tio, baud_to_speed(baud)) == -1)
+ if (failure != -1 && cfsetispeed(&tio, baud_to_speed(baud)) == -1)
error("cfsetispeed failed for %d", baud);
break;
n_bytes += 4;
baud = packet_get_int();
debug3("tty_parse_modes: ospeed %d", baud);
- if (failure != -1 &&
- cfsetospeed(&tio, baud_to_speed(baud)) == -1)
+ if (failure != -1 && cfsetospeed(&tio, baud_to_speed(baud)) == -1)
error("cfsetospeed failed for %d", baud);
break;
#define TTYCHAR(NAME, OP) \
case OP: \
n_bytes += arg_size; \
- tio.c_cc[NAME] = special_char_decode(get_arg()); \
+ tio.c_cc[NAME] = get_arg(); \
debug3("tty_parse_modes: %d %d", OP, tio.c_cc[NAME]); \
break;
#define TTYMODE(NAME, FIELD, OP) \
default:
debug("Ignoring unsupported tty mode opcode %d (0x%x)",
- opcode, opcode);
+ opcode, opcode);
if (!compat20) {
/*
* SSH1:
* Opcodes 1 to 127 are defined to have
* a one-byte argument.
- * Opcodes 128 to 159 are defined to have
- * an integer argument.
- */
+ * Opcodes 128 to 159 are defined to have
+ * an integer argument.
+ */
if (opcode > 0 && opcode < 128) {
n_bytes += 1;
(void) packet_get_char();
break;
} else if (opcode >= 128 && opcode < 160) {
- n_bytes += 4;
- (void) packet_get_int();
- break;
+ n_bytes += 4;
+ (void) packet_get_int();
+ break;
} else {
/*
* It is a truly undefined opcode (160 to 255).
* We have no idea about its arguments. So we
- * must stop parsing. Note that some data
- * may be left in the packet; hopefully there
- * is nothing more coming after the mode data.
+ * must stop parsing. Note that some data may be
+ * left in the packet; hopefully there is nothing
+ * more coming after the mode data.
*/
- logit("parse_tty_modes: unknown opcode %d",
- opcode);
+ log("parse_tty_modes: unknown opcode %d", opcode);
+ packet_integrity_check(0, 1, SSH_CMSG_REQUEST_PTY);
goto set;
- }
+ }
} else {
/*
* SSH2:
(void) packet_get_int();
break;
} else {
- logit("parse_tty_modes: unknown opcode %d",
- opcode);
+ log("parse_tty_modes: unknown opcode %d", opcode);
goto set;
}
- }
+ }
}
}
set:
if (*n_bytes_ptr != n_bytes) {
*n_bytes_ptr = n_bytes;
- logit("parse_tty_modes: n_bytes_ptr != n_bytes: %d %d",
+ log("parse_tty_modes: n_bytes_ptr != n_bytes: %d %d",
*n_bytes_ptr, n_bytes);
return; /* Don't process bytes passed */
}
/* Set the new modes for the terminal. */
if (tcsetattr(fd, TCSANOW, &tio) == -1)
- logit("Setting tty modes failed: %.100s", strerror(errno));
+ log("Setting tty modes failed: %.100s", strerror(errno));
+ return;
}