curl tool: reviewed code moved to tool_*.[ch] files
authorYang Tse <yangsita@gmail.com>
Thu, 22 Sep 2011 09:16:34 +0000 (11:16 +0200)
committerYang Tse <yangsita@gmail.com>
Thu, 22 Sep 2011 19:21:20 +0000 (21:21 +0200)
my_setopt and my_setopt_str no longer ignores curl_easy_setopt result.

Fixed some OOM handling issues.

packages/Symbian/group/curl.mmp
src/Makefile.inc
src/Makefile.vc6
src/main.c
src/tool_doswin.c
src/tool_libinfo.c [new file with mode: 0644]
src/tool_libinfo.h [new file with mode: 0644]
src/tool_setopt.h
src/vc6curlsrc.dsp

index 375e05b7fd9625456a91e1972dcd949b8d48b43f..ef40c71507e7b7bd699834bde3886a89edaaa655 100644 (file)
@@ -10,9 +10,19 @@ SOURCEPATH  ../../../src
 SOURCE \
     main.c hugehelp.c urlglob.c writeout.c writeenv.c \
     getpass.c homedir.c curlutil.c xattr.c \
-    tool_bname.c tool_cfgable.c tool_convert.c tool_dirhie.c \
-    tool_doswin.c tool_easysrc.c tool_mfiles.c tool_msgs.c \
-    tool_myfunc.c tool_progress.c tool_setopt.c tool_vms.c
+    tool_bname.c \
+    tool_cfgable.c \
+    tool_convert.c \
+    tool_dirhie.c \
+    tool_doswin.c \
+    tool_easysrc.c \
+    tool_libinfo.c \
+    tool_mfiles.c \
+    tool_msgs.c \
+    tool_myfunc.c \
+    tool_progress.c \
+    tool_setopt.c \
+    tool_vms.c
 
 SOURCEPATH  ../../../lib
 SOURCE \
index f377a2e87c1452291d338006936fcc5875a4982b..70e374bdefc96c674b069408a82b5c4e172f9ac6 100644 (file)
@@ -16,16 +16,36 @@ CURLX_ONES = $(top_srcdir)/lib/strtoofft.c \
 
 CURL_CFILES = main.c hugehelp.c urlglob.c writeout.c writeenv.c \
        getpass.c homedir.c curlutil.c xattr.c \
-       tool_bname.c tool_cfgable.c tool_convert.c tool_dirhie.c \
-       tool_doswin.c tool_easysrc.c tool_mfiles.c tool_msgs.c \
-       tool_myfunc.c tool_progress.c tool_setopt.c tool_vms.c
+       tool_bname.c \
+       tool_cfgable.c \
+       tool_convert.c \
+       tool_dirhie.c \
+       tool_doswin.c \
+       tool_easysrc.c \
+       tool_libinfo.c \
+       tool_mfiles.c \
+       tool_msgs.c \
+       tool_myfunc.c \
+       tool_progress.c \
+       tool_setopt.c \
+       tool_vms.c
 
 CURL_HFILES = hugehelp.h setup.h config-win32.h config-mac.h \
        config-riscos.h urlglob.h version.h xattr.h \
        writeout.h writeenv.h getpass.h homedir.h curlutil.h \
-       tool_bname.h tool_cfgable.h tool_convert.h tool_dirhie.h \
-       tool_doswin.h tool_easysrc.h tool_mfiles.h tool_msgs.h \
-       tool_myfunc.h tool_progress.h tool_sdecls.h tool_setopt.h \
+       tool_bname.h \
+       tool_cfgable.h \
+       tool_convert.h \
+       tool_dirhie.h \
+       tool_doswin.h \
+       tool_easysrc.h \
+       tool_libinfo.h \
+       tool_mfiles.h \
+       tool_msgs.h \
+       tool_myfunc.h \
+       tool_progress.h \
+       tool_sdecls.h \
+       tool_setopt.h \
        tool_vms.h
 
 curl_SOURCES = $(CURL_CFILES) $(CURLX_ONES) $(CURL_HFILES)
