1e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/***************************************************************************
29bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels *                                  _   _ ____  _
39bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels *  Project                     ___| | | |  _ \| |
49bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels *                             / __| | | | |_) | |
59bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels *                            | (__| |_| |  _ <| |___
69bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels *                             \___|\___/|_| \_\_____|
79bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels *
8e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
99bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels *
10e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * This software is licensed as described in the file COPYING, which
11e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * you should have received as part of this distribution. The terms
12e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * are also available at http://curl.haxx.se/docs/copyright.html.
13e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *
14e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * copies of the Software, and permit persons to whom the Software is
16e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * furnished to do so, under the terms of the COPYING file.
17e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *
18e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * KIND, either express or implied.
20e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *
21e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ***************************************************************************/
22e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* This is a very simple example using the multi interface. */
239bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
249bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <stdio.h>
259bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <string.h>
269bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
279bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* somewhat unix-specific */
289bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <sys/time.h>
299bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <unistd.h>
309bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
319bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* curl stuff */
329bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <curl/curl.h>
339bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
34e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifdef _WIN32
35e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define WAITMS(x) Sleep(x)
36e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#else
37e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* Portable sleep for platforms other than Windows. */
38e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define WAITMS(x)                               \
39e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  struct timeval wait = { 0, (x) * 1000 };      \
40e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  (void)select(0, NULL, NULL, NULL, &wait);
41e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif
42e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
439bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/*
449bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Simply download a HTTP file.
459bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels */
46e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETint main(void)
479bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{
489bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  CURL *http_handle;
499bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  CURLM *multi_handle;
509bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
519bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  int still_running; /* keep number of running handles */
52e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  int repeats = 0;
53e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET
54e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  curl_global_init(CURL_GLOBAL_DEFAULT);
559bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
569bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  http_handle = curl_easy_init();
579bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
589bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  /* set the options (I left out a few, you'll get the point anyway) */
599bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  curl_easy_setopt(http_handle, CURLOPT_URL, "http://www.example.com/");
609bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
619bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  /* init a multi stack */
629bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  multi_handle = curl_multi_init();
639bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
649bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  /* add the individual transfers */
659bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  curl_multi_add_handle(multi_handle, http_handle);
669bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
679bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  /* we start some action by calling perform right away */
689bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  curl_multi_perform(multi_handle, &still_running);
699bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
70e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  do {
71e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    CURLMcode mc; /* curl_multi_wait() return code */
72e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    int numfds;
739bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
74e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    /* wait for activity, timeout or "nothing" */
75e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    mc = curl_multi_wait(multi_handle, NULL, 0, 1000, &numfds);
769bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
77e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    if(mc != CURLM_OK)
78e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    {
79e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
80e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      break;
81e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    }
829bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
83e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    /* 'numfds' being zero means either a timeout or no file descriptors to
84e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET       wait for. Try timeout on first occurrence, then assume no file
85e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET       descriptors and no file descriptors to wait for means wait for 100
86e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET       milliseconds. */
879bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
88e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    if(!numfds) {
89e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      repeats++; /* count number of repeated zero numfds */
90e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      if(repeats > 1) {
91e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET        WAITMS(100); /* sleep 100 milliseconds */
92e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      }
939bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels    }
94e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    else
95e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET      repeats = 0;
969bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
97e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET    curl_multi_perform(multi_handle, &still_running);
98e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  } while(still_running);
999bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
100e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  curl_multi_remove_handle(multi_handle, http_handle);
1019bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
102e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  curl_easy_cleanup(http_handle);
1039bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
1049bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  curl_multi_cleanup(multi_handle);
1059bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
106e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET  curl_global_cleanup();
1079bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels
1089bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels  return 0;
1099bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels}
110