Closes https://bugs.busybox.net/show_bug.cgi?id=11976
Adds a new flag in telnet client's command line, which forces telnet to send IAC's instead of the traditional special characters (backspace, newline etc..). This code is similar to putty's code, and is added for compatibility with older telnet servers. Currently only backspace is supported, I will add support for other characters soon. Signed-off-by: Martin Lewis <martin.lewis....@gmail.com> --- networking/telnet.c | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/networking/telnet.c b/networking/telnet.c index fa16287..b6bebdc 100644 --- a/networking/telnet.c +++ b/networking/telnet.c @@ -120,6 +120,7 @@ struct globals { byte charmode; byte telflags; byte do_termios; + byte keyboard_special_cmds; #if ENABLE_FEATURE_TELNET_TTYPE char *ttype; #endif @@ -175,6 +176,7 @@ static void con_escape(void) full_write1_str("\r\nConsole escape. Commands are:\r\n\n" " l go to line mode\r\n" " c go to character mode\r\n" + " k toggle keyboard sends telnet special commands\r\n" " z suspend telnet\r\n" " e exit telnet\r\n"); @@ -194,6 +196,9 @@ static void con_escape(void) goto ret; } break; + case 'k': + G.keyboard_special_cmds = !G.keyboard_special_cmds; + break; case 'z': cookmode(); kill(0, SIGTSTP); @@ -220,15 +225,16 @@ static void handle_net_output(int len) while (src < end) { byte c = *src++; - if (c == 0x1d) { + switch (c) { + case 0x1d: con_escape(); return; - } - *dst = c; - if (c == IAC) + case IAC: + *dst = c; *++dst = c; /* IAC -> IAC IAC */ - else - if (c == '\r' || c == '\n') { + break; + case '\r': + case '\n': /* Enter key sends '\r' in raw mode and '\n' in cooked one. * * See RFC 1123 3.3.1 Telnet End-of-Line Convention. @@ -237,6 +243,28 @@ static void handle_net_output(int len) */ *dst = '\r'; /* Enter -> CR LF */ *++dst = '\n'; + break; + + case 0x08: /* ctrl+h */ + case 0x7f: /* backspace */ + if (G.keyboard_special_cmds) { + *dst = IAC; + *++dst = EC; + break; + } + /* fall through */ + + case 0x03: /* ctrl+c */ + if (G.keyboard_special_cmds) { + *dst = IAC; + *++dst = IP; + break; + } + /* fall through */ + + default: + *dst = c; + break; } dst++; } -- 1.9.1 _______________________________________________ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox