diff --git a/docs/curl.1 b/docs/curl.1 index 0d0e12f9199630053c1eae27a4efd41527bc7e82..9e1a6883b37a054089b8d06c83fe040a8a26288e 100644 --- a/docs/curl.1 +++ b/docs/curl.1 @@ -230,7 +230,9 @@ server sends an unsupported encoding, curl will report an error. .IP "--connect-timeout <seconds>" Maximum time in seconds that you allow the connection to the server to take. This only limits the connection phase, once curl has connected this option is -of no more use. See also the \fI-m, --max-time\fP option. +of no more use. Since 7.32.0, this option accepts decimal values, but the +actual timeout will decrease in accuracy as the specified timeout increases in +decimal precision. See also the \fI-m, --max-time\fP option. If this option is used several times, the last one will be used. .IP "--create-dirs" @@ -813,7 +815,10 @@ Basic authentication). .IP "-m, --max-time <seconds>" Maximum time in seconds that you allow the whole operation to take. This is useful for preventing your batch jobs from hanging for hours due to slow -networks or links going down. See also the \fI--connect-timeout\fP option. +networks or links going down. Since 7.32.0, this option accepts decimal +values, but the actual timeout will decrease in accuracy as the specified +timeout increases in decimal precision. See also the \fI--connect-timeout\fP +option. If this option is used several times, the last one will be used. .IP "--mail-auth <address>" diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h index e6611fca07fc0b77e3addae34837515b003e81d8..9a9b6d8d30f1e942a367a6f6e280ae6ac038e581 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 fb8270894f7c0314c931f63ac02ba1f5d6761f04..5eb2c9f83f4f036c483906ff6816c9e737c58e4b 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 3a15bed511f93a84e9d1269da147bd24d2cbef02..9c2fd3847c7bbac5195d2edea1fd41a6cc29cf93 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 d2324504628645c5f72577f88eb2143525a70b04..86b8a1df5426538985ce322905322ca98e885aa7 100644 --- a/src/tool_paramhlp.c +++ b/src/tool_paramhlp.c @@ -187,6 +187,48 @@ ParameterError str2unum(long *val, const char *str) return PARAM_OK; } +/* + * 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 de1604e90528373078e1924de91e310ca27a539c..24734a5200aebb0520c42c4d524ed17ff14ff230 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);