]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
examples: check more errors, fix cleanups, scope variables
authorViktor Szakats <commit@vsz.me>
Mon, 13 Oct 2025 20:57:01 +0000 (22:57 +0200)
committerViktor Szakats <commit@vsz.me>
Tue, 14 Oct 2025 14:33:00 +0000 (16:33 +0200)
Inspired by Joshua's report on examples.

Closes #19055

42 files changed:
docs/examples/10-at-a-time.c
docs/examples/anyauthput.c
docs/examples/cacertinmem.c
docs/examples/chkspeed.c
docs/examples/crawler.c
docs/examples/debug.c
docs/examples/ftpgetresp.c
docs/examples/ftpupload.c
docs/examples/ftpuploadresume.c
docs/examples/getinmemory.c
docs/examples/ghiper.c
docs/examples/htmltidy.c
docs/examples/http2-download.c
docs/examples/http2-pushinmemory.c
docs/examples/http2-serverpush.c
docs/examples/http2-upload.c
docs/examples/multi-app.c
docs/examples/multi-debugcallback.c
docs/examples/multi-double.c
docs/examples/multi-event.c
docs/examples/multi-formadd.c
docs/examples/multi-legacy.c
docs/examples/multi-post.c
docs/examples/multi-single.c
docs/examples/multi-uv.c
docs/examples/multithread.c
docs/examples/postinmemory.c
docs/examples/postit2.c
docs/examples/progressfunc.c
docs/examples/sftpuploadresume.c
docs/examples/smooth-gtk-thread.c
docs/examples/smtp-authzid.c
docs/examples/smtp-expn.c
docs/examples/smtp-mail.c
docs/examples/smtp-ssl.c
docs/examples/smtp-tls.c
docs/examples/smtp-vrfy.c
docs/examples/threaded-ssl.c
docs/examples/url2file.c
docs/examples/urlapi.c
docs/examples/usercertinmem.c
docs/examples/xmlstream.c

index 48e0030040c5d791ec095432d9cb8e3402a403aa..87971cbde62f8ee494502a7d5a009af0253e90b8 100644 (file)
@@ -104,52 +104,54 @@ static void add_transfer(CURLM *cm, unsigned int i, int *left)
 int main(void)
 {
   CURLM *cm;
-  CURLMsg *msg;
-  unsigned int transfers = 0;
-  int msgs_left = -1;
-  int left = 0;
 
   CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
   if(res)
     return (int)res;
 
   cm = curl_multi_init();
+  if(cm) {
+    CURLMsg *msg;
+    unsigned int transfers = 0;
+    int msgs_left = -1;
+    int left = 0;
 
-  /* Limit the amount of simultaneous connections curl should allow: */
-  curl_multi_setopt(cm, CURLMOPT_MAXCONNECTS, (long)MAX_PARALLEL);
+    /* 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 < NUM_URLS;
-      transfers++)
-    add_transfer(cm, transfers, &left);
+    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);
+    do {
+      int still_alive = 1;
+      curl_multi_perform(cm, &still_alive);
 
-    /* !checksrc! disable EQUALSNULL 1 */
-    while((msg = curl_multi_info_read(cm, &msgs_left)) != NULL) {
-      if(msg->msg == CURLMSG_DONE) {
-        char *url;
-        CURL *e = msg->easy_handle;
-        curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, &url);
-        fprintf(stderr, "R: %d - %s <%s>\n",
-                msg->data.result, curl_easy_strerror(msg->data.result), url);
-        curl_multi_remove_handle(cm, e);
-        curl_easy_cleanup(e);
-        left--;
+      /* !checksrc! disable EQUALSNULL 1 */
+      while((msg = curl_multi_info_read(cm, &msgs_left)) != NULL) {
+        if(msg->msg == CURLMSG_DONE) {
+          char *url;
+          CURL *e = msg->easy_handle;
+          curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, &url);
+          fprintf(stderr, "R: %d - %s <%s>\n",
+                  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++, &left);
       }
-      else {
-        fprintf(stderr, "E: CURLMsg (%d)\n", msg->msg);
-      }
-      if(transfers < NUM_URLS)
-        add_transfer(cm, transfers++, &left);
-    }
-    if(left)
-      curl_multi_wait(cm, NULL, 0, 1000, NULL);
+      if(left)
+        curl_multi_wait(cm, NULL, 0, 1000, NULL);
 
-  } while(left);
+    } while(left);
 
-  curl_multi_cleanup(cm);
+    curl_multi_cleanup(cm);
+  }
   curl_global_cleanup();
 
   return EXIT_SUCCESS;
index 81bb1fb9071d32598cf9992d18f9f2abfcc5535b..8718ac98bbed7360c137f989438cbe4d179d1b67 100644 (file)
@@ -105,10 +105,13 @@ int main(int argc, char **argv)
 
 #ifdef UNDER_CE
   /* !checksrc! disable BANNEDFUNC 1 */
-  stat(file, &file_info);
+  if(stat(file, &file_info) != 0) {
 #else
-  fstat(fileno(fp), &file_info);
+  if(fstat(fileno(fp), &file_info) != 0) {
 #endif
+    fclose(fp);
+    return 1; /* cannot continue */
+  }
 
   /* In Windows, this inits the Winsock stuff */
   res = curl_global_init(CURL_GLOBAL_ALL);
index d72dc490018a4451f0166b4f5349688f91feb9bf..5855d872b6586964c51d3f9a4df77288c9f6594a 100644 (file)
@@ -116,63 +116,64 @@ static CURLcode sslctx_function(CURL *curl, void *sslctx, void *pointer)
 int main(void)
 {
   CURL *ch;
-  CURLcode res;
 
-  res = curl_global_init(CURL_GLOBAL_ALL);
+  CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
   if(res)
     return (int)res;
 
   ch = curl_easy_init();
-  curl_easy_setopt(ch, CURLOPT_VERBOSE, 0L);
-  curl_easy_setopt(ch, CURLOPT_HEADER, 0L);
-  curl_easy_setopt(ch, CURLOPT_NOPROGRESS, 1L);
-  curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L);
-  curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, writefunction);
-  curl_easy_setopt(ch, CURLOPT_WRITEDATA, stdout);
-  curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, writefunction);
-  curl_easy_setopt(ch, CURLOPT_HEADERDATA, stderr);
-  curl_easy_setopt(ch, CURLOPT_SSLCERTTYPE, "PEM");
-  curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 1L);
-  curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
-
-  /* Turn off the default CA locations, otherwise libcurl loads CA
-   * certificates from the locations that were detected/specified at
-   * build-time
-   */
-  curl_easy_setopt(ch, CURLOPT_CAINFO, NULL);
-  curl_easy_setopt(ch, CURLOPT_CAPATH, NULL);
-
-  /* first try: retrieve page without ca certificates -> should fail
-   * unless libcurl was built --with-ca-fallback enabled at build-time
-   */
-  res = curl_easy_perform(ch);
-  if(res == CURLE_OK)
-    printf("*** transfer succeeded ***\n");
-  else
-    printf("*** transfer failed ***\n");
-
-  /* use a fresh connection (optional) this option seriously impacts
-   * performance of multiple transfers but it is necessary order to
-   * demonstrate this example. recall that the ssl ctx callback is only called
-   * _before_ an SSL connection is established, therefore it does not affect
-   * existing verified SSL connections already in the connection cache
-   * associated with this handle. normally you would set the ssl ctx function
-   * before making any transfers, and not use this option.
-   */
-  curl_easy_setopt(ch, CURLOPT_FRESH_CONNECT, 1L);
-
-  /* second try: retrieve page using cacerts' certificate -> succeeds to load
-   * the certificate by installing a function doing the necessary
-   * "modifications" to the SSL CONTEXT just before link init
-   */
-  curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, sslctx_function);
-  res = curl_easy_perform(ch);
-  if(res == CURLE_OK)
-    printf("*** transfer succeeded ***\n");
-  else
-    printf("*** transfer failed ***\n");
-
-  curl_easy_cleanup(ch);
+  if(ch) {
+    curl_easy_setopt(ch, CURLOPT_VERBOSE, 0L);
+    curl_easy_setopt(ch, CURLOPT_HEADER, 0L);
+    curl_easy_setopt(ch, CURLOPT_NOPROGRESS, 1L);
+    curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L);
+    curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, writefunction);
+    curl_easy_setopt(ch, CURLOPT_WRITEDATA, stdout);
+    curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, writefunction);
+    curl_easy_setopt(ch, CURLOPT_HEADERDATA, stderr);
+    curl_easy_setopt(ch, CURLOPT_SSLCERTTYPE, "PEM");
+    curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 1L);
+    curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
+
+    /* Turn off the default CA locations, otherwise libcurl loads CA
+     * certificates from the locations that were detected/specified at
+     * build-time
+     */
+    curl_easy_setopt(ch, CURLOPT_CAINFO, NULL);
+    curl_easy_setopt(ch, CURLOPT_CAPATH, NULL);
+
+    /* first try: retrieve page without ca certificates -> should fail
+     * unless libcurl was built --with-ca-fallback enabled at build-time
+     */
+    res = curl_easy_perform(ch);
+    if(res == CURLE_OK)
+      printf("*** transfer succeeded ***\n");
+    else
+      printf("*** transfer failed ***\n");
+
+    /* use a fresh connection (optional) this option seriously impacts
+     * performance of multiple transfers but it is necessary order to
+     * demonstrate this example. recall that the ssl ctx callback is only
+     * called _before_ an SSL connection is established, therefore it does not
+     * affect existing verified SSL connections already in the connection cache
+     * associated with this handle. normally you would set the ssl ctx function
+     * before making any transfers, and not use this option.
+     */
+    curl_easy_setopt(ch, CURLOPT_FRESH_CONNECT, 1L);
+
+    /* second try: retrieve page using cacerts' certificate -> succeeds to load
+     * the certificate by installing a function doing the necessary
+     * "modifications" to the SSL CONTEXT just before link init
+     */
+    curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, sslctx_function);
+    res = curl_easy_perform(ch);
+    if(res == CURLE_OK)
+      printf("*** transfer succeeded ***\n");
+    else
+      printf("*** transfer failed ***\n");
+
+    curl_easy_cleanup(ch);
+  }
   curl_global_cleanup();
   return (int)res;
 }
index d4b2abbab819cb6b04d8874a1fbc5f012d684dec..996db393f5840416a060ddac372bbebdadab78ac 100644 (file)
@@ -162,62 +162,67 @@ int main(int argc, char *argv[])
 
   /* init the curl session */
   curl_handle = curl_easy_init();
+  if(curl_handle) {
 
-  /* specify URL to get */
-  curl_easy_setopt(curl_handle, CURLOPT_URL, url);
+    /* specify URL to get */
+    curl_easy_setopt(curl_handle, CURLOPT_URL, url);
 
-  /* send all data to this function  */
-  curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteCallback);
+    /* send all data to this function  */
+    curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteCallback);
 
-  /* some servers do not like requests that are made without a user-agent
-     field, so we provide one */
-  curl_easy_setopt(curl_handle, CURLOPT_USERAGENT,
-                   "libcurl-speedchecker/" CHKSPEED_VERSION);
+    /* some servers do not like requests that are made without a user-agent
+       field, so we provide one */
+    curl_easy_setopt(curl_handle, CURLOPT_USERAGENT,
+                     "libcurl-speedchecker/" CHKSPEED_VERSION);
 
-  /* get it! */
-  res = curl_easy_perform(curl_handle);
+    /* get it! */
+    res = curl_easy_perform(curl_handle);
 
