diff options
Diffstat (limited to 'ttymodes.c')
-rw-r--r-- | ttymodes.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/ttymodes.c b/ttymodes.c index c32e213a4..cf4c7d5c6 100644 --- a/ttymodes.c +++ b/ttymodes.c | |||
@@ -241,6 +241,32 @@ baud_to_speed(int baud) | |||
241 | } | 241 | } |
242 | 242 | ||
243 | /* | 243 | /* |
244 | * Encode a special character into SSH line format. | ||
245 | */ | ||
246 | static u_int | ||
247 | special_char_encode(cc_t c) | ||
248 | { | ||
249 | #ifdef _POSIX_VDISABLE | ||
250 | if (c == _POSIX_VDISABLE) | ||
251 | return 255; | ||
252 | #endif /* _POSIX_VDISABLE */ | ||
253 | return c; | ||
254 | } | ||
255 | |||
256 | /* | ||
257 | * Decode a special character from SSH line format. | ||
258 | */ | ||
259 | static cc_t | ||
260 | special_char_decode(u_int c) | ||
261 | { | ||
262 | #ifdef _POSIX_VDISABLE | ||
263 | if (c == 255) | ||
264 | return _POSIX_VDISABLE; | ||
265 | #endif /* _POSIX_VDISABLE */ | ||
266 | return c; | ||
267 | } | ||
268 | |||
269 | /* | ||
244 | * Encodes terminal modes for the terminal referenced by fd | 270 | * Encodes terminal modes for the terminal referenced by fd |
245 | * or tiop in a portable manner, and appends the modes to a packet | 271 | * or tiop in a portable manner, and appends the modes to a packet |
246 | * being constructed. | 272 | * being constructed. |
@@ -287,7 +313,7 @@ tty_make_modes(int fd, struct termios *tiop) | |||
287 | #define TTYCHAR(NAME, OP) \ | 313 | #define TTYCHAR(NAME, OP) \ |
288 | debug3("tty_make_modes: %d %d", OP, tio.c_cc[NAME]); \ | 314 | debug3("tty_make_modes: %d %d", OP, tio.c_cc[NAME]); \ |
289 | buffer_put_char(&buf, OP); \ | 315 | buffer_put_char(&buf, OP); \ |
290 | put_arg(&buf, tio.c_cc[NAME]); | 316 | put_arg(&buf, special_char_encode(tio.c_cc[NAME])); |
291 | 317 | ||
292 | #define TTYMODE(NAME, FIELD, OP) \ | 318 | #define TTYMODE(NAME, FIELD, OP) \ |
293 | debug3("tty_make_modes: %d %d", OP, ((tio.FIELD & NAME) != 0)); \ | 319 | debug3("tty_make_modes: %d %d", OP, ((tio.FIELD & NAME) != 0)); \ |
@@ -375,7 +401,7 @@ tty_parse_modes(int fd, int *n_bytes_ptr) | |||
375 | #define TTYCHAR(NAME, OP) \ | 401 | #define TTYCHAR(NAME, OP) \ |
376 | case OP: \ | 402 | case OP: \ |
377 | n_bytes += arg_size; \ | 403 | n_bytes += arg_size; \ |
378 | tio.c_cc[NAME] = get_arg(); \ | 404 | tio.c_cc[NAME] = special_char_decode(get_arg()); \ |
379 | debug3("tty_parse_modes: %d %d", OP, tio.c_cc[NAME]); \ | 405 | debug3("tty_parse_modes: %d %d", OP, tio.c_cc[NAME]); \ |
380 | break; | 406 | break; |
381 | #define TTYMODE(NAME, FIELD, OP) \ | 407 | #define TTYMODE(NAME, FIELD, OP) \ |