/*****************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * $Id: multithread.c,v 1.4 2008-04-03 20:28:33 danf Exp $
 */

#include <stdio.h>
#include <pthread.h>
#include <curl/curl.h>

#define NUMT 2

/* List of URLs to fetch. */
const char * const urls1[]= {
  "http://www.tribalwar.com/",
  "http://pagead2.googlesyndication.com/pagead/show_ads.js",
  "http://cetrk.com/pages/scripts/0004/7020.js",
  "http://static.robotreplay.com/nitobi.replay.js",
  "http://www.tribalwar.com/includes/css/twMarkup.css",
  "http://www.tribalwar.com/includes/css/lightbox.css",
  "http://www.tribalwar.com/includes/css/twMobile.css",
  "http://www.tribalwar.com/includes/js/ddmenu.js",
  "http://www.tribalwar.com/includes/js/prototype.js",
  "http://www.tribalwar.com/includes/js/scriptaculous.js?load=effects,controls",
  NULL
};

const char * const urls2[]= {
  "http://www.tribalwar.com/includes/js/tw.js",
  "http://www.tribalwar.com/includes/js/aurora.js",
  "http://www.tribalwar.com/includes/js/lightbox.js",
  "http://www.tribalwar.com/images/search_btn.gif",
  "http://www.tribalwar.com/images/branlogo.gif",
  "http://www.tribalwar.com/images/paypaldonate.gif",
  "http://www.tribalwar.com/images/rss_small.gif",
  "http://www.tribalwar.com/images/atom_small.gif",
  "http://www.tribalwar.com/includes/js/wz_tooltip.js",
  "http://www.tribalwar.com/WRa.js",
  "http://www.google-analytics.com/urchin.js",
  NULL
};

static size_t
WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
{
  return size * nmemb;
}

static void *pull_one_url(char **urls)
{
  CURL *curl;
  char *ip;

  while(*urls) {

    curl = curl_easy_init();
    curl_easy_setopt(curl, CURLOPT_URL, *urls);

    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

    curl_easy_perform(curl); /* ignores error */

    curl_easy_getinfo(curl, CURLINFO_PRIMARY_IP, &ip);

    if(ip) {
      printf("%s = CURLINFO_PRIMARY_IP = %s\n", *urls, ip);
    }

    curl_easy_cleanup(curl);

    urls++; /* next url please */
  }

  return NULL;
}


/*
   int pthread_create(pthread_t *new_thread_ID,
   const pthread_attr_t *attr,
   void * (*start_func)(void *), void *arg);
*/

int main(int argc, char **argv)
{
  pthread_t tid[NUMT];
  int i;
  int error;

  /* Must initialize libcurl before any threads are started */
  curl_global_init(CURL_GLOBAL_ALL);

  error = pthread_create(&tid[0],
                         NULL, /* default attributes please */
                         pull_one_url,
                         (void *)urls1);

  error = pthread_create(&tid[1],
                         NULL, /* default attributes please */
                         pull_one_url,
                         (void *)urls2);

  /* now wait for all threads to terminate */
  for(i=0; i< NUMT; i++) {
    error = pthread_join(tid[i], NULL);
    fprintf(stderr, "Thread %d terminated\n", i);
  }

  return 0;
}