index 3d6389521d65c3536cad681440e840321f6464f6..d2ce12ce84eb8b70cba0c84c051fe41ecf795dde 100644 (file)
@@ -147,6 +147,7 @@ RELEASE_OBJS= \
        tool_dirhier.obj \\r
        tool_doswinr.obj \\r
        tool_easysrcr.obj \\r
+       tool_libinfor.obj \\r
        tool_mfilesr.obj \\r
        tool_msgsr.obj \\r
        tool_myfuncr.obj \\r
@@ -173,6 +174,7 @@ DEBUG_OBJS= \
        tool_dirhied.obj \\r
        tool_doswind.obj \\r
        tool_easysrcd.obj \\r
+       tool_libinfod.obj \\r
        tool_mfilesd.obj \\r
        tool_msgsd.obj \\r
        tool_myfuncd.obj \\r
@@ -334,6 +336,8 @@ tool_doswinr.obj: tool_doswin.c
        $(CCR) $(CFLAGS) /Fo"$@" tool_doswin.c\r
 tool_easysrcr.obj: tool_easysrc.c\r
        $(CCR) $(CFLAGS) /Fo"$@" tool_easysrc.c\r
+tool_libinfor.obj: tool_libinfo.c\r
+       $(CCR) $(CFLAGS) /Fo"$@" tool_libinfo.c\r
 tool_mfilesr.obj: tool_mfiles.c\r
        $(CCR) $(CFLAGS) /Fo"$@" tool_mfiles.c\r
 tool_msgsr.obj: tool_msgs.c\r
@@ -384,6 +388,8 @@ tool_doswind.obj: tool_doswin.c
        $(CCD) $(CFLAGS) /Fo"$@" tool_doswin.c\r
 tool_easysrcd.obj: tool_easysrc.c\r
        $(CCD) $(CFLAGS) /Fo"$@" tool_easysrc.c\r
+tool_libinfod.obj: tool_libinfo.c\r
+       $(CCD) $(CFLAGS) /Fo"$@" tool_libinfo.c\r
 tool_mfilesd.obj: tool_mfiles.c\r
        $(CCD) $(CFLAGS) /Fo"$@" tool_mfiles.c\r
 tool_msgsd.obj: tool_msgs.c\r
index 111d3fe7a4878038cf944ed87514686c08ca7c95..4bdd9a2d33d1cff2fbdacef7ad4f19815387a184 100644 (file)
@@ -98,6 +98,7 @@
 #include "tool_dirhie.h"
 #include "tool_doswin.h"
 #include "tool_easysrc.h"
+#include "tool_libinfo.h"
 #include "tool_mfiles.h"
 #include "tool_msgs.h"
 #include "tool_myfunc.h"
@@ -506,9 +507,6 @@ struct LongShort {
   bool extraparam;
 };
 
-/* global variable to hold info about libcurl */
-static curl_version_info_data *curlinfo;
-
 static int parseconfig(const char *filename,
                        struct Configurable *config);
 static char *my_get_line(FILE *fp);
@@ -3740,7 +3738,10 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
   config->outs = &outs;
 
   /* we get libcurl info right away */
-  curlinfo = curl_version_info(CURLVERSION_NOW);
+  if(get_libcurl_info() != CURLE_OK) {
+    clean_getout(config);
+    return CURLE_FAILED_INIT;
+  }
 
   errorbuffer[0]=0; /* prevent junk from being output */
 
@@ -4348,9 +4349,6 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
         if(uploadfilesize != -1)
           my_setopt(curl, CURLOPT_INFILESIZE_LARGE, uploadfilesize);
         my_setopt_str(curl, CURLOPT_URL, url);     /* what to fetch */
