From 186546f1c5ffa62526bd57deb5b9fd6e68da2a5e Mon Sep 17 00:00:00 2001 From: Jay Satiro Date: Mon, 24 Aug 2015 00:15:01 -0400 Subject: TFTP: add option to suppress TFTP option requests (Part 2) - Add tests. - Add an example to CURLOPT_TFTP_NO_OPTIONS.3. - Add --tftp-no-options to expose CURLOPT_TFTP_NO_OPTIONS. Bug: https://github.com/curl/curl/issues/481 --- docs/curl.1 | 8 ++++++ docs/libcurl/curl_easy_setopt.3 | 2 +- docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3 | 43 ++++++++++++++++++++++------ docs/libcurl/opts/Makefile.am | 19 +++++++------ lib/tftp.c | 2 +- src/tool_cfgable.h | 1 + src/tool_getparam.c | 4 +++ src/tool_help.c | 3 +- src/tool_operate.c | 4 +++ tests/data/Makefile.inc | 2 +- tests/data/test1242 | 43 ++++++++++++++++++++++++++++ tests/data/test1243 | 44 +++++++++++++++++++++++++++++ 12 files changed, 155 insertions(+), 20 deletions(-) create mode 100644 tests/data/test1242 create mode 100644 tests/data/test1243 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 " 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 -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 @@ + + + +TFTP +TFTP RRQ + + + +# +# Server-side + + +a chunk of +data +returned + to client + + + +# +# Client-side + + +tftp + + +TFTP retrieve without TFTP options requests + + +tftp://%HOSTIP:%TFTPPORT//1242 --tftp-no-options --trace-ascii log/traceit + + + +# +# Verify pseudo protocol after the test has been "shot" + + +opcode: 1 +mode: octet +filename: /1242 + + + 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 @@ + + + +TFTP +TFTP WRQ + + + +# +# Client-side + + +tftp + + +TFTP send without TFTP options requests + + +-T log/test1243.txt tftp://%HOSTIP:%TFTPPORT// --tftp-no-options --trace-ascii log/traceit + + +a chunk of +data +sent + to server + + + +# +# Verify pseudo protocol after the test has been "shot" + + +a chunk of +data +sent + to server + + +opcode: 2 +mode: octet +filename: /test1243.txt + + + -- cgit v1.2.3