#include <curl/curl.h>

size_t curl_writer(void *ptr, size_t size, size_t nmemb, void *param) {
  return size*nmemb;
}

void setup_easy(CURL *easy) {
  curl_easy_setopt(easy, CURLOPT_TIMEOUT, 300L);
  curl_easy_setopt(easy, CURLOPT_CONNECTTIMEOUT, 30L);
  curl_easy_setopt(easy, CURLOPT_FOLLOWLOCATION, 0L);
  curl_easy_setopt(easy, CURLOPT_VERBOSE, 1L);
  curl_easy_setopt(easy, CURLOPT_WRITEFUNCTION, curl_writer); //Ignore output from server
  curl_easy_setopt(easy, CURLOPT_SSL_VERIFYPEER, 0L);
  curl_easy_setopt(easy, CURLOPT_URL, "https://www.google.com/ncr");
  curl_easy_setopt(easy, CURLOPT_SSL_SESSIONID_CACHE, 0L);
}

int main(int argc, char **argv) {
  curl_global_init(CURL_GLOBAL_ALL);
  CURL *easy = curl_easy_init();
  CURLM *multi = curl_multi_init();

  setup_easy(easy);

  printf("curl_easy_perform 1:\n");
  curl_easy_perform(easy);
  printf("\ncurl_easy_perform 2:\n");
  curl_easy_perform(easy); //Connection re-used here!
  
  //Do another using curl_multi
  printf("\n\ncurl_multi_perform:\n");
  int still_running;
  curl_multi_add_handle(multi, easy);
  curl_multi_perform(multi, &still_running); //Connection not re-used here!

  do {
    struct timeval timeout;
    int rc; /* select() return code */ 

    fd_set fdread;
    fd_set fdwrite;
    fd_set fdexcep;
    int maxfd = -1;

    long curl_timeo = -1;

    FD_ZERO(&fdread);
    FD_ZERO(&fdwrite);
    FD_ZERO(&fdexcep);

    /* set a suitable timeout to play around with */ 
    timeout.tv_sec = 1;
    timeout.tv_usec = 0;

    curl_multi_timeout(multi, &curl_timeo);
    if(curl_timeo >= 0) {
      timeout.tv_sec = curl_timeo / 1000;
      if(timeout.tv_sec > 1)
        timeout.tv_sec = 1;
      else
        timeout.tv_usec = (curl_timeo % 1000) * 1000;
    }

    curl_multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd);
    rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);

    switch(rc) {
    case -1:
      break;
    case 0:
    default:
      curl_multi_perform(multi, &still_running);
      break;
    }
  } while(still_running);

  curl_multi_cleanup(multi);
  curl_easy_cleanup(easy);
}
