aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2012-09-17 11:54:35 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2012-09-17 11:54:35 +0200
commit0ffd63ca9a46d1e9112e12702e4337195eade25d (patch)
tree30730bb09bcedf3fe869b2620a480bc7f3740af8
parent57f07bfcb276777f9ea85df7d09ae005a0231464 (diff)
downloadbusybox-w32-0ffd63ca9a46d1e9112e12702e4337195eade25d.tar.gz
busybox-w32-0ffd63ca9a46d1e9112e12702e4337195eade25d.tar.bz2
busybox-w32-0ffd63ca9a46d1e9112e12702e4337195eade25d.zip
telnet: convert Enter -> CR LF in line mode too
function old new delta handle_net_output 87 98 +11 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--networking/telnet.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/networking/telnet.c b/networking/telnet.c
index b700fbed9..58a691916 100644
--- a/networking/telnet.c
+++ b/networking/telnet.c
@@ -187,27 +187,34 @@ static void con_escape(void)
187static void handle_net_output(int len) 187static void handle_net_output(int len)
188{ 188{
189 byte outbuf[2 * DATABUFSIZE]; 189 byte outbuf[2 * DATABUFSIZE];
190 byte *p = (byte*)G.buf; 190 byte *dst = outbuf;
191 int j = 0; 191 byte *src = (byte*)G.buf;
192 byte *end = src + len;
192 193
193 for (; len > 0; len--, p++) { 194 while (src < end) {
194 byte c = *p; 195 byte c = *src++;
195 if (c == 0x1d) { 196 if (c == 0x1d) {
196 con_escape(); 197 con_escape();
197 return; 198 return;
198 } 199 }
199 outbuf[j++] = c; 200 *dst = c;
200 if (c == IAC) 201 if (c == IAC)
201 outbuf[j++] = c; /* IAC -> IAC IAC */ 202 *++dst = c; /* IAC -> IAC IAC */
202 else if (c == '\r') 203 else
203 /* See RFC 1123 3.3.1 Telnet End-of-Line Convention. 204 if (c == '\r' || c == '\n') {
205 /* Enter key sends '\r' in raw mode and '\n' in cooked one.
206 *
207 * See RFC 1123 3.3.1 Telnet End-of-Line Convention.
204 * Using CR LF instead of other allowed possibilities 208 * Using CR LF instead of other allowed possibilities
205 * like CR NUL - easier to talk to HTTP/SMTP servers. 209 * like CR NUL - easier to talk to HTTP/SMTP servers.
206 */ 210 */
207 outbuf[j++] = '\n'; /* CR -> CR LF */ 211 *dst = '\r'; /* Enter -> CR LF */
212 *++dst = '\n';
213 }
214 dst++;
208 } 215 }
209 if (j > 0) 216 if (dst - outbuf != 0)
210 full_write(netfd, outbuf, j); 217 full_write(netfd, outbuf, dst - outbuf);
211} 218}
212 219
213static void handle_net_input(int len) 220static void handle_net_input(int len)