-        my_setopt_str(curl, CURLOPT_PROXY, config->proxy); /* proxy to use */
-        if(config->proxy)
-          my_setopt(curl, CURLOPT_PROXYTYPE, config->proxyver);
         my_setopt(curl, CURLOPT_NOPROGRESS, config->noprogress);
         if(config->no_body) {
           my_setopt(curl, CURLOPT_NOBODY, 1);
@@ -4359,6 +4357,43 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
         else
           my_setopt(curl, CURLOPT_HEADER, config->include_headers);
 
+#if !defined(CURL_DISABLE_PROXY)
+        {
+          /* TODO: Make this a run-time check instead of compile-time one. */
+
+          my_setopt_str(curl, CURLOPT_PROXY, config->proxy);
+          my_setopt_str(curl, CURLOPT_PROXYUSERPWD, config->proxyuserpwd);
+
+          /* new in libcurl 7.3 */
+          my_setopt(curl, CURLOPT_HTTPPROXYTUNNEL, config->proxytunnel);
+
+          /* new in libcurl 7.5 */
+          if(config->proxy)
+            my_setopt(curl, CURLOPT_PROXYTYPE, config->proxyver);
+
+          /* new in libcurl 7.10 */
+          if(config->socksproxy) {
+            my_setopt_str(curl, CURLOPT_PROXY, config->socksproxy);
+            my_setopt(curl, CURLOPT_PROXYTYPE, config->socksver);
+          }
+
+          /* new in libcurl 7.10.6 */
+          if(config->proxyanyauth)
+            my_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_ANY);
+          else if(config->proxynegotiate)
+            my_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_GSSNEGOTIATE);
+          else if(config->proxyntlm)
+            my_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_NTLM);
+          else if(config->proxydigest)
+            my_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_DIGEST);
+          else if(config->proxybasic)
+            my_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_BASIC);
+
+          /* new in libcurl 7.19.4 */
+          my_setopt(curl, CURLOPT_NOPROXY, config->noproxy);
+        }
+#endif
+
         my_setopt(curl, CURLOPT_FAILONERROR, config->failonerror);
         my_setopt(curl, CURLOPT_UPLOAD, uploadfile?TRUE:FALSE);
         my_setopt(curl, CURLOPT_DIRLISTONLY, config->dirlistonly);
@@ -4374,30 +4409,63 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
         if(config->netrc_file)
           my_setopt(curl, CURLOPT_NETRC_FILE, config->netrc_file);
 
-        my_setopt(curl, CURLOPT_FOLLOWLOCATION, config->followlocation);
-        my_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, config->unrestricted_auth);
         my_setopt(curl, CURLOPT_TRANSFERTEXT, config->use_ascii);
         my_setopt_str(curl, CURLOPT_USERPWD, config->userpwd);
-        my_setopt_str(curl, CURLOPT_PROXYUSERPWD, config->proxyuserpwd);
-        my_setopt(curl, CURLOPT_NOPROXY, config->noproxy);
         my_setopt_str(curl, CURLOPT_RANGE, config->range);
         my_setopt(curl, CURLOPT_ERRORBUFFER, errorbuffer);
         my_setopt(curl, CURLOPT_TIMEOUT, config->timeout);
 
-        switch(config->httpreq) {
-        case HTTPREQ_SIMPLEPOST:
-          my_setopt_str(curl, CURLOPT_POSTFIELDS, config->postfields);
-          my_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, config->postfieldsize);
-          break;
-        case HTTPREQ_POST:
-          my_setopt(curl, CURLOPT_HTTPPOST, config->httppost);
-          break;
-        default:
-          break;
-        }
-        my_setopt_str(curl, CURLOPT_REFERER, config->referer);
-        my_setopt(curl, CURLOPT_AUTOREFERER, config->autoreferer);
-        my_setopt_str(curl, CURLOPT_USERAGENT, config->useragent);
+        if(built_in_protos & CURLPROTO_HTTP) {
+
+          my_setopt(curl, CURLOPT_FOLLOWLOCATION,
+                    config->followlocation);
+          my_setopt(curl, CURLOPT_UNRESTRICTED_AUTH,
+                    config->unrestricted_auth);
+
+          switch(config->httpreq) {
+          case HTTPREQ_SIMPLEPOST:
+            my_setopt_str(curl, CURLOPT_POSTFIELDS,
+                          config->postfields);
+            my_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE,
+                      config->postfieldsize);
+            break;
+          case HTTPREQ_POST:
+            my_setopt(curl, CURLOPT_HTTPPOST, config->httppost);
+            break;
+          default:
+            break;
+          }
+
+          my_setopt_str(curl, CURLOPT_REFERER, config->referer);
+          my_setopt(curl, CURLOPT_AUTOREFERER, config->autoreferer);
+          my_setopt_str(curl, CURLOPT_USERAGENT, config->useragent);
+          my_setopt(curl, CURLOPT_HTTPHEADER, config->headers);
+
+          /* new in libcurl 7.5 */
+          my_setopt(curl, CURLOPT_MAXREDIRS, config->maxredirs);
+
+          /* new in libcurl 7.9.1 */
+          if(config->httpversion)
+            my_setopt(curl, CURLOPT_HTTP_VERSION, config->httpversion);
+
+          /* new in libcurl 7.10.6 (default is Basic) */
+          if(config->authtype)
+            my_setopt(curl, CURLOPT_HTTPAUTH, config->authtype);
+
+          /* curl 7.19.1 (the 301 version existed in 7.18.2) */
+          my_setopt(curl, CURLOPT_POSTREDIR, config->post301 |
+                    (config->post302 ? CURL_REDIR_POST_302 : FALSE));
+
+          /* new in libcurl 7.21.6 */
+          if(config->encoding)
+            my_setopt_str(curl, CURLOPT_ACCEPT_ENCODING, "");
+
+          /* new in libcurl 7.21.6 */
+          if(config->tr_encoding)
+            my_setopt(curl, CURLOPT_TRANSFER_ENCODING, 1);
+
+        } /* (built_in_protos & CURLPROTO_HTTP) */
+
         my_setopt_str(curl, CURLOPT_FTPPORT, config->ftpport);
         my_setopt(curl, CURLOPT_LOW_SPEED_LIMIT,
                   config->low_speed_limit);
