summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/curl.18
-rw-r--r--docs/libcurl/curl_easy_setopt.32
-rw-r--r--docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.343
-rw-r--r--docs/libcurl/opts/Makefile.am19
-rw-r--r--lib/tftp.c2
-rw-r--r--src/tool_cfgable.h1
-rw-r--r--src/tool_getparam.c4
-rw-r--r--src/tool_help.c3
-rw-r--r--src/tool_operate.c4
-rw-r--r--tests/data/Makefile.inc2
-rw-r--r--tests/data/test124243
-rw-r--r--tests/data/test124344
12 files changed, 155 insertions, 20 deletions
diff --git a/docs/curl.1 b/docs/curl.1
index 37088ea2a..0b0f4d29d 100644
--- a/docs/curl.1
+++ b/docs/curl.1
@@ -1730,6 +1730,14 @@ default 512 bytes will be used.
If this option is used several times, the last one will be used.
(Added in 7.20.0)
+.IP "--tftp-no-options"
+(TFTP) Tells curl not to send TFTP options requests.
+
+This option improves interop with some legacy servers that do not acknowledge
+or properly implement TFTP options. When this option is used
+\fI--tftp-blksize\fP is ignored.
+
+(Added in 7.48.0)
.IP "--tlsauthtype <authtype>"
Set TLS authentication type. Currently, the only supported option is "SRP",
for TLS-SRP (RFC 5054). If \fI--tlsuser\fP and \fI--tlspassword\fP are
diff --git a/docs/libcurl/curl_easy_setopt.3 b/docs/libcurl/curl_easy_setopt.3
index 3a82024a3..60d549272 100644
--- a/docs/libcurl/curl_easy_setopt.3
+++ b/docs/libcurl/curl_easy_setopt.3
@@ -315,7 +315,7 @@ Authentication address. See \fICURLOPT_MAIL_AUTH(3)\fP
.IP CURLOPT_TFTP_BLKSIZE
TFTP block size. See \fICURLOPT_TFTP_BLKSIZE(3)\fP
.IP CURLOPT_TFTP_NO_OPTIONS
-Prevents TFTP options to be send with RRQs/WRQs. See \fICURLOPT_TFTP_NO_OPTIONS(3)\fP
+Do not send TFTP options requests. See \fICURLOPT_TFTP_NO_OPTIONS(3)\fP
.SH FTP OPTIONS
.IP CURLOPT_FTPPORT
Use active FTP. See \fICURLOPT_FTPPORT(3)\fP
diff --git a/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3 b/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3
index 0e31a2937..53b1770be 100644
--- a/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3
+++ b/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3
@@ -20,24 +20,51 @@
.\" *
.\" **************************************************************************
.\"
-.TH CURLOPT_TFTP_NO_OPTIONS 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
+.TH CURLOPT_TFTP_NO_OPTIONS 3 "23 Feb 2016" "libcurl 7.48.0" "curl_easy_setopt options"
.SH NAME
-CURLOPT_TFTP_NO_OPTIONS \- Prevents TFTP options to be send with RRQs/WRQs
+CURLOPT_TFTP_NO_OPTIONS \- Do not send TFTP options requests.
.SH SYNOPSIS
#include <curl/curl.h>
-CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TFTP_NO_OPTIONS, long sendoptions);
+CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TFTP_NO_OPTIONS, long onoff);
.SH DESCRIPTION
-Set \fIsendoptions\fP to 1 to exclude all TFTP options defined in RFC2347,
-RFC2348, RFC2349 from read and write requests.
-libcurl will behave like a client implementing only RFC1350, ignoring any
-protocol extensions.
+Set \fIonoff\fP to 1L to exclude all TFTP options defined in RFC2347, RFC2348
+and RFC2349 from read and write requests (RRQs/WRQs).
+
+This option improves interop with some legacy servers that do not acknowledge
+or properly implement TFTP options. When this option is used
+\fICURLOPT_TFTP_BLKSIZE(3)\fP is ignored.
.SH DEFAULT
0
.SH PROTOCOLS
TFTP
.SH EXAMPLE
-TODO
+.nf
+size_t write_callback(char *ptr, size_t size, size_t nmemb, void *fp)
+{
+ return fwrite(ptr, size, nmemb, (FILE *)fp);
+}
+
+CURL *curl = curl_easy_init();
+if(curl) {
+ FILE *fp = fopen("foo.bin", "wb");
+ if(fp) {
+ curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)fp);
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
+
+ curl_easy_setopt(curl, CURLOPT_URL, "tftp://example.com/foo.bin");
+
+ /* do not send TFTP options requests */
+ curl_easy_setopt(curl, CURLOPT_TFTP_NO_OPTIONS, 1L);
+
+ /* Perform the request */
+ curl_easy_perform(curl);
+
+ fclose(fp);
+ }
+ curl_easy_cleanup(curl);
+}
+.fi
.SH AVAILABILITY
Added in 7.48.0
.SH RETURN VALUE
diff --git a/docs/libcurl/opts/Makefile.am b/docs/libcurl/opts/Makefile.am
index 5c35ef92a..04f8b4bbe 100644
--- a/docs/libcurl/opts/Makefile.am
+++ b/docs/libcurl/opts/Makefile.am
@@ -97,11 +97,12 @@ man_MANS = CURLOPT_ACCEPT_ENCODING.3 CURLOPT_ACCEPTTIMEOUT_MS.3 \
CURLOPT_SSL_VERIFYPEER.3 CURLOPT_SSL_VERIFYSTATUS.3 \
CURLOPT_SSLVERSION.3 CURLOPT_STDERR.3 CURLOPT_TCP_KEEPALIVE.3 \
CURLOPT_TCP_KEEPIDLE.3 CURLOPT_TCP_KEEPINTVL.3 CURLOPT_TCP_NODELAY.3 \
- CURLOPT_TELNETOPTIONS.3 CURLOPT_TFTP_BLKSIZE.3 CURLOPT_TIMECONDITION.3 \
- CURLOPT_TIMEOUT.3 CURLOPT_TIMEOUT_MS.3 CURLOPT_TIMEVALUE.3 \
- CURLOPT_TLSAUTH_PASSWORD.3 CURLOPT_TLSAUTH_TYPE.3 \
- CURLOPT_TLSAUTH_USERNAME.3 CURLOPT_TRANSFER_ENCODING.3 \
- CURLOPT_TRANSFERTEXT.3 CURLOPT_UNRESTRICTED_AUTH.3 CURLOPT_UPLOAD.3 \
+ CURLOPT_TELNETOPTIONS.3 CURLOPT_TFTP_BLKSIZE.3 \
+ CURLOPT_TFTP_NO_OPTIONS.3 CURLOPT_TIMECONDITION.3 CURLOPT_TIMEOUT.3 \
+ CURLOPT_TIMEOUT_MS.3 CURLOPT_TIMEVALUE.3 CURLOPT_TLSAUTH_PASSWORD.3 \
+ CURLOPT_TLSAUTH_TYPE.3 CURLOPT_TLSAUTH_USERNAME.3 \
+ CURLOPT_TRANSFER_ENCODING.3 CURLOPT_TRANSFERTEXT.3 \
+ CURLOPT_UNRESTRICTED_AUTH.3 CURLOPT_UPLOAD.3 \
CURLOPT_URL.3 CURLOPT_USERAGENT.3 CURLOPT_USERNAME.3 CURLOPT_USERPWD.3 \
CURLOPT_USE_SSL.3 CURLOPT_VERBOSE.3 CURLOPT_WILDCARDMATCH.3 \
CURLOPT_WRITEDATA.3 CURLOPT_WRITEFUNCTION.3 CURLOPT_XFERINFODATA.3 \
@@ -224,8 +225,9 @@ HTMLPAGES = CURLOPT_ACCEPT_ENCODING.html CURLOPT_ACCEPTTIMEOUT_MS.html \
CURLOPT_SSLVERSION.html CURLOPT_STDERR.html CURLOPT_TCP_KEEPALIVE.html \
CURLOPT_TCP_KEEPIDLE.html CURLOPT_TCP_KEEPINTVL.html \
CURLOPT_TCP_NODELAY.html CURLOPT_TELNETOPTIONS.html \
- CURLOPT_TFTP_BLKSIZE.html CURLOPT_TIMECONDITION.html \
- CURLOPT_TIMEOUT.html CURLOPT_TIMEOUT_MS.html CURLOPT_TIMEVALUE.html \
+ CURLOPT_TFTP_BLKSIZE.html CURLOPT_TFTP_NO_OPTIONS.html \
+ CURLOPT_TIMECONDITION.html CURLOPT_TIMEOUT.html \
+ CURLOPT_TIMEOUT_MS.html CURLOPT_TIMEVALUE.html \
CURLOPT_TLSAUTH_PASSWORD.html CURLOPT_TLSAUTH_TYPE.html \
CURLOPT_TLSAUTH_USERNAME.html CURLOPT_TRANSFER_ENCODING.html \
CURLOPT_TRANSFERTEXT.html CURLOPT_UNRESTRICTED_AUTH.html \
@@ -354,7 +356,8 @@ PDFPAGES = CURLOPT_ACCEPT_ENCODING.pdf CURLOPT_ACCEPTTIMEOUT_MS.pdf \
CURLOPT_SSLVERSION.pdf CURLOPT_STDERR.pdf CURLOPT_TCP_KEEPALIVE.pdf \
CURLOPT_TCP_KEEPIDLE.pdf CURLOPT_TCP_KEEPINTVL.pdf \
CURLOPT_TCP_NODELAY.pdf CURLOPT_TELNETOPTIONS.pdf \
- CURLOPT_TFTP_BLKSIZE.pdf CURLOPT_TIMECONDITION.pdf CURLOPT_TIMEOUT.pdf \
+ CURLOPT_TFTP_BLKSIZE.pdf CURLOPT_TFTP_NO_OPTIONS.pdf \
+ CURLOPT_TIMECONDITION.pdf CURLOPT_TIMEOUT.pdf \
CURLOPT_TIMEOUT_MS.pdf CURLOPT_TIMEVALUE.pdf \
CURLOPT_TLSAUTH_PASSWORD.pdf CURLOPT_TLSAUTH_TYPE.pdf \
CURLOPT_TLSAUTH_USERNAME.pdf CURLOPT_TRANSFER_ENCODING.pdf \
diff --git a/lib/tftp.c b/lib/tftp.c
index eec774b3e..f44733944 100644
--- a/lib/tftp.c
+++ b/lib/tftp.c
@@ -978,7 +978,7 @@ static CURLcode tftp_connect(struct connectdata *conn, bool *done)
return CURLE_OUT_OF_MEMORY;
}
- /* we don't keep TFTP connections up bascially because there's none or very
+ /* we don't keep TFTP connections up basically because there's none or very
* little gain for UDP */
connclose(conn, "TFTP");
diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h
index 3632560af..fb6c7aec4 100644
--- a/src/tool_cfgable.h
+++ b/src/tool_cfgable.h
@@ -183,6 +183,7 @@ struct OperationConfig {
char *ftp_alternative_to_user; /* send command if USER/PASS fails */
int ftp_filemethod;
long tftp_blksize; /* TFTP BLKSIZE option */
+ bool tftp_no_options; /* do not send TFTP options requests */
bool ignorecl; /* --ignore-content-length */
bool disable_sessionid;
diff --git a/src/tool_getparam.c b/src/tool_getparam.c
index 164881a57..61f50464b 100644
--- a/src/tool_getparam.c
+++ b/src/tool_getparam.c
@@ -180,6 +180,7 @@ static const struct LongShort aliases[]= {
{"$P", "service-name", TRUE},
{"$Q", "proto-default", TRUE},
{"$R", "expect100-timeout", TRUE},
+ {"$S", "tftp-no-options", FALSE},
{"0", "http1.0", FALSE},
{"01", "http1.1", FALSE},
{"02", "http2", FALSE},
@@ -1005,6 +1006,9 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
if(err)
return err;
break;
+ case 'S': /* --tftp-no-options */
+ config->tftp_no_options = toggle;
+ break;
}
break;
case '#': /* --progress-bar */
diff --git a/src/tool_help.c b/src/tool_help.c
index 1af1ad100..a1a6fb493 100644
--- a/src/tool_help.c
+++ b/src/tool_help.c
@@ -221,7 +221,8 @@ static const char *const helptext[] = {
" --tcp-nodelay Use the TCP_NODELAY option",
" -t, --telnet-option OPT=VAL Set telnet option",
" --tftp-blksize VALUE Set TFTP BLKSIZE option (must be >512)",
- " -z, --time-cond TIME Transfer based on a time condition",
+ " --tftp-no-options Do not send TFTP options requests",
+ " -z, --time-cond TIME Transfer based on a time condition",
" -1, --tlsv1 Use >= TLSv1 (SSL)",
" --tlsv1.0 Use TLSv1.0 (SSL)",
" --tlsv1.1 Use TLSv1.1 (SSL)",
diff --git a/src/tool_operate.c b/src/tool_operate.c
index 69d60769d..29e0df8c2 100644
--- a/src/tool_operate.c
+++ b/src/tool_operate.c
@@ -1354,6 +1354,10 @@ static CURLcode operate_do(struct GlobalConfig *global,
my_setopt_str(curl, CURLOPT_EXPECT_100_TIMEOUT_MS,
(long)(config->expect100timeout*1000));
+ /* new in 7.48.0 */
+ if(config->tftp_no_options)
+ my_setopt(curl, CURLOPT_TFTP_NO_OPTIONS, 1L);
+
/* initialize retry vars for loop below */
retry_sleep_default = (config->retry_delay) ?
config->retry_delay*1000L : RETRY_SLEEP_DEFAULT; /* ms */
diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc
index f3fa8cd9c..a13aac9b9 100644
--- a/tests/data/Makefile.inc
+++ b/tests/data/Makefile.inc
@@ -126,7 +126,7 @@ test1208 test1209 test1210 test1211 test1212 test1213 test1214 test1215 \
test1216 test1217 test1218 test1219 \
test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 \
test1228 test1229 test1230 test1231 test1232 test1233 test1234 test1235 \
-test1236 test1237 test1238 test1239 test1240 test1241 \
+test1236 test1237 test1238 test1239 test1240 test1241 test1242 test1243 \
\
test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \
test1308 test1309 test1310 test1311 test1312 test1313 test1314 test1315 \
diff --git a/tests/data/test1242 b/tests/data/test1242
new file mode 100644
index 000000000..c8bc3d4ac
--- /dev/null
+++ b/tests/data/test1242
@@ -0,0 +1,43 @@
+<testcase>
+<info>
+<keywords>
+TFTP
+TFTP RRQ
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+a chunk of
+data
+returned
+ to client
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+tftp
+</server>
+ <name>
+TFTP retrieve without TFTP options requests
+ </name>
+ <command>
+tftp://%HOSTIP:%TFTPPORT//1242 --tftp-no-options --trace-ascii log/traceit
+</command>
+</client>
+
+#
+# Verify pseudo protocol after the test has been "shot"
+<verify>
+<protocol>
+opcode: 1
+mode: octet
+filename: /1242
+</protocol>
+</verify>
+</testcase>
diff --git a/tests/data/test1243 b/tests/data/test1243
new file mode 100644
index 000000000..0303a5de4
--- /dev/null
+++ b/tests/data/test1243
@@ -0,0 +1,44 @@
+<testcase>
+<info>
+<keywords>
+TFTP
+TFTP WRQ
+</keywords>
+</info>
+
+#
+# Client-side
+<client>
+<server>
+tftp
+</server>
+ <name>
+TFTP send without TFTP options requests
+ </name>
+ <command>
+-T log/test1243.txt tftp://%HOSTIP:%TFTPPORT// --tftp-no-options --trace-ascii log/traceit
+</command>
+<file name="log/test1243.txt">
+a chunk of
+data
+sent
+ to server
+</file>
+</client>
+
+#
+# Verify pseudo protocol after the test has been "shot"
+<verify>
+<upload>
+a chunk of
+data
+sent
+ to server
+</upload>
+<protocol>
+opcode: 2
+mode: octet
+filename: /test1243.txt
+</protocol>
+</verify>
+</testcase>