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