#include <curl/curl.h>
#include <stdio.h>
#include <unistd.h>
static size_t wr( char *ptr, size_t size, size_t nmemb, void *userdata)
{
    return nmemb * size;
}

#define N 8

int main(int argc, char *argv[]) {
    /* testcase only, the real code has error checks too */
    CURLM *multi;
    CURL *easy[N];
    CURLMsg *msg;
    curl_off_t speed;
    long timeout;
    int running, msgs, i;
    int ok = 0, fail = 0;
    const char *url = "http://curl.haxx.se/download/curl-7.28.1.tar.gz";

    curl_global_init(CURL_GLOBAL_ALL);
    printf("CURL version: %s\n", curl_version());
    multi = curl_multi_init();
    curl_multi_setopt(multi, CURLMOPT_PIPELINING, 1L);

    for (i=0;i<N;i++) {
        easy[i] = curl_easy_init();
        curl_easy_setopt(easy[i], CURLOPT_VERBOSE, 1L);
        curl_easy_setopt(easy[i], CURLOPT_CONNECTTIMEOUT, 5L);
        curl_easy_setopt(easy[i], CURLOPT_FOLLOWLOCATION, 1L);
        curl_easy_setopt(easy[i], CURLOPT_URL, url);
        curl_easy_setopt(easy[i], CURLOPT_WRITEFUNCTION, wr);

        if (!i) {
            speed = 256*1024;
            curl_easy_setopt(easy[i], CURLOPT_MAX_RECV_SPEED_LARGE, speed);
        }

        curl_multi_add_handle(multi, easy[i]);
    }

    do {
        curl_multi_timeout(multi, &timeout);
        if (timeout == -1) timeout = 2000;
        curl_multi_wait(multi, NULL, 0, timeout, NULL);
        while (curl_multi_perform(multi, &running) == CURLM_CALL_MULTI_PERFORM) {}
        while ((msg = curl_multi_info_read(multi, &msgs))) {
            if (msg->msg == CURLMSG_DONE) {
                fprintf(stderr,"Result: %s\n", curl_easy_strerror(msg->data.result));
                if (msg->data.result == CURLE_OK)
                    ok++;
                else
                    fail++;
                curl_multi_remove_handle(multi, msg->easy_handle);
                curl_easy_cleanup(msg->easy_handle);
            }
        }
    } while (running > 0);

    curl_multi_cleanup(multi);
    curl_global_cleanup();
    printf("OK: %d, Failed: %d\n", ok, fail);
    return fail;
}


