summaryrefslogtreecommitdiffstats
path: root/Utilities/cmcurl/lib/version.c
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2023-01-27 20:58:44 (GMT)
committerBrad King <brad.king@kitware.com>2023-01-27 20:58:44 (GMT)
commitf9f5957884c279af81766f3f339bdd0e768e814f (patch)
tree310f21f037896ac658f8d59e81fa671ee9dee1ef /Utilities/cmcurl/lib/version.c
parent39dcf9469d3dae1c319dbe9d1fbd86bef91b73e0 (diff)
parentdac458ddbf2b48168779821654a7e69cbd828c14 (diff)
downloadCMake-f9f5957884c279af81766f3f339bdd0e768e814f.zip
CMake-f9f5957884c279af81766f3f339bdd0e768e814f.tar.gz
CMake-f9f5957884c279af81766f3f339bdd0e768e814f.tar.bz2
Merge branch 'upstream-curl' into update-curl
* upstream-curl: curl 2022-12-21 (c12fb3dd)
Diffstat (limited to 'Utilities/cmcurl/lib/version.c')
-rw-r--r--Utilities/cmcurl/lib/version.c199
1 files changed, 129 insertions, 70 deletions
diff --git a/Utilities/cmcurl/lib/version.c b/Utilities/cmcurl/lib/version.c
index cb44eb4..c80841c 100644
--- a/Utilities/cmcurl/lib/version.c
+++ b/Utilities/cmcurl/lib/version.c
@@ -382,93 +382,145 @@ static const char * const protocols[] = {
NULL
};
-static curl_version_info_data version_info = {
- CURLVERSION_NOW,
- LIBCURL_VERSION,
- LIBCURL_VERSION_NUM,
- OS, /* as found by configure or set by hand at build-time */
- 0 /* features is 0 by default */
-#ifdef ENABLE_IPV6
- | CURL_VERSION_IPV6
+/*
+ * Feature presence run-time check functions.
+ *
+ * Warning: the value returned by these should not change between
+ * curl_global_init() and curl_global_cleanup() calls.
+ */
+
+#if defined(USE_LIBIDN2)
+static int idn_present(curl_version_info_data *info)
+{
+ return info->libidn != NULL;
+}
+#else
+#define idn_present NULL
#endif
-#ifdef USE_SSL
- | CURL_VERSION_SSL
+
+#if defined(USE_SSL) && !defined(CURL_DISABLE_PROXY)
+static int https_proxy_present(curl_version_info_data *info)
+{
+ (void) info;
+ return Curl_ssl_supports(NULL, SSLSUPP_HTTPS_PROXY);
+}
#endif
-#ifdef USE_NTLM
- | CURL_VERSION_NTLM
+
+/*
+ * Features table.
+ *
+ * Keep the features alphabetically sorted.
+ * Use FEATURE() macro to define an entry: this allows documentation check.
+ */
+
+#define FEATURE(name, present, bitmask) {(name), (present), (bitmask)}
+
+struct feat {
+ const char *name;
+ int (*present)(curl_version_info_data *info);
+ int bitmask;
+};
+
+static const struct feat features_table[] = {
+#ifndef CURL_DISABLE_ALTSVC
+ FEATURE("alt-svc", NULL, CURL_VERSION_ALTSVC),
#endif
-#if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) && \
- defined(NTLM_WB_ENABLED)
- | CURL_VERSION_NTLM_WB
+#ifdef CURLRES_ASYNCH
+ FEATURE("AsynchDNS", NULL, CURL_VERSION_ASYNCHDNS),
#endif
-#ifdef USE_SPNEGO
- | CURL_VERSION_SPNEGO
+#ifdef HAVE_BROTLI
+ FEATURE("brotli", NULL, CURL_VERSION_BROTLI),
#endif
-#ifdef USE_KERBEROS5
- | CURL_VERSION_KERBEROS5
+#ifdef DEBUGBUILD
+ FEATURE("Debug", NULL, CURL_VERSION_DEBUG),
+#endif
+#ifdef USE_GSASL
+ FEATURE("gsasl", NULL, CURL_VERSION_GSASL),
#endif
#ifdef HAVE_GSSAPI
- | CURL_VERSION_GSSAPI
+ FEATURE("GSS-API", NULL, CURL_VERSION_GSSAPI),
#endif
-#ifdef USE_WINDOWS_SSPI
- | CURL_VERSION_SSPI
+#ifndef CURL_DISABLE_HSTS
+ FEATURE("HSTS", NULL, CURL_VERSION_HSTS),
#endif
-#ifdef HAVE_LIBZ
- | CURL_VERSION_LIBZ
+#if defined(USE_NGHTTP2) || defined(USE_HYPER)
+ FEATURE("HTTP2", NULL, CURL_VERSION_HTTP2),
#endif
-#ifdef DEBUGBUILD
- | CURL_VERSION_DEBUG
+#if defined(ENABLE_QUIC)
+ FEATURE("HTTP3", NULL, CURL_VERSION_HTTP3),
#endif
-#ifdef CURLDEBUG
- | CURL_VERSION_CURLDEBUG
+#if defined(USE_SSL) && !defined(CURL_DISABLE_PROXY)
+ FEATURE("HTTPS-proxy", https_proxy_present, CURL_VERSION_HTTPS_PROXY),
#endif
-#ifdef CURLRES_ASYNCH
- | CURL_VERSION_ASYNCHDNS
+#if defined(USE_LIBIDN2) || defined(USE_WIN32_IDN)
+ FEATURE("IDN", idn_present, CURL_VERSION_IDN),
+#endif
+#ifdef ENABLE_IPV6
+ FEATURE("IPv6", NULL, CURL_VERSION_IPV6),
+#endif
+#ifdef USE_KERBEROS5
+ FEATURE("Kerberos", NULL, CURL_VERSION_KERBEROS5),
#endif
#if (SIZEOF_CURL_OFF_T > 4) && \
( (SIZEOF_OFF_T > 4) || defined(USE_WIN32_LARGE_FILES) )
- | CURL_VERSION_LARGEFILE
+ FEATURE("Largefile", NULL, CURL_VERSION_LARGEFILE),
#endif
-#if defined(WIN32) && defined(UNICODE) && defined(_UNICODE)
- | CURL_VERSION_UNICODE
-#endif
-#if defined(USE_TLS_SRP)
- | CURL_VERSION_TLSAUTH_SRP
+#ifdef HAVE_LIBZ
+ FEATURE("libz", NULL, CURL_VERSION_LIBZ),
#endif
-#if defined(USE_NGHTTP2) || defined(USE_HYPER)
- | CURL_VERSION_HTTP2
+#ifdef CURL_WITH_MULTI_SSL
+ FEATURE("MultiSSL", NULL, CURL_VERSION_MULTI_SSL),
#endif
-#if defined(ENABLE_QUIC)
- | CURL_VERSION_HTTP3
+#ifdef USE_NTLM
+ FEATURE("NTLM", NULL, CURL_VERSION_NTLM),
#endif
-#if defined(USE_UNIX_SOCKETS)
- | CURL_VERSION_UNIX_SOCKETS
+#if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) && \
+ defined(NTLM_WB_ENABLED)
+ FEATURE("NTLM_WB", NULL, CURL_VERSION_NTLM_WB),
#endif
#if defined(USE_LIBPSL)
- | CURL_VERSION_PSL
+ FEATURE("PSL", NULL, CURL_VERSION_PSL),
+#endif
+#ifdef USE_SPNEGO
+ FEATURE("SPNEGO", NULL, CURL_VERSION_SPNEGO),
#endif
-#if defined(CURL_WITH_MULTI_SSL)
- | CURL_VERSION_MULTI_SSL
+#ifdef USE_SSL
+ FEATURE("SSL", NULL, CURL_VERSION_SSL),
#endif
-#if defined(HAVE_BROTLI)
- | CURL_VERSION_BROTLI
+#ifdef USE_WINDOWS_SSPI
+ FEATURE("SSPI", NULL, CURL_VERSION_SSPI),
#endif
-#if defined(HAVE_ZSTD)
- | CURL_VERSION_ZSTD
+#ifdef GLOBAL_INIT_IS_THREADSAFE
+ FEATURE("threadsafe", NULL, CURL_VERSION_THREADSAFE),
#endif
-#ifndef CURL_DISABLE_ALTSVC
- | CURL_VERSION_ALTSVC
+#ifdef USE_TLS_SRP
+ FEATURE("TLS-SRP", NULL, CURL_VERSION_TLSAUTH_SRP),
#endif
-#ifndef CURL_DISABLE_HSTS
- | CURL_VERSION_HSTS
+#ifdef CURLDEBUG
+ FEATURE("TrackMemory", NULL, CURL_VERSION_CURLDEBUG),
+#endif
+#if defined(WIN32) && defined(UNICODE) && defined(_UNICODE)
+ FEATURE("Unicode", NULL, CURL_VERSION_UNICODE),
#endif
-#if defined(USE_GSASL)
- | CURL_VERSION_GSASL
+#ifdef USE_UNIX_SOCKETS
+ FEATURE("UnixSockets", NULL, CURL_VERSION_UNIX_SOCKETS),
#endif
-#if defined(GLOBAL_INIT_IS_THREADSAFE)
- | CURL_VERSION_THREADSAFE
+#ifdef HAVE_ZSTD
+ FEATURE("zstd", NULL, CURL_VERSION_ZSTD),
#endif
- ,
+ {NULL, NULL, 0}
+};
+
+static const char *feature_names[sizeof(features_table) /
+ sizeof(features_table[0])] = {NULL};
+
+
+static curl_version_info_data version_info = {
+ CURLVERSION_NOW,
+ LIBCURL_VERSION,
+ LIBCURL_VERSION_NUM,
+ OS, /* as found by configure or set by hand at build-time */
+ 0, /* features bitmask is built at run-time */
NULL, /* ssl_version */
0, /* ssl_version_num, this is kept at zero */
NULL, /* zlib_version */
@@ -496,11 +548,16 @@ static curl_version_info_data version_info = {
0, /* zstd_ver_num */
NULL, /* zstd version */
NULL, /* Hyper version */
- NULL /* gsasl version */
+ NULL, /* gsasl version */
+ feature_names
};
curl_version_info_data *curl_version_info(CURLversion stamp)
{
+ size_t n;
+ const struct feat *p;
+ int features = 0;
+
#if defined(USE_SSH)
static char ssh_buffer[80];
#endif
@@ -518,15 +575,11 @@ curl_version_info_data *curl_version_info(CURLversion stamp)
static char zstd_buffer[80];
#endif
+ (void)stamp; /* avoid compiler warnings, we don't use this */
+
#ifdef USE_SSL
Curl_ssl_version(ssl_buffer, sizeof(ssl_buffer));
version_info.ssl_version = ssl_buffer;
-#ifndef CURL_DISABLE_PROXY
- if(Curl_ssl->supports & SSLSUPP_HTTPS_PROXY)
- version_info.features |= CURL_VERSION_HTTPS_PROXY;
- else
- version_info.features &= ~CURL_VERSION_HTTPS_PROXY;
-#endif
#endif
#ifdef HAVE_LIBZ
@@ -544,10 +597,6 @@ curl_version_info_data *curl_version_info(CURLversion stamp)
/* This returns a version string if we use the given version or later,
otherwise it returns NULL */
version_info.libidn = idn2_check_version(IDN2_VERSION);
- if(version_info.libidn)
- version_info.features |= CURL_VERSION_IDN;
-#elif defined(USE_WIN32_IDN)
- version_info.features |= CURL_VERSION_IDN;
#endif
#if defined(USE_SSH)
@@ -597,6 +646,16 @@ curl_version_info_data *curl_version_info(CURLversion stamp)
}
#endif
- (void)stamp; /* avoid compiler warnings, we don't use this */
+ /* Get available features, build bitmask and names array. */
+ n = 0;
+ for(p = features_table; p->name; p++)
+ if(!p->present || p->present(&version_info)) {
+ features |= p->bitmask;
+ feature_names[n++] = p->name;
+ }
+
+ feature_names[n] = NULL; /* Terminate array. */
+ version_info.features = features;
+
return &version_info;
}