aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDave Reisner <dreisner@archlinux.org>2013-04-30 14:23:39 +0000
committerDaniel Stenberg <daniel@haxx.se>2013-07-14 23:04:05 +0200
commitd8c04909fa50e87bba58311dd8feecaa94508f4b (patch)
treedc2cd13dd737e087906275d2ab73da190fbea777 /src
parentc0a7a98aee6e0be77949f310ea81c253e3d1c6c5 (diff)
src/tool: allow timeouts to accept decimal values
Implement wrappers around strtod to convert the user argument to a double with sane error checking. Use this to allow --max-time and --connect-timeout to accept decimal values instead of strictly integers. The manpage is updated to make mention of this feature and, additionally, forewarn that the actual timeout of the operation can vary in its precision (particularly as the value increases in its decimal precision).
Diffstat (limited to 'src')
-rw-r--r--src/tool_cfgable.h4
-rw-r--r--src/tool_getparam.c4
-rw-r--r--src/tool_operate.c5
-rw-r--r--src/tool_paramhlp.c42
-rw-r--r--src/tool_paramhlp.h2
5 files changed, 51 insertions, 6 deletions
diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h
index e6611fca0..9a9b6d8d3 100644
--- a/src/tool_cfgable.h
+++ b/src/tool_cfgable.h
@@ -53,8 +53,8 @@ struct Configurable {
char *postfields;
curl_off_t postfieldsize;
char *referer;
- long timeout;
- long connecttimeout;
+ double timeout;
+ double connecttimeout;
long maxredirs;
curl_off_t max_filesize;
char *headerfile;
diff --git a/src/tool_getparam.c b/src/tool_getparam.c
index fb8270894..5eb2c9f83 100644
--- a/src/tool_getparam.c
+++ b/src/tool_getparam.c
@@ -498,7 +498,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
GetStr(&config->egd_file, nextarg);
break;
case 'c': /* connect-timeout */
- err = str2unum(&config->connecttimeout, nextarg);
+ err = str2udouble(&config->connecttimeout, nextarg);
if(err)
return err;
break;
@@ -1404,7 +1404,7 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
break;
case 'm':
/* specified max time */
- err = str2unum(&config->timeout, nextarg);
+ err = str2udouble(&config->timeout, nextarg);
if(err)
return err;
break;
diff --git a/src/tool_operate.c b/src/tool_operate.c
index 3a15bed51..9c2fd3847 100644
--- a/src/tool_operate.c
+++ b/src/tool_operate.c
@@ -946,7 +946,7 @@ int operate(struct Configurable *config, int argc, argv_item_t argv[])
my_setopt_str(curl, CURLOPT_USERPWD, config->userpwd);
my_setopt_str(curl, CURLOPT_RANGE, config->range);
my_setopt(curl, CURLOPT_ERRORBUFFER, errorbuffer);
- my_setopt(curl, CURLOPT_TIMEOUT, config->timeout);
+ my_setopt(curl, CURLOPT_TIMEOUT_MS, (long)(config->timeout * 1000));
if(built_in_protos & CURLPROTO_HTTP) {
@@ -1134,7 +1134,8 @@ int operate(struct Configurable *config, int argc, argv_item_t argv[])
/* new in libcurl 7.7: */
my_setopt_str(curl, CURLOPT_RANDOM_FILE, config->random_file);
my_setopt(curl, CURLOPT_EGDSOCKET, config->egd_file);
- my_setopt(curl, CURLOPT_CONNECTTIMEOUT, config->connecttimeout);
+ my_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS,
+ (long)(config->connecttimeout * 1000));
if(config->cipher_list)
my_setopt_str(curl, CURLOPT_SSL_CIPHER_LIST, config->cipher_list);
diff --git a/src/tool_paramhlp.c b/src/tool_paramhlp.c
index d23245046..86b8a1df5 100644
--- a/src/tool_paramhlp.c
+++ b/src/tool_paramhlp.c
@@ -188,6 +188,48 @@ ParameterError str2unum(long *val, const char *str)
}
/*
+ * Parse the string and write the double in the given address. Return PARAM_OK
+ * on success, otherwise a parameter specific error enum.
+ *
+ * Since this function gets called with the 'nextarg' pointer from within the
+ * getparameter a lot, we must check it for NULL before accessing the str
+ * data.
+ */
+
+ParameterError str2double(double *val, const char *str)
+{
+ if(str) {
+ char *endptr;
+ double num = strtod(str, &endptr);
+ if((endptr != str) && (endptr == str + strlen(str))) {
+ *val = num;
+ return PARAM_OK; /* Ok */
+ }
+ }
+ return PARAM_BAD_NUMERIC; /* badness */
+}
+
+/*
+ * Parse the string and write the double in the given address. Return PARAM_OK
+ * on success, otherwise a parameter error enum. ONLY ACCEPTS POSITIVE NUMBERS!
+ *
+ * Since this function gets called with the 'nextarg' pointer from within the
+ * getparameter a lot, we must check it for NULL before accessing the str
+ * data.
+ */
+
+ParameterError str2udouble(double *val, const char *str)
+{
+ ParameterError result = str2double(val, str);
+ if(result != PARAM_OK)
+ return result;
+ if(*val < 0)
+ return PARAM_NEGATIVE_NUMERIC;
+
+ return PARAM_OK;
+}
+
+/*
* Parse the string and modify the long in the given address. Return
* non-zero on failure, zero on success.
*
diff --git a/src/tool_paramhlp.h b/src/tool_paramhlp.h
index de1604e90..24734a520 100644
--- a/src/tool_paramhlp.h
+++ b/src/tool_paramhlp.h
@@ -33,6 +33,8 @@ void cleanarg(char *str);
ParameterError str2num(long *val, const char *str);
ParameterError str2unum(long *val, const char *str);
+ParameterError str2double(double *val, const char *str);
+ParameterError str2udouble(double *val, const char *str);
long proto2num(struct Configurable *config, long *val, const char *str);