aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2012-09-13 13:00:49 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2012-09-13 13:00:49 +0200
commitaca464ddac4b86211f138203c4a1d1e3c69a2230 (patch)
treeaf8f65a58178d112d902f856ad081af7ca7d3e71
parent6d463de46b418e6c4c8d1397033608f78b33ab21 (diff)
downloadbusybox-aca464ddac4b86211f138203c4a1d1e3c69a2230.tar.gz
telnet: convert CR -> CR LF, not CR -> CR NUL when sending data to server
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--networking/telnet.c22
-rw-r--r--networking/telnetd.c1
2 files changed, 6 insertions, 17 deletions
diff --git a/networking/telnet.c b/networking/telnet.c
index e8e51dce4..7081a6a41 100644
--- a/networking/telnet.c
+++ b/networking/telnet.c
@@ -186,22 +186,6 @@ static void con_escape(void)
static void handle_net_output(int len)
{
- /* here we could do smart tricks how to handle 0xFF:s in output
- * stream like writing twice every sequence of FF:s (thus doing
- * many write()s. But I think interactive telnet application does
- * not need to be 100% 8-bit clean, so changing every 0xff:s to
- * 0x7f:s
- *
- * 2002-mar-21, Przemyslaw Czerpak (druzus@polbox.com)
- * I don't agree.
- * first - I cannot use programs like sz/rz
- * second - the 0x0D is sent as one character and if the next
- * char is 0x0A then it's eaten by a server side.
- * third - why do you have to make 'many write()s'?
- * I don't understand.
- * So I implemented it. It's really useful for me. I hope that
- * other people will find it interesting too.
- */
byte outbuf[2 * DATABUFSIZE];
byte *p = (byte*)G.buf;
int j = 0;
@@ -216,7 +200,11 @@ static void handle_net_output(int len)
if (c == IAC)
outbuf[j++] = c; /* IAC -> IAC IAC */
else if (c == '\r')
- outbuf[j++] = '\0'; /* CR -> CR NUL */
+ /* See RFC 1123 3.3.1 Telnet End-of-Line Convention.
+ * Using CR LF instead of other allowed possibilities
+ * like CR NUL - easier to talk to HTTP/SMTP servers.
+ */
+ outbuf[j++] = '\n'; /* CR -> CR LF */
}
if (j > 0)
full_write(netfd, outbuf, j);
diff --git a/networking/telnetd.c b/networking/telnetd.c
index 33020f1b4..9e7a84cce 100644
--- a/networking/telnetd.c
+++ b/networking/telnetd.c
@@ -125,6 +125,7 @@ remove_iacs(struct tsession *ts, int *pnum_totty)
/* We map \r\n ==> \r for pragmatic reasons.
* Many client implementations send \r\n when
* the user hits the CarriageReturn key.
+ * See RFC 1123 3.3.1 Telnet End-of-Line Convention.
*/
if (c == '\r' && ptr < end && (*ptr == '\n' || *ptr == '\0'))
ptr++;