<div dir="ltr">This got a bit out of hand. All I wanted to fix was the CR conversion to<br>get this part of <a href="https://tools.ietf.org/html/rfc854">https://tools.ietf.org/html/rfc854</a> right:<br><br>  Therefore, the sequence "CR LF" must be treated as a single "new<br>  line" character and used whenever their combined action is<br>  intended; the sequence "CR NUL" must be used where a carriage<br>  return alone is actually desired; and the CR character must be<br>  avoided in other contexts.  This rule gives assurance to systems<br>  which must decide whether to perform a "new line" function or a<br>  multiple-backspace that the TELNET stream contains a character<br>  following a CR that will allow a rational decision.<br><br>But to understand the code well enough to do that, and to fix it so that<br>it works when IAC or CR sequences are split across multiple reads, I<br>ended up rewriting a lot:<br><br>* Add punctuation in help.<br><br>* Remove duplicated #include.<br><br>* Remove some unnecessary globals, enlarge the global buffers, and keep<br>  state for correct IAC sequence processing across reads.<br><br>* Reduce code duplication and rewrite bits that made no sense.<br><br>* Handle entering/exiting raw mode more uniformly.<br><br>* Fix the prompt (the character count was wrong).<br><br>* Allow ^]^D (like BSD telnet) as well as ^]e to exit, and look less<br>  like we crashed when doing so.<br><br>* Simplify the IAC sequence handling, but more importantly work<br>  correctly when a sequence is split across multiple reads.<br><br>* Use more of the existing "x" functions from lib. (And remove code that<br>  was duplicating what the "x" functions they'd just called had already<br>  done.)<br><br>* Show "Connected to".<br><br>* Better signal handling.<br><br>I'm still not happy with TELOPT_ECHO and TELOPT_SGA in handle_wwdd(),<br>but don't (yet) understand them well enough to simplify them further. On<br>the bright side, I think TELOPT_NAWS is a lot clearer now.<br><br>It also occurs to me now I'm looking at the diff that although the IAC<br>output code is now better than it was, it probably still isn't pulling<br>its weight and might better be replaced by printf().<br><br>...but this patch has already gotten way out of hand!<br>---<br> toys/pending/telnet.c | 416 +++++++++++++++++++-----------------------<br> 1 file changed, 187 insertions(+), 229 deletions(-)<br></div>