[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] [gnurl] 76/254: Telnet: Write full buffer instead of byte-b
From: |
gnunet |
Subject: |
[GNUnet-SVN] [gnurl] 76/254: Telnet: Write full buffer instead of byte-by-byte |
Date: |
Sat, 17 Jun 2017 16:51:48 +0200 |
This is an automated email from the git hooks/post-receive script.
ng0 pushed a commit to annotated tag gnurl-7.54.1
in repository gnurl.
commit 862b02f8947039e9a7f5d6ae47b547e3bf295988
Author: Richard Hsu <address@hidden>
AuthorDate: Tue Apr 4 19:26:29 2017 -0700
Telnet: Write full buffer instead of byte-by-byte
Previous TODO wanting to write in chunks. We should support writing more
at once since some TELNET servers may respond immediately upon first
byte written such as WHOIS servers.
Closes #1389
---
lib/telnet.c | 82 ++++++++++++++++++++++++++++++-------------------
tests/data/Makefile.inc | 2 +-
tests/data/test1399 | 43 ++++++++++++++++++++++++++
3 files changed, 95 insertions(+), 32 deletions(-)
diff --git a/lib/telnet.c b/lib/telnet.c
index dd93f3530..155d4b260 100644
--- a/lib/telnet.c
+++ b/lib/telnet.c
@@ -1220,43 +1220,63 @@ CURLcode telrcv(struct connectdata *conn,
}
/* Escape and send a telnet data block */
-/* TODO: write large chunks of data instead of one byte at a time */
static CURLcode send_telnet_data(struct connectdata *conn,
char *buffer, ssize_t nread)
{
- unsigned char outbuf[2];
- ssize_t bytes_written, total_written;
- int out_count;
+ ssize_t escapes, i, j, outlen;
+ unsigned char *outbuf = NULL;
CURLcode result = CURLE_OK;
+ ssize_t bytes_written, total_written;
- while(!result && nread--) {
- outbuf[0] = *buffer++;
- out_count = 1;
- if(outbuf[0] == CURL_IAC)
- outbuf[out_count++] = CURL_IAC;
-
- total_written = 0;
- do {
- /* Make sure socket is writable to avoid EWOULDBLOCK condition */
- struct pollfd pfd[1];
- pfd[0].fd = conn->sock[FIRSTSOCKET];
- pfd[0].events = POLLOUT;
- switch(Curl_poll(pfd, 1, -1)) {
- case -1: /* error, abort writing */
- case 0: /* timeout (will never happen) */
- result = CURLE_SEND_ERROR;
- break;
- default: /* write! */
- bytes_written = 0;
- result = Curl_write(conn, conn->sock[FIRSTSOCKET],
- outbuf+total_written, out_count-total_written,
- &bytes_written);
- total_written += bytes_written;
- break;
- }
- /* handle partial write */
- } while(!result && total_written < out_count);
+ /* Determine size of new buffer after escaping */
+ escapes = 0;
+ for(i = 0; i < nread; i++)
+ if((unsigned char)buffer[i] == CURL_IAC)
+ escapes++;
+ outlen = nread + escapes;
+
+ if(outlen == nread)
+ outbuf = (unsigned char *)buffer;
+ else {
+ outbuf = malloc(nread + escapes + 1);
+ if(!outbuf)
+ return CURLE_OUT_OF_MEMORY;
+
+ j = 0;
+ for(i = 0; i < nread; i++) {
+ outbuf[j++] = buffer[i];
+ if((unsigned char)buffer[i] == CURL_IAC)
+ outbuf[j++] = CURL_IAC;
+ }
+ outbuf[j] = '\0';
+ }
+
+ total_written = 0;
+ while(!result && total_written < outlen) {
+ /* Make sure socket is writable to avoid EWOULDBLOCK condition */
+ struct pollfd pfd[1];
+ pfd[0].fd = conn->sock[FIRSTSOCKET];
+ pfd[0].events = POLLOUT;
+ switch(Curl_poll(pfd, 1, -1)) {
+ case -1: /* error, abort writing */
+ case 0: /* timeout (will never happen) */
+ result = CURLE_SEND_ERROR;
+ break;
+ default: /* write! */
+ bytes_written = 0;
+ result = Curl_write(conn, conn->sock[FIRSTSOCKET],
+ outbuf + total_written,
+ outlen - total_written,
+ &bytes_written);
+ total_written += bytes_written;
+ break;
+ }
}
+
+ /* Free malloc copy if escaped */
+ if(outbuf != (unsigned char *)buffer)
+ free(outbuf);
+
return result;
}
diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc
index 9e573f6aa..94439bccd 100644
--- a/tests/data/Makefile.inc
+++ b/tests/data/Makefile.inc
@@ -146,7 +146,7 @@ test1364 test1365 test1366 test1367 test1368 test1369
test1370 test1371 \
test1372 test1373 test1374 test1375 test1376 test1377 test1378 test1379 \
test1380 test1381 test1382 test1383 test1384 test1385 test1386 test1387 \
test1388 test1389 test1390 test1391 test1392 test1393 test1394 test1395 \
-test1396 test1397 test1398 \
+test1396 test1397 test1398 test1399 \
\
test1400 test1401 test1402 test1403 test1404 test1405 test1406 test1407 \
test1408 test1409 test1410 test1411 test1412 test1413 test1414 test1415 \
diff --git a/tests/data/test1399 b/tests/data/test1399
new file mode 100644
index 000000000..830960532
--- /dev/null
+++ b/tests/data/test1399
@@ -0,0 +1,43 @@
+<testcase>
+<info>
+<keywords>
+TELNET
+UPLOAD
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+telnet
+</features>
+<name>
+TELNET check stdin to HTTP
+</name>
+<stdin>
+GET /we/want/1399 HTTP/1.0
+
+</stdin>
+<command option="no-output">
+telnet://%HOSTIP:%HTTPPORT
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<protocol>
+GET /we/want/1399 HTTP/1.0
+
+</protocol>
+</verify>
+</testcase>
--
To stop receiving notification emails like this one, please contact
address@hidden
- [GNUnet-SVN] [gnurl] 189/254: examples/sampleconv.c: indent changes, made callbacks static, (continued)
- [GNUnet-SVN] [gnurl] 189/254: examples/sampleconv.c: indent changes, made callbacks static, gnunet, 2017/06/17
- [GNUnet-SVN] [gnurl] 82/254: CURLINFO_EFFECTIVE_URL.3: add example, gnunet, 2017/06/17
- [GNUnet-SVN] [gnurl] 56/254: file: use private buffer for C-L output, gnunet, 2017/06/17
- [GNUnet-SVN] [gnurl] 166/254: redirect: store the "would redirect to" URL when max redirs is reached, gnunet, 2017/06/17
- [GNUnet-SVN] [gnurl] 154/254: RELEASE-NOTES: synced with 052a14e3c, gnunet, 2017/06/17
- [GNUnet-SVN] [gnurl] 252/254: mk-lib1521.pl: updated to match the test changes in 916ec30a, gnunet, 2017/06/17
- [GNUnet-SVN] [gnurl] 204/254: coverage: run event tests too, gnunet, 2017/06/17
- [GNUnet-SVN] [gnurl] 25/254: nss: factorize out nss_{un, }load_module to separate fncs, gnunet, 2017/06/17
- [GNUnet-SVN] [gnurl] 138/254: curl: show the libcurl release date in --version output, gnunet, 2017/06/17
- [GNUnet-SVN] [gnurl] 88/254: schannel: return a more specific error code for SEC_E_UNTRUSTED_ROOT, gnunet, 2017/06/17
- [GNUnet-SVN] [gnurl] 76/254: Telnet: Write full buffer instead of byte-by-byte,
gnunet <=
- [GNUnet-SVN] [gnurl] 146/254: darwinssl: Fix exception when processing a client-side certificate file if no error was raised by the API but the SecIdentityRef was null, gnunet, 2017/06/17
- [GNUnet-SVN] [gnurl] 101/254: opts: examples added to 8 more libcurl option man pages, gnunet, 2017/06/17
- [GNUnet-SVN] [gnurl] 130/254: pipeline: fix mistakenly trying to pipeline POSTs, gnunet, 2017/06/17
- [GNUnet-SVN] [gnurl] 165/254: LDAP: fixed checksrc issue, gnunet, 2017/06/17
- [GNUnet-SVN] [gnurl] 90/254: sockfilt.c: shortened too long line, gnunet, 2017/06/17
- [GNUnet-SVN] [gnurl] 136/254: lib510: don't write past the end of the buffer if it's too small, gnunet, 2017/06/17
- [GNUnet-SVN] [gnurl] 21/254: transfer: remove 'uploadbuf' pointer and cleanup readwrite_upload(), gnunet, 2017/06/17
- [GNUnet-SVN] [gnurl] 96/254: docs/opts: 23 more man pages now have examples, gnunet, 2017/06/17
- [GNUnet-SVN] [gnurl] 110/254: RELEASE-NOTES: synced with e3f84efc32d6b01a, gnunet, 2017/06/17
- [GNUnet-SVN] [gnurl] 117/254: tests: updated for modified fake random, gnunet, 2017/06/17