@@ -4408,66 +4476,77 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
                   config->recvpersecond);
         my_setopt(curl, CURLOPT_RESUME_FROM_LARGE,
                   config->use_resume?config->resume_from:0);
-        my_setopt_str(curl, CURLOPT_COOKIE, config->cookie);
-        my_setopt(curl, CURLOPT_HTTPHEADER, config->headers);
+
         my_setopt(curl, CURLOPT_SSLCERT, config->cert);
         my_setopt_str(curl, CURLOPT_SSLCERTTYPE, config->cert_type);
         my_setopt(curl, CURLOPT_SSLKEY, config->key);
         my_setopt_str(curl, CURLOPT_SSLKEYTYPE, config->key_type);
         my_setopt_str(curl, CURLOPT_KEYPASSWD, config->key_passwd);
 
-        /* SSH private key uses the same command-line option as SSL private
-           key */
-        my_setopt_str(curl, CURLOPT_SSH_PRIVATE_KEYFILE, config->key);
-        my_setopt_str(curl, CURLOPT_SSH_PUBLIC_KEYFILE, config->pubkey);
+        if(built_in_protos & (CURLPROTO_SCP|CURLPROTO_SFTP)) {
 
-        /* SSH host key md5 checking allows us to fail if we are
-         * not talking to who we think we should
-         */
-        my_setopt_str(curl, CURLOPT_SSH_HOST_PUBLIC_KEY_MD5,
-                      config->hostpubmd5);
-
-        /* default to strict verifyhost */
-        /* my_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2); */
-        if(config->cacert || config->capath) {
-          if(config->cacert)
-            my_setopt_str(curl, CURLOPT_CAINFO, config->cacert);
-
-          if(config->capath)
-            my_setopt_str(curl, CURLOPT_CAPATH, config->capath);
-          my_setopt(curl, CURLOPT_SSL_VERIFYPEER, TRUE);
+          /* SSH and SSL private key uses same command-line option */
+          /* new in libcurl 7.16.1 */
+          my_setopt_str(curl, CURLOPT_SSH_PRIVATE_KEYFILE, config->key);
+          /* new in libcurl 7.16.1 */
+          my_setopt_str(curl, CURLOPT_SSH_PUBLIC_KEYFILE, config->pubkey);
+
+          /* new in libcurl 7.17.1: SSH host key md5 checking allows us
+             to fail if we are not talking to who we think we should */
+          my_setopt_str(curl, CURLOPT_SSH_HOST_PUBLIC_KEY_MD5,
+                        config->hostpubmd5);
         }
+
+        if(config->cacert)
+          my_setopt_str(curl, CURLOPT_CAINFO, config->cacert);
+        if(config->capath)
+          my_setopt_str(curl, CURLOPT_CAPATH, config->capath);
         if(config->crlfile)
           my_setopt_str(curl, CURLOPT_CRLFILE, config->crlfile);
-        if(config->insecure_ok) {
-          /* new stuff needed for libcurl 7.10 */
-          my_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
-          my_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1);
-        }
-        else {
-          char *home = homedir();
-          char *file = aprintf("%s/%sssh/known_hosts", home, DOT_CHAR);
-          Curl_safefree(home);
 
-          if(file) {
-            my_setopt_str(curl, CURLOPT_SSH_KNOWNHOSTS, file);
-            curl_free(file);
+        if(curlinfo->features & CURL_VERSION_SSL) {
+          if(config->insecure_ok) {
+            my_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
+            my_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1L);
           }
           else {
-            /* Free the list of remaining URLs and globbed upload files
-             * to force curl to exit immediately
-             */
-            if(urls) {
-              glob_cleanup(urls);
-              urls = NULL;
-            }
-            if(inglob) {
-              glob_cleanup(inglob);
-              inglob = NULL;
-            }
+            my_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
+            /* libcurl default is strict verifyhost -> 2L   */
+            /* my_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L); */
+          }
+        }
 
+        if(built_in_protos & (CURLPROTO_SCP|CURLPROTO_SFTP)) {
+          if(!config->insecure_ok) {
+            char *home;
+            char *file;
             res = CURLE_OUT_OF_MEMORY;
-            goto quit_urls;
+            home = homedir();
+            if(home) {
+              file = aprintf("%s/%sssh/known_hosts", home, DOT_CHAR);
+              if(file) {
+                /* new in curl 7.19.6 */
+                res = res_setopt_str(curl, CURLOPT_SSH_KNOWNHOSTS, file);
+                curl_free(file);
+                if(res == CURLE_UNKNOWN_OPTION)
+                  /* libssh2 version older than 1.1.1 */
+                  res = CURLE_OK;
+              }
+              free(home);
+            }
+            if(res) {
+              /* Free the list of remaining URLs and globbed upload files
+               * to force curl to exit immediately */
+              if(urls) {
+                glob_cleanup(urls);
+                urls = NULL;
+              }
+              if(inglob) {
+                glob_cleanup(inglob);
+                inglob = NULL;
+              }
+              goto quit_urls;
+            }
           }
         }
 
@@ -4476,17 +4555,29 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
           my_setopt(curl, CURLOPT_FILETIME, TRUE);
         }
 
