diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-11-07 01:58:21 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-11-07 01:58:21 +0000 |
commit | b0150d299f80b8d0245bd419c78a40a013f03e0c (patch) | |
tree | 0449221895dbf671cecf7f3d5b79d9c6b234a4e5 /networking | |
parent | 4f7d90f1c75c9cc379436e04a80c9440525eedcc (diff) | |
download | busybox-b0150d299f80b8d0245bd419c78a40a013f03e0c.tar.gz |
telnetd: handle emacs M-DEL and IAC-NOP (putty keepalive)
by Jim Cathey (jcathey AT ciena.com)
function old new delta
telnetd_main 1314 1364 +50
Diffstat (limited to 'networking')
-rw-r--r-- | networking/telnetd.c | 71 |
1 files changed, 41 insertions, 30 deletions
diff --git a/networking/telnetd.c b/networking/telnetd.c index efc2bf607..f60c42056 100644 --- a/networking/telnetd.c +++ b/networking/telnetd.c @@ -96,44 +96,55 @@ remove_iacs(struct tsession *ts, int *pnum_totty) *totty++ = c; ptr++; - /* We now map \r\n ==> \r for pragmatic reasons. + /* We map \r\n ==> \r for pragmatic reasons. * Many client implementations send \r\n when * the user hits the CarriageReturn key. */ if (c == '\r' && ptr < end && (*ptr == '\n' || *ptr == '\0')) ptr++; - } else { - /* - * TELOPT_NAWS support! - */ - if ((ptr+2) >= end) { - /* only the beginning of the IAC is in the - buffer we were asked to process, we can't - process this char. */ - break; - } + continue; + } - /* - * IAC -> SB -> TELOPT_NAWS -> 4-byte -> IAC -> SE - */ - else if (ptr[1] == SB && ptr[2] == TELOPT_NAWS) { - struct winsize ws; - - if ((ptr+8) >= end) - break; /* incomplete, can't process */ - ws.ws_col = (ptr[3] << 8) | ptr[4]; - ws.ws_row = (ptr[5] << 8) | ptr[6]; - ioctl(ts->ptyfd, TIOCSWINSZ, (char *)&ws); - ptr += 9; - } else { - /* skip 3-byte IAC non-SB cmd */ + if ((ptr+1) >= end) + break; + if (ptr[1] == NOP) { /* Ignore? (putty keepalive, etc.) */ + ptr += 2; + continue; + } + if (ptr[1] == IAC) { /* Literal IAC? (emacs M-DEL) */ + *totty++ = ptr[1]; + ptr += 2; + continue; + } + + /* + * TELOPT_NAWS support! + */ + if ((ptr+2) >= end) { + /* only the beginning of the IAC is in the + buffer we were asked to process, we can't + process this char. */ + break; + } + /* + * IAC -> SB -> TELOPT_NAWS -> 4-byte -> IAC -> SE + */ + if (ptr[1] == SB && ptr[2] == TELOPT_NAWS) { + struct winsize ws; + if ((ptr+8) >= end) + break; /* incomplete, can't process */ + ws.ws_col = (ptr[3] << 8) | ptr[4]; + ws.ws_row = (ptr[5] << 8) | ptr[6]; + ioctl(ts->ptyfd, TIOCSWINSZ, (char *)&ws); + ptr += 9; + continue; + } + /* skip 3-byte IAC non-SB cmd */ #if DEBUG - fprintf(stderr, "Ignoring IAC %s,%s\n", - TELCMD(ptr[1]), TELOPT(ptr[2])); + fprintf(stderr, "Ignoring IAC %s,%s\n", + TELCMD(ptr[1]), TELOPT(ptr[2])); #endif - ptr += 3; - } - } + ptr += 3; } num_totty = totty - ptr0; |