return n*l;
}
-static void add_transfer(CURLM *cm, int i)
+static void add_transfer(CURLM *cm, int i, int *left)
{
CURL *eh = curl_easy_init();
curl_easy_setopt(eh, CURLOPT_WRITEFUNCTION, write_cb);
curl_easy_setopt(eh, CURLOPT_URL, urls[i]);
curl_easy_setopt(eh, CURLOPT_PRIVATE, urls[i]);
curl_multi_add_handle(cm, eh);
+ (*left)++;
}
int main(void)
CURLMsg *msg;
unsigned int transfers = 0;
int msgs_left = -1;
- int still_alive = 1;
+ int left = 0;
curl_global_init(CURL_GLOBAL_ALL);
cm = curl_multi_init();
/* Limit the amount of simultaneous connections curl should allow: */
curl_multi_setopt(cm, CURLMOPT_MAXCONNECTS, (long)MAX_PARALLEL);
- for(transfers = 0; transfers < MAX_PARALLEL; transfers++)
- add_transfer(cm, transfers);
+ for(transfers = 0; transfers < MAX_PARALLEL && transfers < NUM_URLS;
+ transfers++)
+ add_transfer(cm, transfers, &left);
do {
+ int still_alive = 1;
curl_multi_perform(cm, &still_alive);
while((msg = curl_multi_info_read(cm, &msgs_left))) {
msg->data.result, curl_easy_strerror(msg->data.result), url);
curl_multi_remove_handle(cm, e);
curl_easy_cleanup(e);
+ left--;
}
else {
fprintf(stderr, "E: CURLMsg (%d)\n", msg->msg);
}
if(transfers < NUM_URLS)
- add_transfer(cm, transfers++);
+ add_transfer(cm, transfers++, &left);
}
- if(still_alive)
+ if(left)
curl_multi_wait(cm, NULL, 0, 1000, NULL);
- } while(still_alive || (transfers < NUM_URLS));
+ } while(left);
curl_multi_cleanup(cm);
curl_global_cleanup();