-        my_setopt(curl, CURLOPT_MAXREDIRS, config->maxredirs);
         my_setopt(curl, CURLOPT_CRLF, config->crlf);
         my_setopt(curl, CURLOPT_QUOTE, config->quote);
         my_setopt(curl, CURLOPT_POSTQUOTE, config->postquote);
         my_setopt(curl, CURLOPT_PREQUOTE, config->prequote);
-        my_setopt_str(curl, CURLOPT_COOKIEFILE, config->cookiefile);
-        /* cookie jar was added in 7.9 */
-        if(config->cookiejar)
-          my_setopt_str(curl, CURLOPT_COOKIEJAR, config->cookiejar);
-        /* cookie session added in 7.9.7 */
-        my_setopt(curl, CURLOPT_COOKIESESSION, config->cookiesession);
+
+#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
+        {
+          /* TODO: Make this a run-time check instead of compile-time one. */
+
+          if(config->cookie)
+            my_setopt_str(curl, CURLOPT_COOKIE, config->cookie);
+
+          if(config->cookiefile)
+            my_setopt_str(curl, CURLOPT_COOKIEFILE, config->cookiefile);
+
+          /* new in libcurl 7.9 */
+          if(config->cookiejar)
+            my_setopt_str(curl, CURLOPT_COOKIEJAR, config->cookiejar);
+
+          /* new in libcurl 7.9.7 */
+          my_setopt(curl, CURLOPT_COOKIESESSION, config->cookiesession);
+        }
+#endif
 
         my_setopt(curl, CURLOPT_SSLVERSION, config->ssl_version);
         my_setopt(curl, CURLOPT_TIMECONDITION, config->timecond);
