cURL / Mailing Lists / curl-library / Single Mail

curl-library

[PATCH] --libcurl does not produce code for some options when it should

From: Yves Arrouye <yarrouye_at_expedia.com>
Date: Mon, 14 Jan 2013 11:06:32 -0800

If the default value for an option taking a long as its value is non zero, and it is set by zero by a command line option, then that command line option is not reflected in —libcurl's output. This is because line 520-521 of tool_setopt.c look like:

if(!lval)
    skip = TRUE;

An example of a command-line option doing so is the –k option that sets CURLOPT_SLL_VERIFYPEER and CURLOPT_SSL_VERIFYHOST to 0L, when the defaults are non-zero.

The following patch has code to fix this. I am just started to learn cURL so I do not pretend to know which options have non-zero defaults (though I assume it's not that many or this would have been fixed already). So I just fixed the two aforementioned options. My patch also does not assume that the non-zero defaults values are always 1, just in case or for future extension.

Cheers,
YA

diff --git a/src/tool_setopt.c b/src/tool_setopt.c
index be65633..7b919dd 100644
--- a/src/tool_setopt.c
+++ b/src/tool_setopt.c
@@ -39,6 +39,7 @@
 /* and finally any "NONE" value. */

 #define NV(e) {#e, e}
+#define NV1(e, v) {#e, (v)}
 #define NVEND {NULL, 0} /* sentinel to mark end of list */

 const NameValue setopt_nv_CURLPROXY[] = {
@@ -122,6 +123,13 @@ const NameValue setopt_nv_CURLPROTO[] = {
   NVEND,
 };

+/* These options have non-zero default values. */
+static const NameValue setopt_nv_CURLNONZERODEFAULTS[] = {
+ NV1(CURLOPT_SSL_VERIFYPEER, 1),
+ NV1(CURLOPT_SSL_VERIFYHOST, 1),
+ NVEND
+};
+
 /* Format and add code; jump to nomem on malloc error */
 #define ADD(args) do { \
   ret = easysrc_add args; \
@@ -513,10 +521,19 @@ CURLcode tool_setopt(CURL *curl, bool str, struct Configurable *config,
   if(tag < CURLOPTTYPE_OBJECTPOINT) {
     /* Value is expected to be a long */
     long lval = va_arg(arg, long);
+ long defval = 0L;
+ const NameValue *nv = NULL;
+ for(nv=setopt_nv_CURLNONZERODEFAULTS; nv->name; nv++) {
+ if(!strcmp(name, nv->name)) {
+ defval = nv->value;
+ break; /* found it */
+ }
+ }
+
     snprintf(buf, sizeof(buf), "%ldL", lval);
     value = buf;
     ret = curl_easy_setopt(curl, tag, lval);
- if(!lval)
+ if(lval == defval)
       skip = TRUE;
   }
   else if(tag < CURLOPTTYPE_OFF_T) {

-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette: http://curl.haxx.se/mail/etiquette.html
Received on 2013-01-14