[PATCH] telnet: added support for special telnet characters
Martin Lewis
martin.lewis.x84 at gmail.com
Tue Oct 15 16:27:56 UTC 2019
A friendly ping for an old patch.
On Mon, 8 Jul 2019 at 09:37, Martin Lewis <martin.lewis.x84 at gmail.com> wrote:
>
> 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