@@ -4495,7 +4586,6 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
         my_setopt(curl, CURLOPT_STDERR, config->errors);
 
         /* three new ones in libcurl 7.3: */
-        my_setopt(curl, CURLOPT_HTTPPROXYTUNNEL, config->proxytunnel);
         my_setopt_str(curl, CURLOPT_INTERFACE, config->iface);
         my_setopt_str(curl, CURLOPT_KRBLEVEL, config->krblevel);
 
@@ -4519,9 +4609,6 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
         if(config->cipher_list)
           my_setopt_str(curl, CURLOPT_SSL_CIPHER_LIST, config->cipher_list);
 
-        if(config->httpversion)
-          my_setopt(curl, CURLOPT_HTTP_VERSION, config->httpversion);
-
         /* new in libcurl 7.9.2: */
         if(config->disable_epsv)
           /* disable it */
@@ -4532,10 +4619,6 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
           /* disable it */
           my_setopt(curl, CURLOPT_FTP_USE_EPRT, FALSE);
 
-        /* new in libcurl 7.10.6 (default is Basic) */
-        if(config->authtype)
-          my_setopt(curl, CURLOPT_HTTPAUTH, config->authtype);
-
         if(config->tracetype != TRACE_NONE) {
           my_setopt(curl, CURLOPT_DEBUGFUNCTION, my_trace);
           my_setopt(curl, CURLOPT_DEBUGDATA, config);
@@ -4550,25 +4633,9 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
           my_setopt(curl, CURLOPT_SSLENGINE_DEFAULT, 1);
         }
 
-        if(config->encoding)
-          my_setopt_str(curl, CURLOPT_ACCEPT_ENCODING, "");
-
-        if(config->tr_encoding)
-          my_setopt(curl, CURLOPT_TRANSFER_ENCODING, 1);
-
         /* new in curl 7.10.7, extended in 7.19.4 but this only sets 0 or 1 */
         my_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS,
                   config->ftp_create_dirs);
-        if(config->proxyanyauth)
-          my_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_ANY);
-        else if(config->proxynegotiate)
-          my_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_GSSNEGOTIATE);
-        else if(config->proxyntlm)
-          my_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_NTLM);
-        else if(config->proxydigest)
-          my_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_DIGEST);
-        else if(config->proxybasic)
-          my_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_BASIC);
 
         /* new in curl 7.10.8 */
         if(config->max_filesize)
@@ -4598,22 +4665,20 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
         if(config->ftp_ssl_ccc)
           my_setopt(curl, CURLOPT_FTP_SSL_CCC, config->ftp_ssl_ccc_mode);
 
-        /* new in curl 7.11.1, modified in 7.15.2 */
-        if(config->socksproxy) {
-          my_setopt_str(curl, CURLOPT_PROXY, config->socksproxy);
-          my_setopt(curl, CURLOPT_PROXYTYPE, config->socksver);
-        }
-
 #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
-        /* new in curl 7.19.4 */
-        if(config->socks5_gssapi_service)
-          my_setopt_str(curl, CURLOPT_SOCKS5_GSSAPI_SERVICE,
-                        config->socks5_gssapi_service);
-
-        /* new in curl 7.19.4 */
-        if(config->socks5_gssapi_nec)
-          my_setopt_str(curl, CURLOPT_SOCKS5_GSSAPI_NEC,
-                        config->socks5_gssapi_nec);
+        {
+          /* TODO: Make this a run-time check instead of compile-time one. */
+
+          /* new in curl 7.19.4 */
+          if(config->socks5_gssapi_service)
+            my_setopt_str(curl, CURLOPT_SOCKS5_GSSAPI_SERVICE,
+                          config->socks5_gssapi_service);
+
+          /* new in curl 7.19.4 */
+          if(config->socks5_gssapi_nec)
+            my_setopt_str(curl, CURLOPT_SOCKS5_GSSAPI_NEC,
+                          config->socks5_gssapi_nec);
+        }
 #endif
         /* curl 7.13.0 */
         my_setopt_str(curl, CURLOPT_FTP_ACCOUNT, config->ftp_account);
@@ -4654,10 +4719,6 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
           my_setopt(curl, CURLOPT_SOCKOPTDATA, config);
         }
 
