change new API function to have error return value

This commit is contained in:
Stefan Eissing 2025-07-28 09:54:53 +02:00
parent b5930cec1a
commit 8867831c31
No known key found for this signature in database
5 changed files with 41 additions and 18 deletions

View file

@ -21,7 +21,9 @@ curl_multi_get_offt - extract information from a multi handle
~~~c
#include <curl/curl.h>
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 */
}
}

View file

@ -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

View file

@ -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;
}
}

View file

@ -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);

View file

@ -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,