X-Git-Url: http://andersk.mit.edu/gitweb/openssh.git/blobdiff_plain/30dcc9186bb6f8000c4112c835ab6b30869c3cb5..e45da4d6928b5f35b9add90897665eaec43ac108:/ttymodes.c diff --git a/ttymodes.c b/ttymodes.c index 9ce3fbcc..cf4c7d5c 100644 --- a/ttymodes.c +++ b/ttymodes.c @@ -43,7 +43,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: ttymodes.c,v 1.12 2001/04/14 16:33:20 stevesk Exp $"); +RCSID("$OpenBSD: ttymodes.c,v 1.19 2003/04/08 20:21:29 itojun Exp $"); #include "packet.h" #include "log.h" @@ -240,6 +240,32 @@ baud_to_speed(int baud) } } +/* + * 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 @@ -267,7 +293,7 @@ tty_make_modes(int fd, struct termios *tiop) if (tiop == NULL) { if (tcgetattr(fd, &tio) == -1) { - log("tcgetattr: %.100s", strerror(errno)); + logit("tcgetattr: %.100s", strerror(errno)); goto end; } } else @@ -275,22 +301,22 @@ tty_make_modes(int fd, struct termios *tiop) /* Store input and output baud rates. */ baud = speed_to_baud(cfgetospeed(&tio)); - debug2("tty_make_modes: ospeed %d", baud); + debug3("tty_make_modes: ospeed %d", baud); buffer_put_char(&buf, tty_op_ospeed); buffer_put_int(&buf, baud); baud = speed_to_baud(cfgetispeed(&tio)); - debug2("tty_make_modes: ispeed %d", baud); + debug3("tty_make_modes: ispeed %d", baud); buffer_put_char(&buf, tty_op_ispeed); buffer_put_int(&buf, baud); /* Store values of mode flags. */ #define TTYCHAR(NAME, OP) \ - debug2("tty_make_modes: %d %d", OP, tio.c_cc[NAME]); \ + debug3("tty_make_modes: %d %d", OP, tio.c_cc[NAME]); \ buffer_put_char(&buf, OP); \ - put_arg(&buf, tio.c_cc[NAME]); + put_arg(&buf, special_char_encode(tio.c_cc[NAME])); #define TTYMODE(NAME, FIELD, OP) \ - debug2("tty_make_modes: %d %d", OP, ((tio.FIELD & NAME) != 0)); \ + debug3("tty_make_modes: %d %d", OP, ((tio.FIELD & NAME) != 0)); \ buffer_put_char(&buf, OP); \ put_arg(&buf, ((tio.FIELD & NAME) != 0)); @@ -307,7 +333,6 @@ end: else packet_put_raw(buffer_ptr(&buf), buffer_len(&buf)); buffer_free(&buf); - return; } /* @@ -326,7 +351,7 @@ tty_parse_modes(int fd, int *n_bytes_ptr) if (compat20) { *n_bytes_ptr = packet_get_int(); - debug2("tty_parse_modes: SSH2 n_bytes %d", *n_bytes_ptr); + debug3("tty_parse_modes: SSH2 n_bytes %d", *n_bytes_ptr); if (*n_bytes_ptr == 0) return; get_arg = packet_get_int; @@ -342,7 +367,7 @@ tty_parse_modes(int fd, int *n_bytes_ptr) * modes, they will initially have reasonable values. */ if (tcgetattr(fd, &tio) == -1) { - log("tcgetattr: %.100s", strerror(errno)); + logit("tcgetattr: %.100s", strerror(errno)); failure = -1; } @@ -358,7 +383,7 @@ tty_parse_modes(int fd, int *n_bytes_ptr) case TTY_OP_ISPEED_PROTO2: n_bytes += 4; baud = packet_get_int(); - debug2("tty_parse_modes: ispeed %d", baud); + debug3("tty_parse_modes: ispeed %d", baud); if (failure != -1 && cfsetispeed(&tio, baud_to_speed(baud)) == -1) error("cfsetispeed failed for %d", baud); break; @@ -368,7 +393,7 @@ tty_parse_modes(int fd, int *n_bytes_ptr) case TTY_OP_OSPEED_PROTO2: n_bytes += 4; baud = packet_get_int(); - debug2("tty_parse_modes: ospeed %d", baud); + debug3("tty_parse_modes: ospeed %d", baud); if (failure != -1 && cfsetospeed(&tio, baud_to_speed(baud)) == -1) error("cfsetospeed failed for %d", baud); break; @@ -376,8 +401,8 @@ tty_parse_modes(int fd, int *n_bytes_ptr) #define TTYCHAR(NAME, OP) \ case OP: \ n_bytes += arg_size; \ - tio.c_cc[NAME] = get_arg(); \ - debug2("tty_parse_modes: %d %d", OP, tio.c_cc[NAME]); \ + tio.c_cc[NAME] = special_char_decode(get_arg()); \ + debug3("tty_parse_modes: %d %d", OP, tio.c_cc[NAME]); \ break; #define TTYMODE(NAME, FIELD, OP) \ case OP: \ @@ -386,7 +411,7 @@ tty_parse_modes(int fd, int *n_bytes_ptr) tio.FIELD |= NAME; \ else \ tio.FIELD &= ~NAME; \ - debug2("tty_parse_modes: %d %d", OP, arg); \ + debug3("tty_parse_modes: %d %d", OP, arg); \ break; #include "ttymodes.h" @@ -396,23 +421,23 @@ tty_parse_modes(int fd, int *n_bytes_ptr) 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). @@ -421,14 +446,13 @@ tty_parse_modes(int fd, int *n_bytes_ptr) * left in the packet; hopefully there is nothing * more coming after the mode data. */ - log("parse_tty_modes: unknown opcode %d", opcode); - packet_integrity_check(0, 1, SSH_CMSG_REQUEST_PTY); + logit("parse_tty_modes: unknown opcode %d", opcode); goto set; - } + } } else { /* * SSH2: - * Opcodes 0 to 159 are defined to have + * Opcodes 1 to 159 are defined to have * a uint32 argument. * Opcodes 160 to 255 are undefined and * cause parsing to stop. @@ -438,25 +462,24 @@ tty_parse_modes(int fd, int *n_bytes_ptr) (void) packet_get_int(); break; } else { - log("parse_tty_modes: unknown opcode %d", opcode); + logit("parse_tty_modes: unknown opcode %d", opcode); goto set; } - } + } } } set: if (*n_bytes_ptr != n_bytes) { *n_bytes_ptr = n_bytes; - log("parse_tty_modes: n_bytes_ptr != n_bytes: %d %d", + logit("parse_tty_modes: n_bytes_ptr != n_bytes: %d %d", *n_bytes_ptr, n_bytes); return; /* Don't process bytes passed */ } if (failure == -1) - return; /* Packet parsed ok but tty stuff failed */ + return; /* Packet parsed ok but tcgetattr() failed */ /* Set the new modes for the terminal. */ if (tcsetattr(fd, TCSANOW, &tio) == -1) - log("Setting tty modes failed: %.100s", strerror(errno)); - return; + logit("Setting tty modes failed: %.100s", strerror(errno)); }