]> granicus.if.org Git - curl/commitdiff
TFTP: add option to suppress TFTP option requests (Part 2)
authorJay Satiro <raysatiro@yahoo.com>
Mon, 24 Aug 2015 04:15:01 +0000 (00:15 -0400)
committerJay Satiro <raysatiro@yahoo.com>
Tue, 23 Feb 2016 08:01:07 +0000 (03:01 -0500)
- 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

12 files changed:
docs/curl.1
docs/libcurl/curl_easy_setopt.3
docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3
docs/libcurl/opts/Makefile.am
lib/tftp.c
src/tool_cfgable.h
src/tool_getparam.c
src/tool_help.c
src/tool_operate.c
tests/data/Makefile.inc
tests/data/test1242 [new file with mode: 0644]
tests/data/test1243 [new file with mode: 0644]

index 37088ea2a16f1a7e8da30540251cf8cb534b4ea2..0b0f4d29d27995625d52afd9229f7d95e5c278ea 100644 (file)
@@ -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
index 3a82024a3dde4e3db08fb4cdab7660a21b548570..60d5492727c57674df5949ad3603b0e7e387a2b0 100644 (file)
@@ -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
index 0e31a293718d401b7683febb3205419e4fed92d8..53b1770be2c520562bc54d1688f03ae7007b68ad 100644 (file)
 .\" *
 .\" **************************************************************************
 .\"
-.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
index 5c35ef92ab2a74dea5e782f3699fbd5405f3208b..04f8b4bbe5a663a28fdfc9c2c7d33632c07a5eab 100644 (file)
@@ -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            \
index eec774b3ec1f0c1b1d1b53bbd4cf174a54f8673f..f44733944ce1ecefde9693b9e408f445c3760ef5 100644 (file)
@@ -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");
 
index 3632560afb77419f32716efb519de95b68d8a499..fb6c7aec4eb9423273a383a72378f942ef239937 100644 (file)
@@ -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;
 
index 164881a5792f6ca944fe941403df8003e4a328c6..61f50464bbdefc4e2130dd5c3dadd7d914b674ac 100644 (file)
@@ -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 */
index 1af1ad100fc26a9964fe9988dcc6ca21eafdeda2..a1a6fb493424ef2bf0bf79d042b4fa38dea731ab 100644 (file)
@@ -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)",
index 69d60769d8b81b9b3c41378e0c88e1a0c957a44d..29e0df8c27e1e1bc356e2df6bde00e8fe07f1324 100644 (file)
@@ -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 */
index f3fa8cd9c4e6acd7c292865278d97f87e3a59be4..a13aac9b90d560bca4058254e376ec716c52447d 100644 (file)
@@ -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 (file)
index 0000000..c8bc3d4
--- /dev/null
@@ -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 (file)
index 0000000..0303a5d
--- /dev/null
@@ -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>