-        /* curl 7.19.1 (the 301 version existed in 7.18.2) */
-        my_setopt(curl, CURLOPT_POSTREDIR, config->post301 |
-                  (config->post302 ? CURL_REDIR_POST_302 : FALSE));
-
         /* curl 7.20.0 */
         if(config->tftp_blksize)
           my_setopt(curl, CURLOPT_TFTP_BLKSIZE, config->tftp_blksize);
@@ -4694,10 +4755,17 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
           my_setopt(curl, CURLOPT_RESOLVE, config->resolve);
 
         /* new in 7.21.4 */
-        if(config->tls_username)
-          my_setopt_str(curl, CURLOPT_TLSAUTH_USERNAME, config->tls_username);
-        if(config->tls_password)
-          my_setopt_str(curl, CURLOPT_TLSAUTH_PASSWORD, config->tls_password);
+        if(curlinfo->features & CURL_VERSION_TLSAUTH_SRP) {
+          if(config->tls_username)
+            my_setopt_str(curl, CURLOPT_TLSAUTH_USERNAME,
+                          config->tls_username);
+          if(config->tls_password)
+            my_setopt_str(curl, CURLOPT_TLSAUTH_PASSWORD,
+                          config->tls_password);
+          if(config->tls_authtype)
+            my_setopt_str(curl, CURLOPT_TLSAUTH_TYPE,
+                          config->tls_authtype);
+        }
 
         /* new in 7.22.0 */
         if(config->gssapi_delegation)
index 7fab33b800c06193185dc2ea6f7704e197ae6ba3..5250b2cee876a7d7f99e2743b1d769639af648ea 100644 (file)
@@ -30,6 +30,7 @@
 #ifdef WIN32
 #  include <curl/curl.h>
 #  include "tool_cfgable.h"
+#  include "tool_libinfo.h"
 #endif
 
 #include "tool_bname.h"
