From d11ec1d412439e6e3479bd4a075274291015893a Mon Sep 17 00:00:00 2001 From: deuce <> Date: Sat, 9 Feb 2008 01:42:02 +0000 Subject: [PATCH] More non-binary mode fixes. --- src/syncterm/telnet_io.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/syncterm/telnet_io.c b/src/syncterm/telnet_io.c index b3c8e1d931..e4ba712732 100644 --- a/src/syncterm/telnet_io.c +++ b/src/syncterm/telnet_io.c @@ -91,8 +91,8 @@ BYTE* telnet_interpret(BYTE* inbuf, int inlen, BYTE* outbuf, int *outlen) { BYTE command; BYTE option; - BYTE* first_iac; - BYTE* first_cr; + BYTE* first_cr=NULL; + BYTE* first_int=NULL; int i; if(inlen<1) { @@ -100,16 +100,22 @@ BYTE* telnet_interpret(BYTE* inbuf, int inlen, BYTE* outbuf, int *outlen) return(inbuf); /* no length? No interpretation */ } - first_iac=(BYTE*)memchr(inbuf, TELNET_IAC, inlen); - first_cr=(BYTE*)memchr(inbuf, '\r', inlen); + first_int=(BYTE*)memchr(inbuf, TELNET_IAC, inlen); + if(telnet_remote_option[TELNET_BINARY_TX]!=TELNET_WILL) { + first_cr=(BYTE*)memchr(inbuf, '\r', inlen); + if(first_cr) { + if(first_int==NULL || first_cr < first_int) + first_int=first_cr; + } + } - if(!telnet_cmdlen && first_iac==NULL && first_cr==NULL) { + if(!telnet_cmdlen && first_int==NULL) { *outlen=inlen; return(inbuf); /* no interpretation needed */ } - if(first_iac!=NULL) { - *outlen=first_iac-inbuf; + if(first_int!=NULL) { + *outlen=first_int-inbuf; memcpy(outbuf, inbuf, *outlen); } else *outlen=0; @@ -234,18 +240,19 @@ BYTE* telnet_interpret(BYTE* inbuf, int inlen, BYTE* outbuf, int *outlen) BYTE* telnet_expand(BYTE* inbuf, size_t inlen, BYTE* outbuf, size_t *newlen) { BYTE* first_iac; - BYTE* first_cr; + BYTE* first_cr=NULL; ulong i,outlen; first_iac=(BYTE*)memchr(inbuf, TELNET_IAC, inlen); - first_cr=(BYTE*)memchr(inbuf, '\r', inlen); + if(telnet_local_option[TELNET_BINARY_TX]!=TELNET_DO) + first_cr=(BYTE*)memchr(inbuf, '\r', inlen); if(first_iac==NULL && first_cr==NULL) { /* Nothing to expand */ *newlen=inlen; return(inbuf); } - if(first_iac!=NULL && first_iac < first_cr) + if(first_iac!=NULL && (first_cr==NULL || first_iac < first_cr)) outlen=first_iac-inbuf; else outlen=first_cr-inbuf; @@ -255,8 +262,10 @@ BYTE* telnet_expand(BYTE* inbuf, size_t inlen, BYTE* outbuf, size_t *newlen) if(inbuf[i]==TELNET_IAC) outbuf[outlen++]=TELNET_IAC; outbuf[outlen++]=inbuf[i]; - if(inbuf[i]=='\r') - outbuf[outlen++]='\n'; + if(telnet_local_option[TELNET_BINARY_TX]!=TELNET_DO) { + if(inbuf[i]=='\r') + outbuf[outlen++]='\n'; + } } *newlen=outlen; return(outbuf); -- GitLab