-  if(CURLE_OK == res) {
-    curl_off_t val;
+    if(CURLE_OK == res) {
+      curl_off_t val;
 
-    /* check for bytes downloaded */
-    res = curl_easy_getinfo(curl_handle, CURLINFO_SIZE_DOWNLOAD_T, &val);
-    if((CURLE_OK == res) && (val > 0))
-      printf("Data downloaded: %lu bytes.\n", (unsigned long)val);
-
-    /* check for total download time */
-    res = curl_easy_getinfo(curl_handle, CURLINFO_TOTAL_TIME_T, &val);
-    if((CURLE_OK == res) && (val > 0))
-      printf("Total download time: %lu.%06lu sec.\n",
-             (unsigned long)(val / 1000000), (unsigned long)(val % 1000000));
-
-    /* check for average download speed */
-    res = curl_easy_getinfo(curl_handle, CURLINFO_SPEED_DOWNLOAD_T, &val);
-    if((CURLE_OK == res) && (val > 0))
-      printf("Average download speed: %lu kbyte/sec.\n",
-             (unsigned long)(val / 1024));
+      /* check for bytes downloaded */
+      res = curl_easy_getinfo(curl_handle, CURLINFO_SIZE_DOWNLOAD_T, &val);
+      if((CURLE_OK == res) && (val > 0))
+        printf("Data downloaded: %lu bytes.\n", (unsigned long)val);
 
-    if(prtall) {
-      /* check for name resolution time */
-      res = curl_easy_getinfo(curl_handle, CURLINFO_NAMELOOKUP_TIME_T, &val);
+      /* check for total download time */
+      res = curl_easy_getinfo(curl_handle, CURLINFO_TOTAL_TIME_T, &val);
       if((CURLE_OK == res) && (val > 0))
-        printf("Name lookup time: %lu.%06lu sec.\n",
-               (unsigned long)(val / 1000000), (unsigned long)(val % 1000000));
+        printf("Total download time: %lu.%06lu sec.\n",
+               (unsigned long)(val / 1000000),
+               (unsigned long)(val % 1000000));
 
-      /* check for connect time */
-      res = curl_easy_getinfo(curl_handle, CURLINFO_CONNECT_TIME_T, &val);
+      /* check for average download speed */
+      res = curl_easy_getinfo(curl_handle, CURLINFO_SPEED_DOWNLOAD_T, &val);
       if((CURLE_OK == res) && (val > 0))
-        printf("Connect time: %lu.%06lu sec.\n",
-               (unsigned long)(val / 1000000), (unsigned long)(val % 1000000));
+        printf("Average download speed: %lu kbyte/sec.\n",
+               (unsigned long)(val / 1024));
+
+      if(prtall) {
+        /* check for name resolution time */
+        res = curl_easy_getinfo(curl_handle, CURLINFO_NAMELOOKUP_TIME_T, &val);
+        if((CURLE_OK == res) && (val > 0))
+          printf("Name lookup time: %lu.%06lu sec.\n",
+                 (unsigned long)(val / 1000000),
+                 (unsigned long)(val % 1000000));
+
+        /* check for connect time */
+        res = curl_easy_getinfo(curl_handle, CURLINFO_CONNECT_TIME_T, &val);
+        if((CURLE_OK == res) && (val > 0))
+          printf("Connect time: %lu.%06lu sec.\n",
+                 (unsigned long)(val / 1000000),
+                 (unsigned long)(val % 1000000));
+      }
+    }
+    else {
+      fprintf(stderr, "Error while fetching '%s' : %s\n",
+              url, curl_easy_strerror(res));
     }
-  }
-  else {
-    fprintf(stderr, "Error while fetching '%s' : %s\n",
-            url, curl_easy_strerror(res));
-  }
 
-  /* cleanup curl stuff */
-  curl_easy_cleanup(curl_handle);
+    /* cleanup curl stuff */
+    curl_easy_cleanup(curl_handle);
+  }
 
   /* we are done with libcurl, so clean it up */
   curl_global_cleanup();
index a7ca5fa2fe40c185f0c247dd21a1ee5943b26801..e8dbf244f91e4d7aa97b0954527ce7829dd888e8 100644 (file)
@@ -191,67 +191,70 @@ int main(void)
   signal(SIGINT, sighandler);
   LIBXML_TEST_VERSION
   multi_handle = curl_multi_init();