@@ -251,10 +252,8 @@ CURLcode FindWin32CACert(struct Configurable *config, const char *bundle_file)
 {
   CURLcode result = CURLE_OK;
 
-  curl_version_info_data *info = curl_version_info(CURLVERSION_NOW);
-
-  /* search and set cert file only if "we" support SSL */
-  if(info->features & CURL_VERSION_SSL) {
+  /* search and set cert file only if libcurl supports SSL */
+  if(curlinfo->features & CURL_VERSION_SSL) {
 
     DWORD res_len;
     DWORD buf_tchar_size = PATH_MAX + 1;
diff --git a/src/tool_libinfo.c b/src/tool_libinfo.c
new file mode 100644 (file)
index 0000000..1469c88
--- /dev/null
@@ -0,0 +1,102 @@
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at http://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "setup.h"
+
+#include <curl/curl.h>
+
+#include "rawstr.h"
+
+#define ENABLE_CURLX_PRINTF
+/* use our own printf() functions */
+#include "curlx.h"
+
+#include "tool_libinfo.h"
+
+#include "memdebug.h" /* keep this as LAST include */
+
+/* global variable definitions, for libcurl run-time info */
+
+curl_version_info_data *curlinfo = NULL;
+long built_in_protos = 0;
+
+/*
+ * libcurl_info_init: retrieves run-time information about libcurl,
+ * setting a global pointer 'curlinfo' to libcurl's run-time info
+ * struct, and a global bit pattern 'built_in_protos' composed of
+ * CURLPROTO_* bits indicating which protocols are actually built
+ * into library being used.
+ */
+
+CURLcode get_libcurl_info(void)
+{
+  static struct proto_name_pattern {
+    const char *proto_name;
+    long        proto_pattern;
+  } const possibly_built_in[] = {
+    { "dict",   CURLPROTO_DICT   },
+    { "file",   CURLPROTO_FILE   },
+    { "ftp",    CURLPROTO_FTP    },
+    { "ftps",   CURLPROTO_FTPS   },
+    { "gopher", CURLPROTO_GOPHER },
+    { "http",   CURLPROTO_HTTP   },
+    { "https",  CURLPROTO_HTTPS  },
+    { "imap",   CURLPROTO_IMAP   },
+    { "imaps",  CURLPROTO_IMAPS  },
+    { "ldap",   CURLPROTO_LDAP   },
+    { "ldaps",  CURLPROTO_LDAPS  },
+    { "pop3",   CURLPROTO_POP3   },
+    { "pop3s",  CURLPROTO_POP3S  },
+    { "rtmp",   CURLPROTO_RTMP   },
+    { "rtsp",   CURLPROTO_RTSP   },
+    { "scp",    CURLPROTO_SCP    },
+    { "sftp",   CURLPROTO_SFTP   },
+    { "smtp",   CURLPROTO_SMTP   },
+    { "smtps",  CURLPROTO_SMTPS  },
+    { "telnet", CURLPROTO_TELNET },
+    { "tftp",   CURLPROTO_TFTP   },
+    {  NULL,    0                }
+  };
+
+  struct proto_name_pattern const *p;
+  const char *const *proto;
+
+  /* Pointer to libcurl's run-time version information */
+  curlinfo = curl_version_info(CURLVERSION_NOW);
+  if(!curlinfo)
+    return CURLE_FAILED_INIT;
+
+  /* Build CURLPROTO_* bit pattern with libcurl's built-in protocols */
+  built_in_protos = 0;
+  if(curlinfo->protocols) {
+    for(proto = curlinfo->protocols; *proto; proto++) {
+      for(p = possibly_built_in; p->proto_name; p++) {
+        if(curlx_raw_equal(*proto, p->proto_name)) {
+          built_in_protos |= p->proto_pattern;
+          break;
+        }
+      }
+    }
+  }
+
+  return CURLE_OK;
+}
+
diff --git a/src/tool_libinfo.h b/src/tool_libinfo.h
new file mode 100644 (file)
index 0000000..dfdf78a
--- /dev/null
@@ -0,0 +1,34 @@
+#ifndef HEADER_CURL_TOOL_LIBINFO_H
+#define HEADER_CURL_TOOL_LIBINFO_H
+/***************************************************************************
+ *                                  _   _ ____  _
+ *  Project                     ___| | | |  _ \| |
+ *                             / __| | | | |_) | |
+ *                            | (__| |_| |  _ <| |___
+ *                             \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at http://curl.haxx.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ***************************************************************************/
+#include "setup.h"
+
+/* global variable declarations, for libcurl run-time info */
+
+extern curl_version_info_data *curlinfo;
+extern long built_in_protos;
+
+CURLcode get_libcurl_info(void);
+
+#endif /* HEADER_CURL_TOOL_LIBINFO_H */
+
index e75f328f3165f48e866feb2e81891177eeb66a6e..d01c9eb24e3360490b65b2962a09ffad460c9a78 100644 (file)
@@ -29,22 +29,18 @@ CURLcode tool_setopt(CURL *curl, bool str, struct Configurable *config,
 /*
  * Macros used in operate()
  */
-#if 0
+
 #define my_setopt(x,y,z)  do { \
   res = tool_setopt(x, FALSE, config, #y, y, z); \
   if(res) \
-    goto quit_curl; \
+    goto show_error; \
 } WHILE_FALSE
 
 #define my_setopt_str(x,y,z)  do { \
   res = tool_setopt(x, TRUE, config, #y, y, z); \
   if(res) \
-    goto quit_curl; \
+    goto show_error; \
 } WHILE_FALSE
-#else
-#define my_setopt(x,y,z) tool_setopt(x, FALSE, config, #y, y, z)
-#define my_setopt_str(x,y,z) tool_setopt(x, TRUE, config, #y, y, z)
-#endif
 
 #define res_setopt(x,y,z) tool_setopt(x, FALSE, config, #y, y, z)
 
index 8c8ab4bda5fd4722358d895935efc5362ccc2122..9b2011724b088df75c098676bbba91e4297e14d4 100644 (file)
@@ -195,6 +195,10 @@ SOURCE=.\tool_easysrc.c
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=.\tool_libinfo.c\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=.\tool_mfiles.c\r
 # End Source File\r
 # Begin Source File\r
@@ -299,6 +303,10 @@ SOURCE=.\tool_easysrc.h
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=.\tool_libinfo.h\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=.\tool_mfiles.h\r
 # End Source File\r
 # Begin Source File\r