diff --git a/docs/libcurl/curl_multi_get_offt.md b/docs/libcurl/curl_multi_get_offt.md index 097c78ee78..f5ade1f850 100644 --- a/docs/libcurl/curl_multi_get_offt.md +++ b/docs/libcurl/curl_multi_get_offt.md @@ -21,7 +21,9 @@ curl_multi_get_offt - extract information from a multi handle ~~~c #include -curl_off_t curl_multi_get_offt(CURLM *multi, CURLMinfo_offt info); +CURLMcode curl_multi_get_offt(CURLM *multi_handle, + CURLMinfo_offt info, + curl_off_t *pvalue); ~~~ # DESCRIPTION @@ -84,7 +86,7 @@ int main(void) /* add the transfer */ curl_multi_add_handle(multi, curl); - n = curl_multi_get_offt(multi, CURLMINFO_XFERS_ADDED); + curl_multi_get_offt(multi, CURLMINFO_XFERS_ADDED, &n); /* on successful add, n is 1 */ } } diff --git a/include/curl/multi.h b/include/curl/multi.h index 5c59996a07..e336c94a88 100644 --- a/include/curl/multi.h +++ b/include/curl/multi.h @@ -472,11 +472,11 @@ typedef enum { * * Desc: Retrieves a numeric value for the `CURLMINFO_*` enums. * - * Returns: the curl_off_t value from a valid multi handle and - * supported `info` or -1. + * Returns: CULRM_OK or error when value could not be obtained. */ -CURL_EXTERN curl_off_t curl_multi_get_offt(CURLM *multi_handle, - CURLMinfo_offt info); +CURL_EXTERN CURLMcode curl_multi_get_offt(CURLM *multi_handle, + CURLMinfo_offt info, + curl_off_t *pvalue); /* * Name: curl_push_callback diff --git a/lib/multi.c b/lib/multi.c index d1677f5595..f31f1a3d7c 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -3735,30 +3735,40 @@ CURL **curl_multi_get_handles(CURLM *m) return a; } -CURL_EXTERN curl_off_t curl_multi_get_offt(CURLM *m, CURLMinfo_offt info) +CURLMcode curl_multi_get_offt(CURLM *m, + CURLMinfo_offt info, + curl_off_t *pvalue) { struct Curl_multi *multi = m; if(!GOOD_MULTI_HANDLE(multi)) - return -1; + return CURLM_BAD_HANDLE; + if(!pvalue) + return CURLM_BAD_FUNCTION_ARGUMENT; switch(info) { case CURLMINFO_XFERS_CURRENT: { unsigned int n = Curl_uint_tbl_count(&multi->xfers); if(n && multi->admin) --n; - return (curl_off_t)n; + *pvalue = (curl_off_t)n; + return CURLM_OK; } case CURLMINFO_XFERS_RUNNING: - return (curl_off_t)Curl_uint_bset_count(&multi->process); + *pvalue = (curl_off_t)Curl_uint_bset_count(&multi->process); + return CURLM_OK; case CURLMINFO_XFERS_PENDING: - return (curl_off_t)Curl_uint_bset_count(&multi->pending); + *pvalue = (curl_off_t)Curl_uint_bset_count(&multi->pending); + return CURLM_OK; case CURLMINFO_XFERS_DONE: - return (curl_off_t)Curl_uint_bset_count(&multi->msgsent); + *pvalue = (curl_off_t)Curl_uint_bset_count(&multi->msgsent); + return CURLM_OK; case CURLMINFO_XFERS_ADDED: - return multi->xfers_total_ever; + *pvalue = multi->xfers_total_ever; + return CURLM_OK; default: - return -1; + *pvalue = -1; + return CURLM_UNKNOWN_OPTION; } } diff --git a/src/tool_operate.c b/src/tool_operate.c index 4f29b8f512..83a9c2d5b5 100644 --- a/src/tool_operate.c +++ b/src/tool_operate.c @@ -1416,10 +1416,17 @@ static CURLcode add_parallel_transfers(struct GlobalConfig *global, CURLMcode mcode; bool sleeping = FALSE; char *errorbuf; + curl_off_t nxfers; + *addedp = FALSE; *morep = FALSE; - if(curl_multi_get_offt(multi, CURLMINFO_XFERS_CURRENT) < - (curl_off_t)(global->parallel_max*2)) { + mcode = curl_multi_get_offt(multi, CURLMINFO_XFERS_CURRENT, &nxfers); + if(mcode) { + DEBUGASSERT(0); + return CURLE_UNKNOWN_OPTION; + } + + if(nxfers < (curl_off_t)(global->parallel_max*2)) { bool skipped = FALSE; do { result = create_transfer(global, share, addedp, &skipped); diff --git a/src/tool_progress.c b/src/tool_progress.c index 88fa1c99d1..a477dbac26 100644 --- a/src/tool_progress.c +++ b/src/tool_progress.c @@ -181,6 +181,8 @@ bool progress_meter(struct GlobalConfig *global, struct per_transfer *per; curl_off_t all_dlnow = 0; curl_off_t all_ulnow = 0; + curl_off_t xfers_added = 0; + curl_off_t xfers_running = 0; bool dlknown = TRUE; bool ulknown = TRUE; curl_off_t speed = 0; @@ -270,6 +272,8 @@ bool progress_meter(struct GlobalConfig *global, } time2str(time_spent, spent); + (void)curl_multi_get_offt(multi, CURLMINFO_XFERS_ADDED, &xfers_added); + (void)curl_multi_get_offt(multi, CURLMINFO_XFERS_RUNNING, &xfers_running); fprintf(tool_stderr, "\r" "%-3s " /* percent downloaded */ @@ -288,8 +292,8 @@ bool progress_meter(struct GlobalConfig *global, ulpercen, /* 3 letters */ max5data(all_dlnow, buffer[0]), max5data(all_ulnow, buffer[1]), - curl_multi_get_offt(multi, CURLMINFO_XFERS_ADDED), - curl_multi_get_offt(multi, CURLMINFO_XFERS_RUNNING), + xfers_added, + xfers_running, time_total, time_spent, time_left,