-  curl_multi_setopt(multi_handle, CURLMOPT_MAX_TOTAL_CONNECTIONS, max_con);
-  curl_multi_setopt(multi_handle, CURLMOPT_MAX_HOST_CONNECTIONS, 6L);
+  if(multi_handle) {
+    curl_multi_setopt(multi_handle, CURLMOPT_MAX_TOTAL_CONNECTIONS, max_con);
+    curl_multi_setopt(multi_handle, CURLMOPT_MAX_HOST_CONNECTIONS, 6L);
 
-  /* enables http/2 if available */
+    /* enables http/2 if available */
 #ifdef CURLPIPE_MULTIPLEX
-  curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
+    curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
 #endif
 
-  /* sets html start page */
-  curl_multi_add_handle(multi_handle, make_handle(start_page));
+    /* sets html start page */
+    curl_multi_add_handle(multi_handle, make_handle(start_page));
 
-  pending = 0;
-  complete = 0;
-  still_running = 1;
-  while(still_running && !pending_interrupt) {
-    int numfds;
-    CURLMsg *m;
+    pending = 0;
+    complete = 0;
+    still_running = 1;
+    while(still_running && !pending_interrupt) {
+      int numfds;
+      CURLMsg *m;
 
-    curl_multi_wait(multi_handle, NULL, 0, 1000, &numfds);
-    curl_multi_perform(multi_handle, &still_running);
+      curl_multi_wait(multi_handle, NULL, 0, 1000, &numfds);
+      curl_multi_perform(multi_handle, &still_running);
 
-    /* See how the transfers went */
-    m = NULL;
-    while((m = curl_multi_info_read(multi_handle, &msgs_left))) {
-      if(m->msg == CURLMSG_DONE) {
-        CURL *handle = m->easy_handle;
-        char *url;
-        struct memory *mem;
-        curl_easy_getinfo(handle, CURLINFO_PRIVATE, &mem);
-        curl_easy_getinfo(handle, CURLINFO_EFFECTIVE_URL, &url);
-        if(m->data.result == CURLE_OK) {
-          long res_status;
-          curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &res_status);
-          if(res_status == 200) {
-            char *ctype;
-            curl_easy_getinfo(handle, CURLINFO_CONTENT_TYPE, &ctype);
-            printf("[%d] HTTP 200 (%s): %s\n", complete, ctype, url);
-            if(is_html(ctype) && mem->size > 100) {
-              if(pending < max_requests && (complete + pending) < max_total) {
-                pending += follow_links(multi_handle, mem, url);
-                still_running = 1;
+      /* See how the transfers went */
+      m = NULL;
+      while((m = curl_multi_info_read(multi_handle, &msgs_left))) {
+        if(m->msg == CURLMSG_DONE) {
+          CURL *handle = m->easy_handle;
+          char *url;
+          struct memory *mem;
+          curl_easy_getinfo(handle, CURLINFO_PRIVATE, &mem);
+          curl_easy_getinfo(handle, CURLINFO_EFFECTIVE_URL, &url);
+          if(m->data.result == CURLE_OK) {
+            long res_status;
+            curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &res_status);
+            if(res_status == 200) {
+              char *ctype;
+              curl_easy_getinfo(handle, CURLINFO_CONTENT_TYPE, &ctype);
+              printf("[%d] HTTP 200 (%s): %s\n", complete, ctype, url);
+              if(is_html(ctype) && mem->size > 100) {
+                if(pending < max_requests &&
+                   (complete + pending) < max_total) {
+                  pending += follow_links(multi_handle, mem, url);
+                  still_running = 1;
+                }
               }
             }
+            else {
+              printf("[%d] HTTP %d: %s\n", complete, (int) res_status, url);
+            }
           }
           else {
-            printf("[%d] HTTP %d: %s\n", complete, (int) res_status, url);
+            printf("[%d] Connection failure: %s\n", complete, url);
           }
+          curl_multi_remove_handle(multi_handle, handle);
+          curl_easy_cleanup(handle);
+          free(mem->buf);
+          free(mem);
+          complete++;
+          pending--;
         }
-        else {
-          printf("[%d] Connection failure: %s\n", complete, url);
-        }
-        curl_multi_remove_handle(multi_handle, handle);
-        curl_easy_cleanup(handle);
-        free(mem->buf);
-        free(mem);
-        complete++;
-        pending--;
       }
     }
+    curl_multi_cleanup(multi_handle);
   }
-  curl_multi_cleanup(multi_handle);
   curl_global_cleanup();
   return 0;
 }
index 85fdea95d32937db6a92e986e47b77f1d320f29d..3c8355df05cfcdd59f0ecc6574a66357f004846c 100644 (file)
@@ -32,10 +32,8 @@ struct data {
   char trace_ascii; /* 1 or 0 */
 };
 
-static
-void dump(const char *text,
-          FILE *stream, unsigned char *ptr, size_t size,
-          char nohex)
+static void dump(const char *text, FILE *stream, unsigned char *ptr,
+                 size_t size, char nohex)
 {
   size_t i;
   size_t c;
@@ -83,10 +81,8 @@ void dump(const char *text,
   fflush(stream);
 }
 
-static
-int my_trace(CURL *handle, curl_infotype type,
-             char *data, size_t size,
-             void *userp)
+static int my_trace(CURL *handle, curl_infotype type,
+                    char *data, size_t size, void *userp)
 {
   struct data *config = (struct data *)userp;
   const char *text;
index 7b6a6e3d2daed6a4e6a1e259b005d04e8857a3fd..6dce4ab7496ae547017903be80c11d8059dfd66b 100644 (file)
@@ -30,8 +30,7 @@
  * in a separate file using our own callback!
  * </DESC>
  */
-static size_t
-write_response(void *ptr, size_t size, size_t nmemb, void *data)
+static size_t write_response(void *ptr, size_t size, size_t nmemb, void *data)
 {
   FILE *writehere = (FILE *)data;
   return fwrite(ptr, size, nmemb, writehere);
@@ -88,5 +87,7 @@ int main(void)
   fclose(ftpfile); /* close the local file */
   fclose(respfile); /* close the response file */
 
+  curl_global_cleanup();
+
   return (int)res;
 }
index 7588a829532f87036fdb82511021d97721c1f48e..2bfb51f66e7ceb75906f05d24f10ce1deaede89a 100644 (file)
@@ -84,8 +84,8 @@ int main(void)
   curl_off_t fsize;
 
   struct curl_slist *headerlist = NULL;
-  static const char buf_1 [] = "RNFR " UPLOAD_FILE_AS;
-  static const char buf_2 [] = "RNTO " RENAME_FILE_TO;
+  static const char buf_1[] = "RNFR " UPLOAD_FILE_AS;
+  static const char buf_2[] = "RNTO " RENAME_FILE_TO;
 
   /* get a FILE * of the file */
   hd_src = fopen(LOCAL_FILE, "rb");
index 544b746873ce5e8a60378c510750fa7ebc243904..13df8541a2d69377d014799280678b13f40bc92b 100644 (file)
@@ -159,11 +159,13 @@ int main(void)
     return (int)res;
 
   curlhandle = curl_easy_init();
+  if(curlhandle) {
 
-  upload(curlhandle, "ftp://user:pass@example.com/path/file", "C:\\file",
-         0, 3);
+    upload(curlhandle, "ftp://user:pass@example.com/path/file", "C:\\file",
+           0, 3);
 
-  curl_easy_cleanup(curlhandle);
+    curl_easy_cleanup(curlhandle);
+  }
   curl_global_cleanup();
 
   return 0;
index 589047097b54f218e0f82aad995eb50a76031b6a..aa31654c168a11607f5468a1e8ebe96d9c3de393 100644 (file)
@@ -38,8 +38,8 @@ struct MemoryStruct {
   size_t size;
 };
 
-static size_t
-WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
+static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb,
+                                  void *userp)
 {
   size_t realsize = size * nmemb;
   struct MemoryStruct *mem = (struct MemoryStruct *)userp;
@@ -75,41 +75,43 @@ int main(void)
 
   /* init the curl session */
   curl_handle = curl_easy_init();
-
-  /* specify URL to get */
-  curl_easy_setopt(curl_handle, CURLOPT_URL, "https://www.example.com/");
-
-  /* send all data to this function  */
-  curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
-
-  /* we pass our 'chunk' struct to the callback function */
-  curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
-
-  /* some servers do not like requests that are made without a user-agent
-     field, so we provide one */
-  curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
-
-  /* get it! */
-  res = curl_easy_perform(curl_handle);
-
-  /* check for errors */
-  if(res != CURLE_OK) {
-    fprintf(stderr, "curl_easy_perform() failed: %s\n",
-            curl_easy_strerror(res));
+  if(curl_handle) {
+
+    /* specify URL to get */
+    curl_easy_setopt(curl_handle, CURLOPT_URL, "https://www.example.com/");
+
+    /* send all data to this function  */
+    curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
+
+    /* we pass our 'chunk' struct to the callback function */
+    curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
+
+    /* some servers do not like requests that are made without a user-agent
+       field, so we provide one */
+    curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
+
+    /* get it! */
+    res = curl_easy_perform(curl_handle);
+
+    /* check for errors */
+    if(res != CURLE_OK) {
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
+    }
+    else {
+      /*
+       * Now, our chunk.memory points to a memory block that is chunk.size
+       * bytes big and contains the remote file.
+       *
+       * Do something nice with it!
+       */
+
+      printf("%lu bytes retrieved\n", (unsigned long)chunk.size);
+    }
+
+    /* cleanup curl stuff */
+    curl_easy_cleanup(curl_handle);
   }
-  else {
-    /*
-     * Now, our chunk.memory points to a memory block that is chunk.size
-     * bytes big and contains the remote file.
-     *
-     * Do something nice with it!
-     */
-
-    printf("%lu bytes retrieved\n", (unsigned long)chunk.size);
-  }
-
-  /* cleanup curl stuff */
-  curl_easy_cleanup(curl_handle);
 
   free(chunk.memory);
 
index 50308fd47c385102601c0fc981a57230decd799c..e9844fc89e010079d5078da6761017c42d4376ee 100644 (file)
@@ -434,16 +434,18 @@ int main(void)
   g_io_add_watch(ch, G_IO_IN, fifo_cb, g);
   gmain = g_main_loop_new(NULL, FALSE);
   g->multi = curl_multi_init();
-  curl_multi_setopt(g->multi, CURLMOPT_SOCKETFUNCTION, sock_cb);
-  curl_multi_setopt(g->multi, CURLMOPT_SOCKETDATA, g);
-  curl_multi_setopt(g->multi, CURLMOPT_TIMERFUNCTION, update_timeout_cb);
-  curl_multi_setopt(g->multi, CURLMOPT_TIMERDATA, g);
+  if(g->multi) {
+    curl_multi_setopt(g->multi, CURLMOPT_SOCKETFUNCTION, sock_cb);
+    curl_multi_setopt(g->multi, CURLMOPT_SOCKETDATA, g);
+    curl_multi_setopt(g->multi, CURLMOPT_TIMERFUNCTION, update_timeout_cb);
+    curl_multi_setopt(g->multi, CURLMOPT_TIMERDATA, g);
 
-  /* we do not call any curl_multi_socket*() function yet as we have no handles
-     added! */
+    /* we do not call any curl_multi_socket*() function yet as we have no
+       handles added! */
 
-  g_main_loop_run(gmain);
-  curl_multi_cleanup(g->multi);
+    g_main_loop_run(gmain);
+    curl_multi_cleanup(g->multi);
+  }
   curl_global_cleanup();
   return 0;
 }
index 952132fbc4975ee4bcbaafba706580e592cba831..0bf3155570ced06e8fc0ad724ea7c901e55a70e9 100644 (file)
@@ -92,42 +92,47 @@ int main(int argc, char **argv)
   if(res)
     return (int)res;
 
-  curl = curl_easy_init();
-  curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
-  curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_errbuf);
-  curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
-  curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
-  curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
-
   tdoc = tidyCreate();
   tidyOptSetBool(tdoc, TidyForceOutput, yes); /* try harder */
   tidyOptSetInt(tdoc, TidyWrapLen, 4096);
   tidySetErrorBuffer(tdoc, &tidy_errbuf);
   tidyBufInit(&docbuf);
 
-  curl_easy_setopt(curl, CURLOPT_WRITEDATA, &docbuf);
-  res = curl_easy_perform(curl);
-  if(!res) {
-    res = tidyParseBuffer(tdoc, &docbuf); /* parse the input */
-    if(res >= 0) {
-      res = tidyCleanAndRepair(tdoc); /* fix any problems */
+  curl = curl_easy_init();
+  if(curl) {
+    curl_easy_setopt(curl, CURLOPT_URL, argv[1]);
+    curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_errbuf);
+    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
+    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_cb);
+
+    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &docbuf);
+    res = curl_easy_perform(curl);
+    if(!res) {
+      res = tidyParseBuffer(tdoc, &docbuf); /* parse the input */
       if(res >= 0) {
-        res = tidyRunDiagnostics(tdoc); /* load tidy error buffer */
+        res = tidyCleanAndRepair(tdoc); /* fix any problems */
         if(res >= 0) {
-          dumpNode(tdoc, tidyGetRoot(tdoc), 0); /* walk the tree */
-          fprintf(stderr, "%s\n", tidy_errbuf.bp); /* show errors */
+          res = tidyRunDiagnostics(tdoc); /* load tidy error buffer */
+          if(res >= 0) {
+            dumpNode(tdoc, tidyGetRoot(tdoc), 0); /* walk the tree */
+            fprintf(stderr, "%s\n", tidy_errbuf.bp); /* show errors */
+          }
         }
       }
     }
+    else
+      fprintf(stderr, "%s\n", curl_errbuf);
+
+    /* clean-up */
+    curl_easy_cleanup(curl);
   }
-  else
-    fprintf(stderr, "%s\n", curl_errbuf);
 
-  /* clean-up */
-  curl_easy_cleanup(curl);
-  curl_global_cleanup();
   tidyBufFree(&docbuf);
   tidyBufFree(&tidy_errbuf);
   tidyRelease(tdoc);
+
+  curl_global_cleanup();
+
   return (int)res;
 }
index 6343234667623a59622ee1ade3687a98ef1df6db..06902415e18d020e8267d8f3e8e7c90e319f2d9d 100644 (file)
@@ -56,9 +56,8 @@ struct transfer {
 
 #define NUM_HANDLES 1000
 
-static
-void dump(const char *text, unsigned int num, unsigned char *ptr, size_t size,
-          char nohex)
+static void dump(const char *text, unsigned int num, unsigned char *ptr,
+                 size_t size, char nohex)
 {
   size_t i;
   size_t c;
@@ -105,10 +104,8 @@ void dump(const char *text, unsigned int num, unsigned char *ptr, size_t size,
   }
 }
 
-static
-int my_trace(CURL *handle, curl_infotype type,
-             char *data, size_t size,
-             void *userp)
+static int my_trace(CURL *handle, curl_infotype type,
+                    char *data, size_t size, void *userp)
 {
   const char *text;
   struct transfer *t = (struct transfer *)userp;
@@ -210,6 +207,8 @@ int main(int argc, char **argv)
   if(res)
     return (int)res;
 
+  memset(trans, 0, sizeof(trans));
+
   /* init a multi stack */
   multi_handle = curl_multi_init();
 
@@ -242,6 +241,7 @@ int main(int argc, char **argv)
   }
 
   curl_multi_cleanup(multi_handle);
+  curl_global_cleanup();
 
   return 0;
 }
index 3e2b4af1c2a1ea63ac4d78b48859c8aac5482fa0..85bf0e34a74575ca746c61ff7a0d185946a1e20a 100644 (file)
@@ -37,8 +37,7 @@ struct Memory {
   size_t size;
 };
 
-static size_t
-write_cb(void *contents, size_t size, size_t nmemb, void *userp)
+static size_t write_cb(void *contents, size_t size, size_t nmemb, void *userp)
 {
   size_t realsize = size * nmemb;
   struct Memory *mem = (struct Memory *)userp;
@@ -125,10 +124,8 @@ int main(void)
 {
   CURL *easy;
   CURLM *multi;
-  int still_running; /* keep number of running handles */
   int transfers = 1; /* we start with one */
   int i;
-  struct CURLMsg *m;
 
   CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
   if(res)
@@ -150,7 +147,10 @@ int main(void)
   curl_multi_setopt(multi, CURLMOPT_PUSHDATA, &transfers);
 
   while(transfers) {
+    struct CURLMsg *m;
+    int still_running; /* keep number of running handles */
     int rc;
+
     CURLMcode mcode = curl_multi_perform(multi, &still_running);
     if(mcode)
       break;
@@ -173,7 +173,6 @@ int main(void)
         curl_easy_cleanup(e);
       }
     } while(m);
-
   }
 
   curl_multi_cleanup(multi);
index 0d0e991776d956c38eb3d57ca5ec22e20616c952..e97be991a8cb53c42fdd906a8ffcccc19077eecb 100644 (file)
@@ -40,9 +40,7 @@
 #error "too old libcurl, cannot do HTTP/2 server push!"
 #endif
 
-static
-void dump(const char *text, unsigned char *ptr, size_t size,
-          char nohex)
+static void dump(const char *text, unsigned char *ptr, size_t size, char nohex)
 {
   size_t i;
   size_t c;
@@ -89,10 +87,8 @@ void dump(const char *text, unsigned char *ptr, size_t size,
   }
 }
 
-static
-int my_trace(CURL *handle, curl_infotype type,
-             char *data, size_t size,
-             void *userp)
+static int my_trace(CURL *handle, curl_infotype type,
+                    char *data, size_t size, void *userp)
 {
   const char *text;
   (void)handle;
@@ -216,7 +212,6 @@ int main(int argc, char *argv[])
   CURL *easy;
   CURLM *multi_handle;
   int transfers = 1; /* we start with one */
-  struct CURLMsg *m;
   const char *url = "https://localhost:8443/index.html";
 
   if(argc == 2)
@@ -246,6 +241,7 @@ int main(int argc, char *argv[])
   curl_multi_setopt(multi_handle, CURLMOPT_PUSHDATA, &transfers);
 
   do {
+    struct CURLMsg *m;
     int still_running; /* keep number of running handles */
     CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
 
index 9cc3c5652cbc37ef4edc4cf004142290231e7d0b..55162c03a3adf8193e662a117235e65b15c907d0 100644 (file)
@@ -68,8 +68,7 @@
 
 #ifdef _MSC_VER
 #define gettimeofday(a, b) my_gettimeofday((a), (b))
-static
-int my_gettimeofday(struct timeval *tp, void *tzp)
+static int my_gettimeofday(struct timeval *tp, void *tzp)
 {
   (void)tzp;
   if(tp) {
@@ -89,14 +88,14 @@ int my_gettimeofday(struct timeval *tp, void *tzp)
 
 struct input {
   FILE *in;
+  FILE *out;
   size_t bytes_read; /* count up */
   CURL *hnd;
   int num;
 };
 
-static
-void dump(const char *text, int num, unsigned char *ptr, size_t size,
-          char nohex)
+static void dump(const char *text, int num, unsigned char *ptr, size_t size,
+                 char nohex)
 {
   size_t i;
   size_t c;
@@ -142,10 +141,8 @@ void dump(const char *text, int num, unsigned char *ptr, size_t size,
   }
 }
 
-static
-int my_trace(CURL *handle, curl_infotype type,
-             char *data, size_t size,
-             void *userp)
+static int my_trace(CURL *handle, curl_infotype type, char *data,
+                    size_t size, void *userp)
 {
   char timebuf[60];
   const char *text;
@@ -208,7 +205,6 @@ static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *userp)
 
 static int setup(struct input *i, int num, const char *upload)
 {
-  FILE *out;
   char url[256];
   char filename[128];
   struct stat file_info;
@@ -219,8 +215,8 @@ static int setup(struct input *i, int num, const char *upload)
 
   i->num = num;
   snprintf(filename, sizeof(filename), "dl-%d", num);
-  out = fopen(filename, "wb");
-  if(!out) {
+  i->out = fopen(filename, "wb");
+  if(!i->out) {
     fprintf(stderr, "error: could not open file %s for writing: %s\n", upload,
             strerror(errno));
     return 1;
@@ -232,7 +228,8 @@ static int setup(struct input *i, int num, const char *upload)
   if(!i->in) {
     fprintf(stderr, "error: could not open file %s for reading: %s\n", upload,
             strerror(errno));
-    fclose(out);
+    fclose(i->out);
+    i->out = NULL;
     return 1;
   }
 
@@ -244,46 +241,49 @@ static int setup(struct input *i, int num, const char *upload)
 #endif
     fprintf(stderr, "error: could not stat file %s: %s\n", upload,
             strerror(errno));
-    fclose(out);
+    fclose(i->out);
+    i->out = NULL;
     return 1;
   }
 
   uploadsize = file_info.st_size;
 
   hnd = i->hnd = curl_easy_init();
+  if(hnd) {
 
-  /* write to this file */
-  curl_easy_setopt(hnd, CURLOPT_WRITEDATA, out);
+    /* write to this file */
+    curl_easy_setopt(hnd, CURLOPT_WRITEDATA, i->out);
 
-  /* we want to use our own read function */
-  curl_easy_setopt(hnd, CURLOPT_READFUNCTION, read_callback);
-  /* read from this file */
-  curl_easy_setopt(hnd, CURLOPT_READDATA, i);
-  /* provide the size of the upload */
-  curl_easy_setopt(hnd, CURLOPT_INFILESIZE_LARGE, uploadsize);
+    /* we want to use our own read function */
+    curl_easy_setopt(hnd, CURLOPT_READFUNCTION, read_callback);
+    /* read from this file */
+    curl_easy_setopt(hnd, CURLOPT_READDATA, i);
+    /* provide the size of the upload */
+    curl_easy_setopt(hnd, CURLOPT_INFILESIZE_LARGE, uploadsize);
 
-  /* send in the URL to store the upload as */
-  curl_easy_setopt(hnd, CURLOPT_URL, url);
+    /* send in the URL to store the upload as */
+    curl_easy_setopt(hnd, CURLOPT_URL, url);
 
-  /* upload please */
-  curl_easy_setopt(hnd, CURLOPT_UPLOAD, 1L);
+    /* upload please */
+    curl_easy_setopt(hnd, CURLOPT_UPLOAD, 1L);
 
-  /* please be verbose */
-  curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
-  curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, my_trace);
-  curl_easy_setopt(hnd, CURLOPT_DEBUGDATA, i);
+    /* please be verbose */
+    curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
+    curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, my_trace);
+    curl_easy_setopt(hnd, CURLOPT_DEBUGDATA, i);
 
-  /* HTTP/2 please */
-  curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
+    /* HTTP/2 please */
+    curl_easy_setopt(hnd, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
 
-  /* we use a self-signed test server, skip verification during debugging */
-  curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYPEER, 0L);
-  curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYHOST, 0L);
+    /* we use a self-signed test server, skip verification during debugging */
+    curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYPEER, 0L);
+    curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYHOST, 0L);
 
 #if (CURLPIPE_MULTIPLEX > 0)
-  /* wait for pipe connection to confirm */
-  curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
+    /* wait for pipe connection to confirm */
+    curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
 #endif
+  }
   return 0;
 }
 
@@ -296,7 +296,6 @@ int main(int argc, char **argv)
   struct input trans[NUM_HANDLES];
   CURLM *multi_handle;
   int i;
-  int still_running = 0; /* keep number of running handles */
   const char *filename = "index.html";
   int num_transfers;
 
@@ -318,41 +317,54 @@ int main(int argc, char **argv)
   if(res)
     return (int)res;
 
+  memset(trans, 0, sizeof(trans));
+
   /* init a multi stack */
   multi_handle = curl_multi_init();
+  if(multi_handle) {
 
-  for(i = 0; i < num_transfers; i++) {
-    if(setup(&trans[i], i, filename)) {
-      curl_global_cleanup();
-      return 1;
+    int still_running = 0; /* keep number of running handles */
+
+    for(i = 0; i < num_transfers; i++) {
+      if(setup(&trans[i], i, filename)) {
+        curl_global_cleanup();
+        return 1;
+      }
+
+      /* add the individual transfer */
+      curl_multi_add_handle(multi_handle, trans[i].hnd);
     }
 
-    /* add the individual transfer */
-    curl_multi_add_handle(multi_handle, trans[i].hnd);
-  }
+    curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
 
-  curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
+    /* We do HTTP/2 so let's stick to one connection per host */
+    curl_multi_setopt(multi_handle, CURLMOPT_MAX_HOST_CONNECTIONS, 1L);
 
-  /* We do HTTP/2 so let's stick to one connection per host */
-  curl_multi_setopt(multi_handle, CURLMOPT_MAX_HOST_CONNECTIONS, 1L);
+    do {
+      CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
 
-  do {
-    CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
+      if(still_running)
+        /* wait for activity, timeout or "nothing" */
+        mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
 
-    if(still_running)
-      /* wait for activity, timeout or "nothing" */
-      mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
+      if(mc)
+        break;
 
-    if(mc)
-      break;
+    } while(still_running);
 
-  } while(still_running);
+    for(i = 0; i < num_transfers; i++)
+      curl_multi_remove_handle(multi_handle, trans[i].hnd);
 
-  curl_multi_cleanup(multi_handle);
+    curl_multi_cleanup(multi_handle);
+  }
 
   for(i = 0; i < num_transfers; i++) {
-    curl_multi_remove_handle(multi_handle, trans[i].hnd);
     curl_easy_cleanup(trans[i].hnd);
+
+    if(trans[i].in)
+      fclose(trans[i].in);
+    if(trans[i].out)
+      fclose(trans[i].out);
   }
 
   curl_global_cleanup();
index 8deee683709cb60b648af0e12307f47e697db7e8..7dab0b04f1474757228cfb35605647585f85d958 100644 (file)
  * Download an HTTP file and upload an FTP file simultaneously.
  */
 
-#define HANDLECOUNT 2   /* Number of simultaneous transfers */
 #define HTTP_HANDLE 0   /* Index for the HTTP transfer */
 #define FTP_HANDLE 1    /* Index for the FTP transfer */
+#define HANDLECOUNT 2   /* Number of simultaneous transfers */
 
 int main(void)
 {
   CURL *handles[HANDLECOUNT];
   CURLM *multi_handle;
 
-  int still_running = 1; /* keep number of running handles */
   int i;
 
-  CURLMsg *msg; /* for picking up messages with the transfer status */
-  int msgs_left; /* how many messages are left */
-
   CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
   if(res)
     return (int)res;
@@ -68,52 +64,63 @@ int main(void)
 
   /* init a multi stack */
   multi_handle = curl_multi_init();
+  if(multi_handle) {
 
-  /* add the individual transfers */
-  for(i = 0; i < HANDLECOUNT; i++)
-    curl_multi_add_handle(multi_handle, handles[i]);
+    int still_running = 1; /* keep number of running handles */
 
-  while(still_running) {
-    CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
+    CURLMsg *msg; /* for picking up messages with the transfer status */
+    int msgs_left; /* how many messages are left */
 
-    if(still_running)
-      /* wait for activity, timeout or "nothing" */
-      mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
+    /* add the individual transfers */
+    for(i = 0; i < HANDLECOUNT; i++)
+      curl_multi_add_handle(multi_handle, handles[i]);
 
-    if(mc)
-      break;
-  }
-  /* See how the transfers went */
-  /* !checksrc! disable EQUALSNULL 1 */
-  while((msg = curl_multi_info_read(multi_handle, &msgs_left)) != NULL) {
-    if(msg->msg == CURLMSG_DONE) {
-      int idx;
-
-      /* Find out which handle this message is about */
-      for(idx = 0; idx < HANDLECOUNT; idx++) {
-        int found = (msg->easy_handle == handles[idx]);
-        if(found)
-          break;
-      }
+    while(still_running) {
+      CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
 
-      switch(idx) {
-      case HTTP_HANDLE:
-        printf("HTTP transfer completed with status %d\n", msg->data.result);
-        break;
-      case FTP_HANDLE:
-        printf("FTP transfer completed with status %d\n", msg->data.result);
+      if(still_running)
+        /* wait for activity, timeout or "nothing" */
+        mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
+
+      if(mc)
         break;
+    }
+
+    /* See how the transfers went */
+    /* !checksrc! disable EQUALSNULL 1 */
+    while((msg = curl_multi_info_read(multi_handle, &msgs_left)) != NULL) {
+      if(msg->msg == CURLMSG_DONE) {
+        int idx;
+
+        /* Find out which handle this message is about */
+        for(idx = 0; idx < HANDLECOUNT; idx++) {
+          int found = (msg->easy_handle == handles[idx]);
+          if(found)
+            break;
+        }
+
+        switch(idx) {
+        case HTTP_HANDLE:
+          printf("HTTP transfer completed with status %d\n", msg->data.result);
+          break;
+        case FTP_HANDLE:
+          printf("FTP transfer completed with status %d\n", msg->data.result);
+          break;
+        }
       }
     }
+
+    /* remove the transfers */
+    for(i = 0; i < HANDLECOUNT; i++)
+      curl_multi_remove_handle(multi_handle, handles[i]);
+
+    curl_multi_cleanup(multi_handle);
   }
 
-  /* remove the transfers and cleanup the handles */
-  for(i = 0; i < HANDLECOUNT; i++) {
-    curl_multi_remove_handle(multi_handle, handles[i]);
+  /* Free the curl handles */
+  for(i = 0; i < HANDLECOUNT; i++)
     curl_easy_cleanup(handles[i]);
-  }
 
-  curl_multi_cleanup(multi_handle);
   curl_global_cleanup();
 
   return 0;
index a27c238a579143b1d5733347508edccc34fc3787..278a5b4a2e1e00dc330b56b5cb03bf97e63bc308 100644 (file)
@@ -83,10 +83,9 @@ static void dump(const char *text, FILE *stream, unsigned char *ptr,
   fflush(stream);
 }
 
-static
-int my_trace(CURL *handle, curl_infotype type,
-             unsigned char *data, size_t size,
-             void *userp)
+static int my_trace(CURL *handle, curl_infotype type,
+                    unsigned char *data, size_t size,
+                    void *userp)
 {
   const char *text;
 
@@ -123,43 +122,48 @@ int my_trace(CURL *handle, curl_infotype type,
 int main(void)
 {
   CURL *http_handle;
-  CURLM *multi_handle;
-
-  int still_running = 0; /* keep number of running handles */
 
   CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
   if(res)
     return (int)res;
 
   http_handle = curl_easy_init();
+  if(http_handle) {
+
+    CURLM *multi_handle;
 
-  /* set the options (I left out a few, you get the point anyway) */
-  curl_easy_setopt(http_handle, CURLOPT_URL, "https://www.example.com/");
+    /* set the options (I left out a few, you get the point anyway) */
+    curl_easy_setopt(http_handle, CURLOPT_URL, "https://www.example.com/");
 
-  curl_easy_setopt(http_handle, CURLOPT_DEBUGFUNCTION, my_trace);
-  curl_easy_setopt(http_handle, CURLOPT_VERBOSE, 1L);
+    curl_easy_setopt(http_handle, CURLOPT_DEBUGFUNCTION, my_trace);
+    curl_easy_setopt(http_handle, CURLOPT_VERBOSE, 1L);
 
-  /* init a multi stack */
-  multi_handle = curl_multi_init();
+    /* init a multi stack */
+    multi_handle = curl_multi_init();
+    if(multi_handle) {
 
-  /* add the individual transfers */
-  curl_multi_add_handle(multi_handle, http_handle);
+      int still_running = 0; /* keep number of running handles */
 
-  do {
-    CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
+      /* add the individual transfers */
+      curl_multi_add_handle(multi_handle, http_handle);
 
-    if(still_running)
-      /* wait for activity, timeout or "nothing" */
-      mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
+      do {
+        CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
 
-    if(mc)
-      break;
+        if(still_running)
+          /* wait for activity, timeout or "nothing" */
+          mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
 
-  } while(still_running);
+        if(mc)
+          break;
 
-  curl_multi_cleanup(multi_handle);
+      } while(still_running);
 
-  curl_easy_cleanup(http_handle);
+      curl_multi_cleanup(multi_handle);
+    }
+
+    curl_easy_cleanup(http_handle);
+  }
 
   curl_global_cleanup();
 
index 8c5c5d687ad3233e47f95821ff01f934c7e36e42..71ac7422d6d276edfc837936f1fdcee27cf22226 100644 (file)
@@ -38,9 +38,6 @@ int main(void)
 {
   CURL *http_handle;
   CURL *http_handle2;
-  CURLM *multi_handle;
-
-  int still_running = 1; /* keep number of running handles */
 
   CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
   if(res)
@@ -49,46 +46,57 @@ int main(void)
   http_handle = curl_easy_init();
   http_handle2 = curl_easy_init();
 
-  /* set options */
-  curl_easy_setopt(http_handle, CURLOPT_URL, "https://www.example.com/");
+  if(http_handle &&
+     http_handle2) {
+
+    CURLM *multi_handle;
+
+    /* set options */
+    curl_easy_setopt(http_handle, CURLOPT_URL, "https://www.example.com/");
+
+    /* set options */
+    curl_easy_setopt(http_handle2, CURLOPT_URL, "http://localhost/");
 
-  /* set options */
-  curl_easy_setopt(http_handle2, CURLOPT_URL, "http://localhost/");
+    /* init a multi stack */
+    multi_handle = curl_multi_init();
+    if(multi_handle) {
 
-  /* init a multi stack */
-  multi_handle = curl_multi_init();
+      int still_running = 1; /* keep number of running handles */
 
-  /* add the individual transfers */
-  curl_multi_add_handle(multi_handle, http_handle);
-  curl_multi_add_handle(multi_handle, http_handle2);
+      /* add the individual transfers */
+      curl_multi_add_handle(multi_handle, http_handle);
+      curl_multi_add_handle(multi_handle, http_handle2);
 
-  while(still_running) {
-    CURLMsg *msg;
-    int queued;
-    CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
+      while(still_running) {
+        CURLMsg *msg;
+        int queued;
 
-    if(still_running)
-      /* wait for activity, timeout or "nothing" */
-      mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
+        CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
 
-    if(mc)
-      break;
+        if(still_running)
+          /* wait for activity, timeout or "nothing" */
+          mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
 
-    do {
-      msg = curl_multi_info_read(multi_handle, &queued);
-      if(msg) {
-        if(msg->msg == CURLMSG_DONE) {
-          /* a transfer ended */
-          fprintf(stderr, "Transfer completed\n");
-        }
+        if(mc)
+          break;
+
+        do {
+          msg = curl_multi_info_read(multi_handle, &queued);
+          if(msg) {
+            if(msg->msg == CURLMSG_DONE) {
+              /* a transfer ended */
+              fprintf(stderr, "Transfer completed\n");
+            }
+          }
+        } while(msg);
       }
-    } while(msg);
-  }
 
-  curl_multi_remove_handle(multi_handle, http_handle);
-  curl_multi_remove_handle(multi_handle, http_handle2);
+      curl_multi_remove_handle(multi_handle, http_handle);
+      curl_multi_remove_handle(multi_handle, http_handle2);
 
-  curl_multi_cleanup(multi_handle);
+      curl_multi_cleanup(multi_handle);
+    }
+  }
 
   curl_easy_cleanup(http_handle);
   curl_easy_cleanup(http_handle2);
index 62dc73b33fb6b50e768479e7f4897474e347424b..af77101b638a32e62f71ccf0720a47044ec6f9d1 100644 (file)
@@ -234,16 +234,18 @@ int main(int argc, char **argv)
   timeout = evtimer_new(base, on_timeout, NULL);
 
   curl_handle = curl_multi_init();
-  curl_multi_setopt(curl_handle, CURLMOPT_SOCKETFUNCTION, handle_socket);
-  curl_multi_setopt(curl_handle, CURLMOPT_TIMERFUNCTION, start_timeout);
+  if(curl_handle) {
+    curl_multi_setopt(curl_handle, CURLMOPT_SOCKETFUNCTION, handle_socket);
+    curl_multi_setopt(curl_handle, CURLMOPT_TIMERFUNCTION, start_timeout);
 
-  while(argc-- > 1) {
-    add_download(argv[argc], argc);
-  }
+    while(argc-- > 1) {
+      add_download(argv[argc], argc);
+    }
 
-  event_base_dispatch(base);
+    event_base_dispatch(base);
 
-  curl_multi_cleanup(curl_handle);
+    curl_multi_cleanup(curl_handle);
+  }
   event_free(timeout);
   event_base_free(base);
 
index 84312ffd160a4e222e832c6027f92e78f40f0c6b..08d852ec6528ac38fe885efabbf0222d2187ccae 100644 (file)
@@ -40,9 +40,6 @@ int main(void)
 {
   CURL *curl;
 
-  CURLM *multi_handle;
-  int still_running = 0;
-
   struct curl_httppost *formpost = NULL;
   struct curl_httppost *lastptr = NULL;
   struct curl_slist *headerlist = NULL;
@@ -76,50 +73,59 @@ int main(void)
                  CURLFORM_END);
   )
 
-  curl = curl_easy_init();
-  multi_handle = curl_multi_init();
-
   /* initialize custom header list (stating that Expect: 100-continue is not
      wanted */
   headerlist = curl_slist_append(headerlist, buf);
-  if(curl && multi_handle) {
 
-    /* what URL that receives this POST */
-    curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/upload.cgi");
-    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+  curl = curl_easy_init();
+  if(curl) {
+    CURLM *multi_handle;
+
+    multi_handle = curl_multi_init();
+    if(multi_handle) {
+
+      int still_running = 0;
+
+      /* what URL that receives this POST */
+      curl_easy_setopt(curl, CURLOPT_URL,
+                       "https://www.example.com/upload.cgi");
+      curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
 
-    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
-    CURL_IGNORE_DEPRECATION(
-      curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
-    )
+      curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
+      CURL_IGNORE_DEPRECATION(
+        curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
+      )
 
-    curl_multi_add_handle(multi_handle, curl);
+      curl_multi_add_handle(multi_handle, curl);
 
-    do {
-      CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
+      do {
+        CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
 
-      if(still_running)
-        /* wait for activity, timeout or "nothing" */
-        mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
+        if(still_running)
+          /* wait for activity, timeout or "nothing" */
+          mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
 
-      if(mc)
-        break;
+        if(mc)
+          break;
 
-    } while(still_running);
+      } while(still_running);
 
-    curl_multi_cleanup(multi_handle);
+      curl_multi_cleanup(multi_handle);
+    }
 
     /* always cleanup */
     curl_easy_cleanup(curl);
+  }
+
+  CURL_IGNORE_DEPRECATION(
+    /* then cleanup the formpost chain */
+    curl_formfree(formpost);
+  )
 
-    CURL_IGNORE_DEPRECATION(
-      /* then cleanup the formpost chain */
-      curl_formfree(formpost);
-    )
+  /* free slist */
+  curl_slist_free_all(headerlist);
 
-    /* free slist */
-    curl_slist_free_all(headerlist);
-  }
   curl_global_cleanup();
+
   return 0;
 }
index 63c238f2475a6217a249141fa5a802fe5a33f100..19821ad6d3278a279588b8cab70bac14bf3ac585 100644 (file)
  * Download an HTTP file and upload an FTP file simultaneously.
  */
 
-#define HANDLECOUNT 2   /* Number of simultaneous transfers */
 #define HTTP_HANDLE 0   /* Index for the HTTP transfer */
 #define FTP_HANDLE 1    /* Index for the FTP transfer */
+#define HANDLECOUNT 2   /* Number of simultaneous transfers */
 
 int main(void)
 {
   CURL *handles[HANDLECOUNT];
   CURLM *multi_handle;
 
-  int still_running = 0; /* keep number of running handles */
   int i;
 
-  CURLMsg *msg; /* for picking up messages with the transfer status */
-  int msgs_left; /* how many messages are left */
-
   CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
   if(res)
     return (int)res;
@@ -74,124 +70,132 @@ int main(void)
 
   /* init a multi stack */
   multi_handle = curl_multi_init();
+  if(multi_handle) {
 
-  /* add the individual transfers */
-  for(i = 0; i < HANDLECOUNT; i++)
-    curl_multi_add_handle(multi_handle, handles[i]);
+    int still_running = 0; /* keep number of running handles */
+
+    CURLMsg *msg; /* for picking up messages with the transfer status */
+    int msgs_left; /* how many messages are left */
+
+    /* add the individual transfers */
+    for(i = 0; i < HANDLECOUNT; i++)
+      curl_multi_add_handle(multi_handle, handles[i]);
+
+    /* we start some action by calling perform right away */
+    curl_multi_perform(multi_handle, &still_running);
 
-  /* we start some action by calling perform right away */
-  curl_multi_perform(multi_handle, &still_running);
+    while(still_running) {
 
-  while(still_running) {
-    struct timeval timeout;
-    int rc; /* select() return code */
-    CURLMcode mc; /* curl_multi_fdset() return code */
+      struct timeval timeout;
+      int rc; /* select() return code */
+      CURLMcode mc; /* curl_multi_fdset() return code */
 
-    fd_set fdread;
-    fd_set fdwrite;
-    fd_set fdexcep;
-    int maxfd = -1;
+      fd_set fdread;
+      fd_set fdwrite;
+      fd_set fdexcep;
+      int maxfd = -1;
 
-    long curl_timeo = -1;
+      long curl_timeo = -1;
 
-    FD_ZERO(&fdread);
-    FD_ZERO(&fdwrite);
-    FD_ZERO(&fdexcep);
+      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;
+      /* set a suitable timeout to play around with */
+      timeout.tv_sec = 1;
+      timeout.tv_usec = 0;
 
-    curl_multi_timeout(multi_handle, &curl_timeo);
-    if(curl_timeo >= 0) {
+      curl_multi_timeout(multi_handle, &curl_timeo);
+      if(curl_timeo >= 0) {
 #if defined(MSDOS) || defined(__AMIGA__)
-      timeout.tv_sec = (time_t)(curl_timeo / 1000);
+        timeout.tv_sec = (time_t)(curl_timeo / 1000);
 #else
-      timeout.tv_sec = curl_timeo / 1000;
+        timeout.tv_sec = curl_timeo / 1000;
 #endif
-      if(timeout.tv_sec > 1)
-        timeout.tv_sec = 1;
-      else
+        if(timeout.tv_sec > 1)
+          timeout.tv_sec = 1;
+        else
 #if defined(MSDOS) || defined(__AMIGA__)
-        timeout.tv_usec = (time_t)(curl_timeo % 1000) * 1000;
+          timeout.tv_usec = (time_t)(curl_timeo % 1000) * 1000;
 #else
-        timeout.tv_usec = (int)(curl_timeo % 1000) * 1000;
+          timeout.tv_usec = (int)(curl_timeo % 1000) * 1000;
 #endif
-    }
+      }
 
-    /* get file descriptors from the transfers */
-    mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
+      /* get file descriptors from the transfers */
+      mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
 
-    if(mc != CURLM_OK) {
-      fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
-      break;
-    }
+      if(mc != CURLM_OK) {
+        fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
+        break;
+      }
 
-    /* On success the value of maxfd is guaranteed to be >= -1. We call
-       select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
-       no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
-       to sleep 100ms, which is the minimum suggested value in the
-       curl_multi_fdset() doc. */
+      /* On success the value of maxfd is guaranteed to be >= -1. We call
+         select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
+         no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
+         to sleep 100ms, which is the minimum suggested value in the
+         curl_multi_fdset() doc. */
 
-    if(maxfd == -1) {
+      if(maxfd == -1) {
 #ifdef _WIN32
-      Sleep(100);
-      rc = 0;
+        Sleep(100);
+        rc = 0;
 #else
-      /* Portable sleep for platforms other than Windows. */
-      struct timeval wait = {0};
-      wait.tv_usec = 100 * 1000; /* 100ms */
-      rc = select(0, NULL, NULL, NULL, &wait);
+        /* Portable sleep for platforms other than Windows. */
+        struct timeval wait = {0};
+        wait.tv_usec = 100 * 1000; /* 100ms */
+        rc = select(0, NULL, NULL, NULL, &wait);
 #endif
-    }
-    else {
-      /* Note that on some platforms 'timeout' may be modified by select().
-         If you need access to the original value save a copy beforehand. */
-      rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
-    }
-
-    switch(rc) {
-    case -1:
-      /* select error */
-      break;
-    case 0: /* timeout */
-    default: /* action */
-      curl_multi_perform(multi_handle, &still_running);
-      break;
-    }
-  }
-
-  /* See how the transfers went */
-  /* !checksrc! disable EQUALSNULL 1 */
-  while((msg = curl_multi_info_read(multi_handle, &msgs_left)) != NULL) {
-    if(msg->msg == CURLMSG_DONE) {
-      int idx;
-
-      /* Find out which handle this message is about */
-      for(idx = 0; idx < HANDLECOUNT; idx++) {
-        int found = (msg->easy_handle == handles[idx]);
-        if(found)
-          break;
+      }
+      else {
+        /* Note that on some platforms 'timeout' may be modified by select().
+           If you need access to the original value save a copy beforehand. */
+        rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
       }
 
-      switch(idx) {
-      case HTTP_HANDLE:
-        printf("HTTP transfer completed with status %d\n", msg->data.result);
+      switch(rc) {
+      case -1:
+        /* select error */
         break;
-      case FTP_HANDLE:
-        printf("FTP transfer completed with status %d\n", msg->data.result);
+      case 0: /* timeout */
+      default: /* action */
+        curl_multi_perform(multi_handle, &still_running);
         break;
       }
     }
-  }
 
-  curl_multi_cleanup(multi_handle);
+    /* See how the transfers went */
+    /* !checksrc! disable EQUALSNULL 1 */
+    while((msg = curl_multi_info_read(multi_handle, &msgs_left)) != NULL) {
+      if(msg->msg == CURLMSG_DONE) {
+        int idx;
+
+        /* Find out which handle this message is about */
+        for(idx = 0; idx < HANDLECOUNT; idx++) {
+          int found = (msg->easy_handle == handles[idx]);
+          if(found)
+            break;
+        }
+
+        switch(idx) {
+        case HTTP_HANDLE:
+          printf("HTTP transfer completed with status %d\n", msg->data.result);
+          break;
+        case FTP_HANDLE:
+          printf("FTP transfer completed with status %d\n", msg->data.result);
+          break;
+        }
+      }
+    }
+
+    curl_multi_cleanup(multi_handle);
+  }
 
   /* Free the curl handles */
   for(i = 0; i < HANDLECOUNT; i++)
     curl_easy_cleanup(handles[i]);
 
-   curl_global_cleanup();
+  curl_global_cleanup();
 
   return 0;
 }
index 45416b85114b963f1729cbb88e77121d052dbeae..ac7d2f52520541c31c1859e122188ce3be3d209e 100644 (file)
 
 int main(void)
 {
-  CURL *curl;
-
-  CURLM *multi_handle;
-  int still_running = 0;
-
   curl_mime *form = NULL;
   curl_mimepart *field = NULL;
   struct curl_slist *headerlist = NULL;
   static const char buf[] = "Expect:";
 
+  CURL *curl;
+
   CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
   if(res)
     return (int)res;
 
   curl = curl_easy_init();
-  multi_handle = curl_multi_init();
+  if(curl) {
+    CURLM *multi_handle;
 
-  if(curl && multi_handle) {
-    /* Create the form */
-    form = curl_mime_init(curl);
+    multi_handle = curl_multi_init();
+    if(multi_handle) {
+      int still_running = 0;
 
-    /* Fill in the file upload field */
-    field = curl_mime_addpart(form);
-    curl_mime_name(field, "sendfile");
-    curl_mime_filedata(field, "multi-post.c");
+      /* Create the form */
+      form = curl_mime_init(curl);
 
-    /* Fill in the filename field */
-    field = curl_mime_addpart(form);
-    curl_mime_name(field, "filename");
-    curl_mime_data(field, "multi-post.c", CURL_ZERO_TERMINATED);
+      /* Fill in the file upload field */
+      field = curl_mime_addpart(form);
+      curl_mime_name(field, "sendfile");
+      curl_mime_filedata(field, "multi-post.c");
 
-    /* Fill in the submit field too, even if this is rarely needed */
-    field = curl_mime_addpart(form);
-    curl_mime_name(field, "submit");
-    curl_mime_data(field, "send", CURL_ZERO_TERMINATED);
+      /* Fill in the filename field */
+      field = curl_mime_addpart(form);
+      curl_mime_name(field, "filename");
+      curl_mime_data(field, "multi-post.c", CURL_ZERO_TERMINATED);
 
-    /* initialize custom header list (stating that Expect: 100-continue is not
-       wanted */
-    headerlist = curl_slist_append(headerlist, buf);
+      /* Fill in the submit field too, even if this is rarely needed */
+      field = curl_mime_addpart(form);
+      curl_mime_name(field, "submit");
+      curl_mime_data(field, "send", CURL_ZERO_TERMINATED);
 
-    /* what URL that receives this POST */
-    curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/upload.cgi");
-    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
+      /* initialize custom header list (stating that Expect: 100-continue is
+         not wanted */
+      headerlist = curl_slist_append(headerlist, buf);
 
-    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
-    curl_easy_setopt(curl, CURLOPT_MIMEPOST, form);
+      /* what URL that receives this POST */
+      curl_easy_setopt(curl, CURLOPT_URL,
+                       "https://www.example.com/upload.cgi");
+      curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
 
-    curl_multi_add_handle(multi_handle, curl);
+      curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
+      curl_easy_setopt(curl, CURLOPT_MIMEPOST, form);
 
-    do {
-      CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
+      curl_multi_add_handle(multi_handle, curl);
 
-      if(still_running)
-        /* wait for activity, timeout or "nothing" */
-        mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
+      do {
+        CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
 
-      if(mc)
-        break;
-    } while(still_running);
+        if(still_running)
+          /* wait for activity, timeout or "nothing" */
+          mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
 
-    curl_multi_cleanup(multi_handle);
+        if(mc)
+          break;
+      } while(still_running);
+
+      curl_multi_cleanup(multi_handle);
+    }
 
     /* always cleanup */
     curl_easy_cleanup(curl);
+  }
 
-    /* then cleanup the form */
-    curl_mime_free(form);
+  /* then cleanup the form */
+  curl_mime_free(form);
+
+  /* free slist */
+  curl_slist_free_all(headerlist);
 
-    /* free slist */
-    curl_slist_free_all(headerlist);
-  }
   curl_global_cleanup();
+
   return 0;
 }
index 3ba26e79db66dbe456b7c8fa038d97182fef6ae8..50736c720112bedb3bcffbf35fa924addf8b398a 100644 (file)
 int main(void)
 {
   CURL *http_handle;
-  CURLM *multi_handle;
-  int still_running = 1; /* keep number of running handles */
 
   CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
   if(res)
     return (int)res;
 
   http_handle = curl_easy_init();
+  if(http_handle) {
 
-  /* set the options (I left out a few, you get the point anyway) */
-  curl_easy_setopt(http_handle, CURLOPT_URL, "https://www.example.com/");
+    CURLM *multi_handle;
+    int still_running = 1; /* keep number of running handles */
 
-  /* init a multi stack */
-  multi_handle = curl_multi_init();
+    /* set the options (I left out a few, you get the point anyway) */
+    curl_easy_setopt(http_handle, CURLOPT_URL, "https://www.example.com/");
 
-  /* add the individual transfers */
-  curl_multi_add_handle(multi_handle, http_handle);
+    /* init a multi stack */
+    multi_handle = curl_multi_init();
+    if(multi_handle) {
 
-  do {
-    CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
+      /* add the individual transfers */
+      curl_multi_add_handle(multi_handle, http_handle);
 
-    if(!mc)
-      /* wait for activity, timeout or "nothing" */
-      mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
+      do {
+        CURLMcode mc = curl_multi_perform(multi_handle, &still_running);
 
-    if(mc) {
-      fprintf(stderr, "curl_multi_poll() failed, code %d.\n", (int)mc);
-      break;
-    }
+        if(!mc)
+          /* wait for activity, timeout or "nothing" */
+          mc = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
+
+        if(mc) {
+          fprintf(stderr, "curl_multi_poll() failed, code %d.\n", (int)mc);
+          break;
+        }
 
-  } while(still_running);
+      } while(still_running);
 
-  curl_multi_remove_handle(multi_handle, http_handle);
+      curl_multi_remove_handle(multi_handle, http_handle);
 
-  curl_easy_cleanup(http_handle);
+      curl_multi_cleanup(multi_handle);
+    }
 
-  curl_multi_cleanup(multi_handle);
+    curl_easy_cleanup(http_handle);
+  }
 
   curl_global_cleanup();
 
index b4f5587c0fb1c09a9e69c8ac930d517d268fb74f..d2f18348e68af2ed3b9e2c80076956cca616d4fb 100644 (file)
@@ -241,21 +241,22 @@ int main(int argc, char **argv)
   uv_timer_init(uv.loop, &uv.timeout);
 
   uv.multi = curl_multi_init();
-  curl_multi_setopt(uv.multi, CURLMOPT_SOCKETFUNCTION, cb_socket);
-  curl_multi_setopt(uv.multi, CURLMOPT_SOCKETDATA, &uv);
-  curl_multi_setopt(uv.multi, CURLMOPT_TIMERFUNCTION, cb_timeout);
-  curl_multi_setopt(uv.multi, CURLMOPT_TIMERDATA, &uv);
+  if(uv.multi) {
+    curl_multi_setopt(uv.multi, CURLMOPT_SOCKETFUNCTION, cb_socket);
+    curl_multi_setopt(uv.multi, CURLMOPT_SOCKETDATA, &uv);
+    curl_multi_setopt(uv.multi, CURLMOPT_TIMERFUNCTION, cb_timeout);
+    curl_multi_setopt(uv.multi, CURLMOPT_TIMERDATA, &uv);
+
+    while(argc-- > 1) {
+      add_download(argv[argc], argc, uv.multi);
+    }
 
-  while(argc-- > 1) {
-    add_download(argv[argc], argc, uv.multi);
+    /* kickstart the thing */
+    curl_multi_socket_action(uv.multi, CURL_SOCKET_TIMEOUT, 0,
+                             &running_handles);
+    uv_run(uv.loop, UV_RUN_DEFAULT);
+    curl_multi_cleanup(uv.multi);
   }
-
-  /* kickstart the thing */
-  curl_multi_socket_action(uv.multi, CURL_SOCKET_TIMEOUT, 0, &running_handles);
-  uv_run(uv.loop, UV_RUN_DEFAULT);
-  curl_multi_cleanup(uv.multi);
-  curl_global_cleanup();
-
   curl_global_cleanup();
 
   return 0;
index 5818dfebee49a18a659236ccf15652ea0d0c1a5c..36836ef4753374232efc040cd8deda0815408e01 100644 (file)
@@ -52,13 +52,15 @@ static const char * const urls[NUMT]= {
 
 static void *pull_one_url(void *pindex)
 {
-  int i = *(int *)pindex;
   CURL *curl;
 
   curl = curl_easy_init();
-  curl_easy_setopt(curl, CURLOPT_URL, urls[i]);
-  (void)curl_easy_perform(curl); /* ignores error */
-  curl_easy_cleanup(curl);
+  if(curl) {
+    int i = *(int *)pindex;
+    curl_easy_setopt(curl, CURLOPT_URL, urls[i]);
+    (void)curl_easy_perform(curl); /* ignores error */
+    curl_easy_cleanup(curl);
+  }
 
   return NULL;
 }
index 2a8f2b6dd0c89a8090bcc88086ac4fce6713766d..50b3b6fe7b278f5fce9df53a09639dff7fb55d00 100644 (file)
@@ -35,8 +35,8 @@ struct MemoryStruct {
   size_t size;
 };
 
-static size_t
-WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
+static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb,
+                                  void *userp)
 {
   size_t realsize = size * nmemb;
   struct MemoryStruct *mem = (struct MemoryStruct *)userp;
index c42ea812c1186904e82b8706d21638ffc7362587..57c7c86e3a2b37fd0fbd041fa287fee4361bc395 100644 (file)
 int main(int argc, char *argv[])
 {
   CURL *curl;
-  CURLcode res;
 
-  curl_mime *form = NULL;
-  curl_mimepart *field = NULL;
-  struct curl_slist *headerlist = NULL;
-  static const char buf[] = "Expect:";
-
-  res = curl_global_init(CURL_GLOBAL_ALL);
+  CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
   if(res)
     return (int)res;
 
   curl = curl_easy_init();
   if(curl) {
+    curl_mime *form = NULL;
+    curl_mimepart *field = NULL;
+    struct curl_slist *headerlist = NULL;
+    static const char buf[] = "Expect:";
+
     /* Create the form */
     form = curl_mime_init(curl);
 
index 012fd1e6aee1ceddc878a14b08ac52ce3b7637c7..35adc6c82d5621297e4f9b9c4406113379f61585 100644 (file)
@@ -70,7 +70,6 @@ static int xferinfo(void *p,
 int main(void)
 {
   CURL *curl;
-  struct myprogress prog;
 
   CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
   if(res)
@@ -78,6 +77,8 @@ int main(void)
 
   curl = curl_easy_init();
   if(curl) {
+    struct myprogress prog;
+
     prog.lastruntime = 0;
     prog.curl = curl;
 
index 4bb0f3e48ebb52fd8d6fa916ed706e77e71cd3df..8745abe78b8f66665e479a90601d7f6498b3e80b 100644 (file)
@@ -121,8 +121,6 @@ static int sftpResumeUpload(CURL *curlhandle, const char *remotepath,
 
 int main(void)
 {
-  const char *remote = "sftp://user:pass@example.com/path/filename";
-  const char *filename = "filename";
   CURL *curlhandle = NULL;
 
   CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
@@ -130,12 +128,16 @@ int main(void)
     return (int)res;
 
   curlhandle = curl_easy_init();
+  if(curlhandle) {
+    const char *remote = "sftp://user:pass@example.com/path/filename";
+    const char *filename = "filename";
 
-  if(!sftpResumeUpload(curlhandle, remote, filename)) {
-    printf("resumed upload using curl %s failed\n", curl_version());
-  }
+    if(!sftpResumeUpload(curlhandle, remote, filename)) {
+      printf("resumed upload using curl %s failed\n", curl_version());
+    }
 
-  curl_easy_cleanup(curlhandle);
+    curl_easy_cleanup(curlhandle);
+  }
   curl_global_cleanup();
 
   return 0;
index 29d134db47b1a041ae716bc3fce6b5ed23937f68..5a0bb2d05e972c8fc7b7516611a47834f4645d04 100644 (file)
@@ -67,22 +67,24 @@ size_t write_file(void *ptr, size_t size, size_t nmemb, FILE *stream)
 
 static void run_one(gchar *http, int j)
 {
-  FILE *outfile = fopen(urls[j], "wb");
   CURL *curl;
 
   curl = curl_easy_init();
   if(curl) {
     printf("j = %d\n", j);
 
-    /* Set the URL and transfer type */
-    curl_easy_setopt(curl, CURLOPT_URL, http);
+    FILE *outfile = fopen(urls[j], "wb");
+    if(outfile) {
+      /* Set the URL and transfer type */
+      curl_easy_setopt(curl, CURLOPT_URL, http);
 
-    /* Write to the file */
-    curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile);
-    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_file);
-    (void)curl_easy_perform(curl);
+      /* Write to the file */
+      curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile);
+      curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_file);
+      (void)curl_easy_perform(curl);
 
-    fclose(outfile);
+      fclose(outfile);
+    }
     curl_easy_cleanup(curl);
   }
 }
index addc17691e0f3c57609987bf36f2cdddd30ad1b2..758a7fdaaf2a5eb4c9955f474f94c61556868b5e 100644 (file)
@@ -95,8 +95,6 @@ static size_t payload_source(char *ptr, size_t size, size_t nmemb, void *userp)
 int main(void)
 {
   CURL *curl;
-  struct curl_slist *recipients = NULL;
-  struct upload_status upload_ctx = { 0 };
 
   CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
   if(res)
@@ -104,6 +102,9 @@ int main(void)
 
   curl = curl_easy_init();
   if(curl) {
+    struct curl_slist *recipients = NULL;
+    struct upload_status upload_ctx = { 0 };
+
     /* This is the URL for your mailserver. In this example we connect to the
        smtp-submission port as we require an authenticated connection. */
     curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com:587");
index baec49be6906ea0b90aa4c86db38aba122eb0a45..727880d6199e21930d0891eff037f75068e5a2ec 100644 (file)
@@ -42,7 +42,6 @@
 int main(void)
 {
   CURL *curl;
-  struct curl_slist *recipients = NULL;
 
   CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
   if(res)
@@ -50,6 +49,8 @@ int main(void)
 
   curl = curl_easy_init();
   if(curl) {
+    struct curl_slist *recipients = NULL;
+
     /* This is the URL for your mailserver */
     curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com");
 
index 6583fc47099fbf5bef98ddbe33885a469e8c3b9b..d3f4346b8c0ac00dbe5c52e19037a01e2d2c5796 100644 (file)
@@ -92,8 +92,6 @@ static size_t payload_source(char *ptr, size_t size, size_t nmemb, void *userp)
 int main(void)
 {
   CURL *curl;
-  struct curl_slist *recipients = NULL;
-  struct upload_status upload_ctx = { 0 };
 
   CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
   if(res)
@@ -101,6 +99,9 @@ int main(void)
 
   curl = curl_easy_init();
   if(curl) {
+    struct curl_slist *recipients = NULL;
+    struct upload_status upload_ctx = { 0 };
+
     /* This is the URL for your mailserver */
     curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com");
 
index f952441c9c6a84a835d85c1b23f49b8dbcc83542..ca73b73fca9aa93969347cc7c451b7a879496294 100644 (file)
@@ -89,8 +89,6 @@ static size_t payload_source(char *ptr, size_t size, size_t nmemb, void *userp)
 int main(void)
 {
   CURL *curl;
-  struct curl_slist *recipients = NULL;
-  struct upload_status upload_ctx = { 0 };
 
   CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
   if(res)
@@ -98,6 +96,9 @@ int main(void)
 
   curl = curl_easy_init();
   if(curl) {
+    struct curl_slist *recipients = NULL;
+    struct upload_status upload_ctx = { 0 };
+
     /* Set username and password */
     curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
index 3eaea9d879fc9c8fe4073ee4b90149fcc8be53c7..4f7379529c1eccc37338a59bb9b41b79da682c6e 100644 (file)
@@ -89,8 +89,6 @@ static size_t payload_source(char *ptr, size_t size, size_t nmemb, void *userp)
 int main(void)
 {
   CURL *curl;
-  struct curl_slist *recipients = NULL;
-  struct upload_status upload_ctx = { 0 };
 
   CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
   if(res)
@@ -98,6 +96,9 @@ int main(void)
 
   curl = curl_easy_init();
   if(curl) {
+    struct curl_slist *recipients = NULL;
+    struct upload_status upload_ctx = { 0 };
+
     /* Set username and password */
     curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
     curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");
index 76dd8069adfa7bd8c3ec8b16f0a54391cdf8f4ff..33d439ec9c433a78e0b3e073ca79d6f6bfcadad5 100644 (file)
@@ -45,7 +45,6 @@
 int main(void)
 {
   CURL *curl;
-  struct curl_slist *recipients = NULL;
 
   CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
   if(res)
@@ -53,6 +52,8 @@ int main(void)
 
   curl = curl_easy_init();
   if(curl) {
+    struct curl_slist *recipients = NULL;
+
     /* This is the URL for your mailserver */
     curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com");
 
index 7f09a76fc187934bc284cbb5e677a78f55a7cabe..5d984a670ab98dbfc4503831e030aa96bac755b1 100644 (file)
@@ -55,17 +55,19 @@ static const char * const urls[]= {
 
 static void *pull_one_url(void *pindex)
 {
-  int i = *(int *)pindex;
   CURL *curl;
 
   curl = curl_easy_init();
-  curl_easy_setopt(curl, CURLOPT_URL, urls[i]);
-  /* this example does not verify the server's certificate, which means we
-     might be downloading stuff from an impostor */
-  curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
-  curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
-  (void)curl_easy_perform(curl); /* ignores error */
-  curl_easy_cleanup(curl);
+  if(curl) {
+    int i = *(int *)pindex;
+    curl_easy_setopt(curl, CURLOPT_URL, urls[i]);
+    /* this example does not verify the server's certificate, which means we
+       might be downloading stuff from an impostor */
+    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
+    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
+    (void)curl_easy_perform(curl); /* ignores error */
+    curl_easy_cleanup(curl);
+  }
 
   return NULL;
 }
index 2e8e225fce9048670b96800bca843efe87deace6..8e9e01db15dffe6bd9784b188bbafffc93151394 100644 (file)
@@ -38,10 +38,10 @@ static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
 
 int main(int argc, char *argv[])
 {
+  static const char *pagefilename = "page.out";
+
   CURLcode res;
   CURL *curl_handle;
-  static const char *pagefilename = "page.out";
-  FILE *pagefile;
 
   if(argc < 2) {
     printf("Usage: %s <URL>\n", argv[0]);
@@ -56,35 +56,38 @@ int main(int argc, char *argv[])
 
   /* init the curl session */
   curl_handle = curl_easy_init();
+  if(curl_handle) {
+    FILE *pagefile;
 
-  /* set URL to get here */
-  curl_easy_setopt(curl_handle, CURLOPT_URL, argv[1]);
+    /* set URL to get here */
+    curl_easy_setopt(curl_handle, CURLOPT_URL, argv[1]);
 
-  /* Switch on full protocol/debug output while testing */
-  curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);
+    /* Switch on full protocol/debug output while testing */
+    curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);
 
-  /* disable progress meter, set to 0L to enable it */
-  curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);
+    /* disable progress meter, set to 0L to enable it */
+    curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);
 
-  /* send all data to this function  */
-  curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);
+    /* send all data to this function  */
+    curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);
 
-  /* open the file */
-  pagefile = fopen(pagefilename, "wb");
-  if(pagefile) {
+    /* open the file */
+    pagefile = fopen(pagefilename, "wb");
+    if(pagefile) {
 
-    /* write the page body to this file handle */
-    curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, pagefile);
+      /* write the page body to this file handle */
+      curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, pagefile);
 
-    /* get it! */
-    res = curl_easy_perform(curl_handle);
+      /* get it! */
+      res = curl_easy_perform(curl_handle);
 
-    /* close the header file */
-    fclose(pagefile);
-  }
+      /* close the header file */
+      fclose(pagefile);
+    }
 
-  /* cleanup curl stuff */
-  curl_easy_cleanup(curl_handle);
+    /* cleanup curl stuff */
+    curl_easy_cleanup(curl_handle);
+  }
 
   curl_global_cleanup();
 
index 8953146e4dadf010a925ce776ecce05b50a4788b..82ef3e19aab93376bfc77947027c3c0db2352ee4 100644 (file)
@@ -34,8 +34,7 @@
 
 int main(void)
 {
-  CURL *curl;
-
+  CURL *curl = NULL;
   CURLU *urlp;
   CURLUcode uc;
 
@@ -43,9 +42,6 @@ int main(void)
   if(res)
     return (int)res;
 
-  /* get a curl handle */
-  curl = curl_easy_init();
-
   /* init Curl URL */
   urlp = curl_url();
   uc = curl_url_set(urlp, CURLUPART_URL,
@@ -56,6 +52,8 @@ int main(void)
     goto cleanup;
   }
 
+  /* get a curl handle */
+  curl = curl_easy_init();
   if(curl) {
     /* set urlp to use as working URL */
     curl_easy_setopt(curl, CURLOPT_CURLU, urlp);
@@ -69,8 +67,6 @@ int main(void)
     if(res != CURLE_OK)
       fprintf(stderr, "curl_easy_perform() failed: %s\n",
               curl_easy_strerror(res));
-
-    goto cleanup;
   }
 
 cleanup:
index d95e2a1cddd1522643c443aa90d3450ab1ddc03c..c53fcde9cbce2146ebdb963c4d47e43b027e7977 100644 (file)
@@ -162,45 +162,46 @@ int main(void)
   if(res)
     return (int)res;
 
-  curl_global_init(CURL_GLOBAL_ALL);
   ch = curl_easy_init();
-  curl_easy_setopt(ch, CURLOPT_VERBOSE, 0L);
-  curl_easy_setopt(ch, CURLOPT_HEADER, 0L);
-  curl_easy_setopt(ch, CURLOPT_NOPROGRESS, 1L);
-  curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L);
-  curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, writefunction);
-  curl_easy_setopt(ch, CURLOPT_WRITEDATA, stdout);
-  curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, writefunction);
-  curl_easy_setopt(ch, CURLOPT_HEADERDATA, stderr);
-  curl_easy_setopt(ch, CURLOPT_SSLCERTTYPE, "PEM");
-
-  /* both VERIFYPEER and VERIFYHOST are set to 0 in this case because there is
-     no CA certificate */
-
-  curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 0L);
-  curl_easy_setopt(ch, CURLOPT_SSL_VERIFYHOST, 0L);
-  curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
-  curl_easy_setopt(ch, CURLOPT_SSLKEYTYPE, "PEM");
-
-  /* first try: retrieve page without user certificate and key -> fails */
-  res = curl_easy_perform(ch);
-  if(res == CURLE_OK)
-    printf("*** transfer succeeded ***\n");
-  else
-    printf("*** transfer failed ***\n");
-
-  /* second try: retrieve page using user certificate and key -> succeeds
-   * load the certificate and key by installing a function doing the necessary
-   * "modifications" to the SSL CONTEXT just before link init
-   */
-  curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, sslctx_function);
-  res = curl_easy_perform(ch);
-  if(res == CURLE_OK)
-    printf("*** transfer succeeded ***\n");
-  else
-    printf("*** transfer failed ***\n");
-
-  curl_easy_cleanup(ch);
+  if(ch) {
+    curl_easy_setopt(ch, CURLOPT_VERBOSE, 0L);
+    curl_easy_setopt(ch, CURLOPT_HEADER, 0L);
+    curl_easy_setopt(ch, CURLOPT_NOPROGRESS, 1L);
+    curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L);
+    curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, writefunction);
+    curl_easy_setopt(ch, CURLOPT_WRITEDATA, stdout);
+    curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, writefunction);
+    curl_easy_setopt(ch, CURLOPT_HEADERDATA, stderr);
+    curl_easy_setopt(ch, CURLOPT_SSLCERTTYPE, "PEM");
+
+    /* both VERIFYPEER and VERIFYHOST are set to 0 in this case because there
+       is no CA certificate */
+
+    curl_easy_setopt(ch, CURLOPT_SSL_VERIFYPEER, 0L);
+    curl_easy_setopt(ch, CURLOPT_SSL_VERIFYHOST, 0L);
+    curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
+    curl_easy_setopt(ch, CURLOPT_SSLKEYTYPE, "PEM");
+
+    /* first try: retrieve page without user certificate and key -> fails */
+    res = curl_easy_perform(ch);
+    if(res == CURLE_OK)
+      printf("*** transfer succeeded ***\n");
+    else
+      printf("*** transfer failed ***\n");
+
+    /* second try: retrieve page using user certificate and key -> succeeds
+     * load the certificate and key by installing a function doing
+     * the necessary "modifications" to the SSL CONTEXT just before link init
+     */
+    curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, sslctx_function);
+    res = curl_easy_perform(ch);
+    if(res == CURLE_OK)
+      printf("*** transfer succeeded ***\n");
+    else
+      printf("*** transfer failed ***\n");
+
+    curl_easy_cleanup(ch);
+  }
   curl_global_cleanup();
   return (int)res;
 }
index 4f8401be4a911ffd9383fc67111301e2aec2a964..1131a3ce9e76f88009be6fe0c2ae68e5b36c5c1f 100644 (file)
@@ -117,56 +117,60 @@ static size_t parseStreamCallback(void *contents, size_t length, size_t nmemb,
 int main(void)
 {
   CURL *curl_handle;
-  CURLcode res;
-  XML_Parser parser;
-  struct ParserStruct state;
 
-  /* Initialize the state structure for parsing. */
-  memset(&state, 0, sizeof(state));
-  state.ok = 1;
-
-  /* Initialize a namespace-aware parser. */
-  parser = XML_ParserCreateNS(NULL, '\0');
-  XML_SetUserData(parser, &state);
-  XML_SetElementHandler(parser, startElement, endElement);
-  XML_SetCharacterDataHandler(parser, characterDataHandler);
-
-  res = curl_global_init(CURL_GLOBAL_ALL);
+  CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
   if(res)
     return (int)res;
 
   /* Initialize a libcurl handle. */
   curl_handle = curl_easy_init();
-  curl_easy_setopt(curl_handle, CURLOPT_URL,
-                   "https://www.w3schools.com/xml/simple.xml");
-  curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, parseStreamCallback);
-  curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)parser);
-
-  printf("Depth   Characters   Closing Tag\n");
-
-  /* Perform the request and any follow-up parsing. */
-  res = curl_easy_perform(curl_handle);
-  if(res != CURLE_OK) {
-    fprintf(stderr, "curl_easy_perform() failed: %s\n",
-            curl_easy_strerror(res));
-  }
-  else if(state.ok) {
-    /* Expat requires one final call to finalize parsing. */
-    if(XML_Parse(parser, NULL, 0, 1) == 0) {
-      enum XML_Error error_code = XML_GetErrorCode(parser);
-      fprintf(stderr, "Finalizing parsing failed with error code %d (%s).\n",
-              error_code, XML_ErrorString(error_code));
+  if(curl) {
+    XML_Parser parser;
+    struct ParserStruct state;
+
+    /* Initialize the state structure for parsing. */
+    memset(&state, 0, sizeof(state));
+    state.ok = 1;
+
+    /* Initialize a namespace-aware parser. */
+    parser = XML_ParserCreateNS(NULL, '\0');
+    XML_SetUserData(parser, &state);
+    XML_SetElementHandler(parser, startElement, endElement);
+    XML_SetCharacterDataHandler(parser, characterDataHandler);
+
+    curl_easy_setopt(curl_handle, CURLOPT_URL,
+                     "https://www.w3schools.com/xml/simple.xml");
+    curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, parseStreamCallback);
+    curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)parser);
+
+    printf("Depth   Characters   Closing Tag\n");
+
+    /* Perform the request and any follow-up parsing. */
+    res = curl_easy_perform(curl_handle);
+    if(res != CURLE_OK) {
+      fprintf(stderr, "curl_easy_perform() failed: %s\n",
+              curl_easy_strerror(res));
     }
-    else {
-      printf("                     --------------\n");
-      printf("                     %lu tags total\n", state.tags);
+    else if(state.ok) {
+      /* Expat requires one final call to finalize parsing. */
+      if(XML_Parse(parser, NULL, 0, 1) == 0) {
+        enum XML_Error error_code = XML_GetErrorCode(parser);
+        fprintf(stderr, "Finalizing parsing failed with error code %d (%s).\n",
+                error_code, XML_ErrorString(error_code));
+      }
+      else {
+        printf("                     --------------\n");
+        printf("                     %lu tags total\n", state.tags);
+      }
     }
+
+    /* Clean up. */
+    free(state.characters.memory);
+    XML_ParserFree(parser);
+
+    curl_easy_cleanup(curl_handle);
   }
 
-  /* Clean up. */
-  free(state.characters.memory);
-  XML_ParserFree(parser);
-  curl_easy_cleanup(curl_handle);
   curl_global_cleanup();
 
   return (int)res;