[PATCH] telnet: added support for special telnet characters

Martin Lewis martin.lewis.x84 at gmail.com
Sun Jul 7 14:38:01 UTC 2019


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.x84 at 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



More information about the busybox mailing list