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
This commit is contained in:
Denis Vlasenko 2008-11-07 01:58:21 +00:00
parent 4f7d90f1c7
commit b0150d299f

View File

@ -96,13 +96,27 @@ 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 {
continue;
}
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!
*/
@ -112,20 +126,19 @@ remove_iacs(struct tsession *ts, int *pnum_totty)
process this char. */
break;
}
/*
* IAC -> SB -> TELOPT_NAWS -> 4-byte -> IAC -> SE
*/
else if (ptr[1] == SB && ptr[2] == TELOPT_NAWS) {
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 {
continue;
}
/* skip 3-byte IAC non-SB cmd */
#if DEBUG
fprintf(stderr, "Ignoring IAC %s,%s\n",
@ -133,8 +146,6 @@ remove_iacs(struct tsession *ts, int *pnum_totty)
#endif
ptr += 3;
}
}
}
num_totty = totty - ptr0;
*pnum_totty = num_totty;