[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