From: simon Date: Sat, 11 Mar 2000 14:25:35 +0000 (+0000) Subject: Robert de Bath's patch: when the user presses CR, the Telnet backend X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/commitdiff_plain/eb5e1db9a06a5daf08aca8aba34529d48641cdcb Robert de Bath's patch: when the user presses CR, the Telnet backend now sends NVT `NL' (CR,LF) instead of NVT `CR' (CR,NUL). Unix telnetd apparently cares not a jot for the difference, but others do. git-svn-id: svn://svn.tartarus.org/sgt/putty@407 cda61777-01e9-0310-a592-d414129be87e --- diff --git a/telnet.c b/telnet.c index 7dd7f1ee..1cd4df47 100644 --- a/telnet.c +++ b/telnet.c @@ -575,6 +575,15 @@ static char *telnet_init (HWND hwnd, char *host, int port, char **realhost) { /* * Initialise option states. */ + if( cfg.ldisc_term ) + { + struct Opt **o; + + for (o = opts; *o; o++) + if ((*o)->state == REQUESTED) + (*o)->state = INACTIVE; + } + else { struct Opt **o; @@ -666,19 +675,41 @@ static void telnet_send (char *buf, int len) { char *p; static unsigned char iac[2] = { IAC, IAC }; static unsigned char cr[2] = { CR, NUL }; + static unsigned char nl[2] = { CR, LF }; if (s == INVALID_SOCKET) return; p = buf; - while (p < buf+len) { + if (cfg.ldisc_term) { + while (p < buf+len) { + char *q = p; + unsigned char * cstr = 0; + while (p < buf+len) { + if ((unsigned char)*p == IAC) { + cstr = iac; + break; + } + if (*p == '\r') { + if( p+1 >= buf+len || ( p[1] != '\n' && p[1] != '\0')) + { + cstr = cr; + break; + } + } + p++; + } + if (p!=q) s_write (q, p-q); + if (cstr) s_write (cstr,2), p++; + } + } else while (p < buf+len) { char *q = p; while (iswritable((unsigned char)*p) && p < buf+len) p++; s_write (q, p-q); while (p < buf+len && !iswritable((unsigned char)*p)) { - s_write ((unsigned char)*p == IAC ? iac : cr, 2); + s_write ((unsigned char)*p == IAC ? iac : nl, 2); p++; } }