curl/lib/version.c

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

673 lines
16 KiB
C
Raw Normal View History

2002-09-03 19:52:59 +08:00
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
1999-12-29 22:20:26 +08:00
* \___|\___/|_| \_\_____|
*
* Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
1999-12-29 22:20:26 +08:00
*
2002-09-03 19:52:59 +08:00
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
2020-11-04 21:02:01 +08:00
* are also available at https://curl.se/docs/copyright.html.
*
2001-01-03 17:29:33 +08:00
* 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
2002-09-03 19:52:59 +08:00
* furnished to do so, under the terms of the COPYING file.
1999-12-29 22:20:26 +08:00
*
2001-01-03 17:29:33 +08:00
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
1999-12-29 22:20:26 +08:00
*
* SPDX-License-Identifier: curl
*
2002-09-03 19:52:59 +08:00
***************************************************************************/
1999-12-29 22:20:26 +08:00
build: fix circular header inclusion with other packages This commit renames lib/setup.h to lib/curl_setup.h and renames lib/setup_once.h to lib/curl_setup_once.h. Removes the need and usage of a header inclusion guard foreign to libcurl. [1] Removes the need and presence of an alarming notice we carried in old setup_once.h [2] ---------------------------------------- 1 - lib/setup_once.h used __SETUP_ONCE_H macro as header inclusion guard up to commit ec691ca3 which changed this to HEADER_CURL_SETUP_ONCE_H, this single inclusion guard is enough to ensure that inclusion of lib/setup_once.h done from lib/setup.h is only done once. Additionally lib/setup.h has always used __SETUP_ONCE_H macro to protect inclusion of setup_once.h even after commit ec691ca3, this was to avoid a circular header inclusion triggered when building a c-ares enabled version with c-ares sources available which also has a setup_once.h header. Commit ec691ca3 exposes the real nature of __SETUP_ONCE_H usage in lib/setup.h, it is a header inclusion guard foreign to libcurl belonging to c-ares's setup_once.h The renaming this commit does, fixes the circular header inclusion, and as such removes the need and usage of a header inclusion guard foreign to libcurl. Macro __SETUP_ONCE_H no longer used in libcurl. 2 - Due to the circular interdependency of old lib/setup_once.h and the c-ares setup_once.h header, old file lib/setup_once.h has carried back from 2006 up to now days an alarming and prominent notice about the need of keeping libcurl's and c-ares's setup_once.h in sync. Given that this commit fixes the circular interdependency, the need and presence of mentioned notice is removed. All mentioned interdependencies come back from now old days when the c-ares project lived inside a curl subdirectory. This commit removes last traces of such fact.
2013-01-07 02:06:49 +08:00
#include "curl_setup.h"
lib: connect/h2/h3 refactor Refactoring of connection setup and happy eyeballing. Move nghttp2. ngtcp2, quiche and msh3 into connection filters. - eyeballing cfilter that uses sub-filters for performing parallel connects - socket cfilter for all transport types, including QUIC - QUIC implementations in cfilter, can now participate in eyeballing - connection setup is more dynamic in order to adapt to what filter did really connect. Relevant to see if a SSL filter needs to be added or if SSL has already been provided - HTTP/3 test cases similar to HTTP/2 - multiuse of parallel transfers for HTTP/3, tested for ngtcp2 and quiche - Fix for data attach/detach in VTLS filters that could lead to crashes during parallel transfers. - Eliminating setup() methods in cfilters, no longer needed. - Improving Curl_conn_is_alive() to replace Curl_connalive() and integrated ssl alive checks into cfilter. - Adding CF_CNTRL_CONN_INFO_UPDATE to tell filters to update connection into and persist it at the easy handle. - Several more cfilter related cleanups and moves: - stream_weigth and dependency info is now wrapped in struct Curl_data_priority - Curl_data_priority members depend is available in HTTP2|HTTP3 - Curl_data_priority members depend on NGHTTP2 support - handling init/reset/cleanup of priority part of url.c - data->state.priority same struct, but shallow copy for compares only - PROTOPT_STREAM has been removed - Curl_conn_is_mulitplex() now available to check on capability - Adding query method to connection filters. - ngtcp2+quiche: implementing query for max concurrent transfers. - Adding is_alive and keep_alive cfilter methods. Adding DATA_SETUP event. - setting keepalive timestamp on connect - DATA_SETUP is called after the connection has been completely setup (but may not connected yet) to allow filters to initialize data members they use. - there is no socket to be had with msh3, it is unclear how select shall work - manual test via "curl --http3 https://curl.se" fail with "empty reply from server". - Various socket/conn related cleanups: - Curl_socket is now Curl_socket_open and in cf-socket.c - Curl_closesocket is now Curl_socket_close and in cf-socket.c - Curl_ssl_use has been replaced with Cur_conn_is_ssl - Curl_conn_tcp_accepted_set has been split into Curl_conn_tcp_listen_set and Curl_conn_tcp_accepted_set with a clearer purpose Closes #10141
2022-12-30 16:14:55 +08:00
#ifdef USE_NGHTTP2
#include <nghttp2/nghttp2.h>
#endif
1999-12-29 22:20:26 +08:00
#include <curl/curl.h>
#include "urldata.h"
2013-12-18 06:32:47 +08:00
#include "vtls/vtls.h"
#include "http2.h"
#include "vssh/ssh.h"
lib: connect/h2/h3 refactor Refactoring of connection setup and happy eyeballing. Move nghttp2. ngtcp2, quiche and msh3 into connection filters. - eyeballing cfilter that uses sub-filters for performing parallel connects - socket cfilter for all transport types, including QUIC - QUIC implementations in cfilter, can now participate in eyeballing - connection setup is more dynamic in order to adapt to what filter did really connect. Relevant to see if a SSL filter needs to be added or if SSL has already been provided - HTTP/3 test cases similar to HTTP/2 - multiuse of parallel transfers for HTTP/3, tested for ngtcp2 and quiche - Fix for data attach/detach in VTLS filters that could lead to crashes during parallel transfers. - Eliminating setup() methods in cfilters, no longer needed. - Improving Curl_conn_is_alive() to replace Curl_connalive() and integrated ssl alive checks into cfilter. - Adding CF_CNTRL_CONN_INFO_UPDATE to tell filters to update connection into and persist it at the easy handle. - Several more cfilter related cleanups and moves: - stream_weigth and dependency info is now wrapped in struct Curl_data_priority - Curl_data_priority members depend is available in HTTP2|HTTP3 - Curl_data_priority members depend on NGHTTP2 support - handling init/reset/cleanup of priority part of url.c - data->state.priority same struct, but shallow copy for compares only - PROTOPT_STREAM has been removed - Curl_conn_is_mulitplex() now available to check on capability - Adding query method to connection filters. - ngtcp2+quiche: implementing query for max concurrent transfers. - Adding is_alive and keep_alive cfilter methods. Adding DATA_SETUP event. - setting keepalive timestamp on connect - DATA_SETUP is called after the connection has been completely setup (but may not connected yet) to allow filters to initialize data members they use. - there is no socket to be had with msh3, it is unclear how select shall work - manual test via "curl --http3 https://curl.se" fail with "empty reply from server". - Various socket/conn related cleanups: - Curl_socket is now Curl_socket_open and in cf-socket.c - Curl_closesocket is now Curl_socket_close and in cf-socket.c - Curl_ssl_use has been replaced with Cur_conn_is_ssl - Curl_conn_tcp_accepted_set has been split into Curl_conn_tcp_listen_set and Curl_conn_tcp_accepted_set with a clearer purpose Closes #10141
2022-12-30 16:14:55 +08:00
#include "vquic/vquic.h"
#include "curl_printf.h"
#include "easy_lock.h"
#ifdef USE_ARES
# if defined(CURL_STATICLIB) && !defined(CARES_STATICLIB) && \
defined(WIN32)
# define CARES_STATICLIB
# endif
# include <ares.h>
#endif
#ifdef USE_LIBIDN2
#include <idn2.h>
2004-04-26 15:14:08 +08:00
#endif
#ifdef USE_LIBPSL
#include <libpsl.h>
#endif
#ifdef USE_LIBRTMP
#include <librtmp/rtmp.h>
#endif
#ifdef HAVE_LIBZ
#include <zlib.h>
#endif
#ifdef HAVE_BROTLI
lib: silence clang/gcc -Wvla warnings in brotli headers brotli v1.0.0 throughout current latest v1.0.9 and latest master [1] trigger this warning. It happened with CMake and GNU Make. autotools builds avoid it with the `convert -I options to -isystem` macro. llvm/clang: ``` In file included from ./curl/lib/content_encoding.c:36: ./brotli/x64-ucrt/usr/include/brotli/decode.h:204:34: warning: variable length array used [-Wvla] const uint8_t encoded_buffer[BROTLI_ARRAY_PARAM(encoded_size)], ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ./brotli/x64-ucrt/usr/include/brotli/port.h:253:34: note: expanded from macro 'BROTLI_ARRAY_PARAM' ^~~~~~ In file included from ./curl/lib/content_encoding.c:36: ./brotli/x64-ucrt/usr/include/brotli/decode.h:206:48: warning: variable length array used [-Wvla] uint8_t decoded_buffer[BROTLI_ARRAY_PARAM(*decoded_size)]); ~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~ ./brotli/x64-ucrt/usr/include/brotli/port.h:253:35: note: expanded from macro 'BROTLI_ARRAY_PARAM' ~^~~~~ ``` gcc: ``` In file included from ./curl/lib/content_encoding.c:36: ./brotli/x64-ucrt/usr/include/brotli/decode.h:204:5: warning: ISO C90 forbids variable length array 'encoded_buffer' [-Wvla] 204 | const uint8_t encoded_buffer[BROTLI_ARRAY_PARAM(encoded_size)], | ^~~~~ ./brotli/x64-ucrt/usr/include/brotli/decode.h:206:5: warning: ISO C90 forbids variable length array 'decoded_buffer' [-Wvla] 206 | uint8_t decoded_buffer[BROTLI_ARRAY_PARAM(*decoded_size)]); | ^~~~~~~ ``` [1] https://github.com/google/brotli/commit/ed1995b6bda19244070ab5d331111f16f67c8054 Reviewed-by: Daniel Stenberg Reviewed-by: Marcel Raad Closes #10738
2023-03-11 06:24:24 +08:00
#if defined(__GNUC__)
/* Ignore -Wvla warnings in brotli headers */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wvla"
#endif
#include <brotli/decode.h>
lib: silence clang/gcc -Wvla warnings in brotli headers brotli v1.0.0 throughout current latest v1.0.9 and latest master [1] trigger this warning. It happened with CMake and GNU Make. autotools builds avoid it with the `convert -I options to -isystem` macro. llvm/clang: ``` In file included from ./curl/lib/content_encoding.c:36: ./brotli/x64-ucrt/usr/include/brotli/decode.h:204:34: warning: variable length array used [-Wvla] const uint8_t encoded_buffer[BROTLI_ARRAY_PARAM(encoded_size)], ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ./brotli/x64-ucrt/usr/include/brotli/port.h:253:34: note: expanded from macro 'BROTLI_ARRAY_PARAM' ^~~~~~ In file included from ./curl/lib/content_encoding.c:36: ./brotli/x64-ucrt/usr/include/brotli/decode.h:206:48: warning: variable length array used [-Wvla] uint8_t decoded_buffer[BROTLI_ARRAY_PARAM(*decoded_size)]); ~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~ ./brotli/x64-ucrt/usr/include/brotli/port.h:253:35: note: expanded from macro 'BROTLI_ARRAY_PARAM' ~^~~~~ ``` gcc: ``` In file included from ./curl/lib/content_encoding.c:36: ./brotli/x64-ucrt/usr/include/brotli/decode.h:204:5: warning: ISO C90 forbids variable length array 'encoded_buffer' [-Wvla] 204 | const uint8_t encoded_buffer[BROTLI_ARRAY_PARAM(encoded_size)], | ^~~~~ ./brotli/x64-ucrt/usr/include/brotli/decode.h:206:5: warning: ISO C90 forbids variable length array 'decoded_buffer' [-Wvla] 206 | uint8_t decoded_buffer[BROTLI_ARRAY_PARAM(*decoded_size)]); | ^~~~~~~ ``` [1] https://github.com/google/brotli/commit/ed1995b6bda19244070ab5d331111f16f67c8054 Reviewed-by: Daniel Stenberg Reviewed-by: Marcel Raad Closes #10738
2023-03-11 06:24:24 +08:00
#if defined(__GNUC__)
#pragma GCC diagnostic pop
#endif
#endif
#ifdef HAVE_ZSTD
#include <zstd.h>
#endif
#ifdef USE_GSASL
#include <gsasl.h>
#endif
#ifdef USE_OPENLDAP
#include <ldap.h>
#endif
#ifdef HAVE_BROTLI
static void brotli_version(char *buf, size_t bufsz)
{
uint32_t brotli_version = BrotliDecoderVersion();
unsigned int major = brotli_version >> 24;
unsigned int minor = (brotli_version & 0x00FFFFFF) >> 12;
unsigned int patch = brotli_version & 0x00000FFF;
(void)msnprintf(buf, bufsz, "%u.%u.%u", major, minor, patch);
}
#endif
#ifdef HAVE_ZSTD
static void zstd_version(char *buf, size_t bufsz)
{
unsigned long zstd_version = (unsigned long)ZSTD_versionNumber();
unsigned int major = (unsigned int)(zstd_version / (100 * 100));
unsigned int minor = (unsigned int)((zstd_version -
(major * 100 * 100)) / 100);
unsigned int patch = (unsigned int)(zstd_version -
(major * 100 * 100) - (minor * 100));
(void)msnprintf(buf, bufsz, "%u.%u.%u", major, minor, patch);
}
#endif
/*
* curl_version() returns a pointer to a static buffer.
*
* It is implemented to work multi-threaded by making sure repeated invokes
* generate the exact same string and never write any temporary data like
* zeros in the data.
*/
#define VERSION_PARTS 16 /* number of substrings we can concatenate */
char *curl_version(void)
{
static char out[300];
char *outp;
size_t outlen;
const char *src[VERSION_PARTS];
#ifdef USE_SSL
char ssl_version[200];
#endif
#ifdef HAVE_LIBZ
char z_version[40];
#endif
#ifdef HAVE_BROTLI
char br_version[40] = "brotli/";
#endif
#ifdef HAVE_ZSTD
char zst_version[40] = "zstd/";
#endif
#ifdef USE_ARES
char cares_version[40];
#endif
#if defined(USE_LIBIDN2)
char idn_version[40];
#endif
#ifdef USE_LIBPSL
char psl_version[40];
#endif
#ifdef USE_SSH
char ssh_version[40];
#endif
#ifdef USE_NGHTTP2
char h2_version[40];
#endif
#ifdef ENABLE_QUIC
char h3_version[40];
#endif
#ifdef USE_LIBRTMP
char rtmp_version[40];
2020-12-14 21:10:33 +08:00
#endif
#ifdef USE_HYPER
char hyper_buf[30];
#endif
#ifdef USE_GSASL
char gsasl_buf[30];
#endif
#ifdef USE_OPENLDAP
char ldap_buf[30];
#endif
int i = 0;
int j;
1999-12-29 22:20:26 +08:00
#ifdef DEBUGBUILD
/* Override version string when environment variable CURL_VERSION is set */
const char *debugversion = getenv("CURL_VERSION");
if(debugversion) {
strncpy(out, debugversion, sizeof(out)-1);
out[sizeof(out)-1] = '\0';
return out;
}
#endif
src[i++] = LIBCURL_NAME "/" LIBCURL_VERSION;
#ifdef USE_SSL
Curl_ssl_version(ssl_version, sizeof(ssl_version));
src[i++] = ssl_version;
#endif
#ifdef HAVE_LIBZ
msnprintf(z_version, sizeof(z_version), "zlib/%s", zlibVersion());
src[i++] = z_version;
#endif
#ifdef HAVE_BROTLI
brotli_version(&br_version[7], sizeof(br_version) - 7);
src[i++] = br_version;
#endif
#ifdef HAVE_ZSTD
zstd_version(&zst_version[5], sizeof(zst_version) - 5);
src[i++] = zst_version;
#endif
#ifdef USE_ARES
msnprintf(cares_version, sizeof(cares_version),
"c-ares/%s", ares_version(NULL));
src[i++] = cares_version;
#endif
#ifdef USE_LIBIDN2
msnprintf(idn_version, sizeof(idn_version),
"libidn2/%s", idn2_check_version(NULL));
src[i++] = idn_version;
#elif defined(USE_WIN32_IDN)
src[i++] = (char *)"WinIDN";
2004-04-26 15:14:08 +08:00
#endif
#ifdef USE_LIBPSL
msnprintf(psl_version, sizeof(psl_version), "libpsl/%s", psl_get_version());
src[i++] = psl_version;
#endif
#ifdef USE_SSH
Curl_ssh_version(ssh_version, sizeof(ssh_version));
src[i++] = ssh_version;
#endif
#ifdef USE_NGHTTP2
Curl_http2_ver(h2_version, sizeof(h2_version));
src[i++] = h2_version;
#endif
#ifdef ENABLE_QUIC
Curl_quic_ver(h3_version, sizeof(h3_version));
src[i++] = h3_version;
#endif
#ifdef USE_LIBRTMP
{
char suff[2];
if(RTMP_LIB_VERSION & 0xff) {
suff[0] = (RTMP_LIB_VERSION & 0xff) + 'a' - 1;
suff[1] = '\0';
}
else
suff[0] = '\0';
msnprintf(rtmp_version, sizeof(rtmp_version), "librtmp/%d.%d%s",
RTMP_LIB_VERSION >> 16, (RTMP_LIB_VERSION >> 8) & 0xff,
suff);
src[i++] = rtmp_version;
}
#endif
2020-12-14 21:10:33 +08:00
#ifdef USE_HYPER
msnprintf(hyper_buf, sizeof(hyper_buf), "Hyper/%s", hyper_version());
src[i++] = hyper_buf;
#endif
#ifdef USE_GSASL
msnprintf(gsasl_buf, sizeof(gsasl_buf), "libgsasl/%s",
gsasl_check_version(NULL));
src[i++] = gsasl_buf;
#endif
#ifdef USE_OPENLDAP
{
LDAPAPIInfo api;
api.ldapai_info_version = LDAP_API_INFO_VERSION;
if(ldap_get_option(NULL, LDAP_OPT_API_INFO, &api) == LDAP_OPT_SUCCESS) {
unsigned int patch = api.ldapai_vendor_version % 100;
unsigned int major = api.ldapai_vendor_version / 10000;
unsigned int minor =
((api.ldapai_vendor_version - major * 10000) - patch) / 100;
msnprintf(ldap_buf, sizeof(ldap_buf), "%s/%u.%u.%u",
api.ldapai_vendor_name, major, minor, patch);
src[i++] = ldap_buf;
ldap_memfree(api.ldapai_vendor_name);
ber_memvfree((void **)api.ldapai_extensions);
}
}
#endif
1999-12-29 22:20:26 +08:00
DEBUGASSERT(i <= VERSION_PARTS);
outp = &out[0];
outlen = sizeof(out);
for(j = 0; j < i; j++) {
size_t n = strlen(src[j]);
/* we need room for a space, the string and the final zero */
if(outlen <= (n + 2))
break;
if(j) {
/* prepend a space if not the first */
*outp++ = ' ';
outlen--;
}
memcpy(outp, src[j], n);
outp += n;
outlen -= n;
}
*outp = 0;
return out;
1999-12-29 22:20:26 +08:00
}
/* data for curl_version_info
Keep the list sorted alphabetically. It is also written so that each
protocol line has its own #if line to make things easier on the eye.
*/
cmake: add support for "unity" builds Aka "jumbo" or "amalgamation" builds. It means to compile all sources per target as a single C source. This is experimental. You can enable it by passing `-DCMAKE_UNITY_BUILD=ON` to cmake. It requires CMake 3.16 or newer. It makes builds (much) faster, allows for better optimizations and tends to promote less ambiguous code. Also add a new AppVeyor CI job and convert an existing one to use "unity" mode (one MSVC, one MinGW), and enable it for one macOS CI job. Fix related issues: - add missing include guard to `easy_lock.h`. - rename static variables and functions (and a macro) with names reused across sources, or shadowed by local variables. - add an `#undef` after use. - add a missing `#undef` before use. - move internal definitions from `ftp.h` to `ftp.c`. - `curl_memory.h` fixes to make it work when included repeatedly. - stop building/linking curlx bits twice for a static-mode curl tool. These caused doubly defined symbols in unity builds. - silence missing extern declarations compiler warning for ` _CRT_glob`. - fix extern declarations for `tool_freq` and `tool_isVistaOrGreater`. - fix colliding static symbols in debug mode: `debugtime()` and `statename`. - rename `ssl_backend_data` structure to unique names for each TLS-backend, along with the `ssl_connect_data` struct member referencing them. This required adding casts for each access. - add workaround for missing `[P]UNICODE_STRING` types in certain Windows builds when compiling `lib/ldap.c`. To support "unity" builds, we had to enable `SCHANNEL_USE_BLACKLISTS` for Schannel (a Windows `schannel.h` option) _globally_. This caused an indirect inclusion of Windows `schannel.h` from `ldap.c` via `winldap.h` to have it enabled as well. This requires `[P]UNICODE_STRING` types, which is apperantly not defined automatically (as seen with both MSVS and mingw-w64). This patch includes `<subauth.h>` to fix it. Ref: https://github.com/curl/curl/runs/13987772013 Ref: https://dev.azure.com/daniel0244/curl/_build/results?buildId=15827&view=logs&jobId=2c9f582d-e278-56b6-4354-f38a4d851906&j=2c9f582d-e278-56b6-4354-f38a4d851906&t=90509b00-34fa-5a81-35d7-5ed9569d331c - tweak unity builds to compile `lib/memdebug.c` separately in memory trace builds to avoid PP confusion. - force-disable unity for test programs. - do not compile and link libcurl sources to libtests _twice_ when libcurl is built in static mode. KNOWN ISSUES: - running tests with unity builds may fail in cases. - some build configurations/env may not compile in unity mode. E.g.: https://ci.appveyor.com/project/curlorg/curl/builds/47230972/job/51wfesgnfuauwl8q#L250 Ref: https://github.com/libssh2/libssh2/issues/1034 Ref: https://cmake.org/cmake/help/latest/prop_tgt/UNITY_BUILD.html Ref: https://en.wikipedia.org/wiki/Unity_build Closes #11095
2023-05-09 18:10:40 +08:00
static const char * const supported_protocols[] = {
#ifndef CURL_DISABLE_DICT
"dict",
#endif
#ifndef CURL_DISABLE_FILE
"file",
#endif
#ifndef CURL_DISABLE_FTP
"ftp",
#endif
#if defined(USE_SSL) && !defined(CURL_DISABLE_FTP)
"ftps",
#endif
#ifndef CURL_DISABLE_GOPHER
"gopher",
#endif
#if defined(USE_SSL) && !defined(CURL_DISABLE_GOPHER)
"gophers",
#endif
#ifndef CURL_DISABLE_HTTP
"http",
#endif
#if defined(USE_SSL) && !defined(CURL_DISABLE_HTTP)
"https",
#endif
#ifndef CURL_DISABLE_IMAP
"imap",
#endif
#if defined(USE_SSL) && !defined(CURL_DISABLE_IMAP)
"imaps",
#endif
2010-06-01 23:25:03 +08:00
#ifndef CURL_DISABLE_LDAP
"ldap",
#if !defined(CURL_DISABLE_LDAPS) && \
((defined(USE_OPENLDAP) && defined(USE_SSL)) || \
(!defined(USE_OPENLDAP) && defined(HAVE_LDAP_SSL)))
"ldaps",
#endif
#endif
#ifndef CURL_DISABLE_MQTT
"mqtt",
#endif
#ifndef CURL_DISABLE_POP3
"pop3",
#endif
#if defined(USE_SSL) && !defined(CURL_DISABLE_POP3)
"pop3s",
#endif
#ifdef USE_LIBRTMP
"rtmp",
"rtmpe",
"rtmps",
"rtmpt",
"rtmpte",
"rtmpts",
#endif
#ifndef CURL_DISABLE_RTSP
"rtsp",
#endif
#if defined(USE_SSH) && !defined(USE_WOLFSSH)
"scp",
#endif
#ifdef USE_SSH
"sftp",
#endif
#if !defined(CURL_DISABLE_SMB) && defined(USE_CURL_NTLM_CORE)
"smb",
# ifdef USE_SSL
"smbs",
# endif
#endif
#ifndef CURL_DISABLE_SMTP
"smtp",
#endif
#if defined(USE_SSL) && !defined(CURL_DISABLE_SMTP)
"smtps",
#endif
#ifndef CURL_DISABLE_TELNET
"telnet",
#endif
#ifndef CURL_DISABLE_TFTP
"tftp",
#endif
2022-09-09 21:11:14 +08:00
#ifdef USE_WEBSOCKETS
"ws",
#endif
#if defined(USE_SSL) && defined(USE_WEBSOCKETS)
"wss",
#endif
NULL
};
/*
* 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
#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
/*
* 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
#ifdef CURLRES_ASYNCH
FEATURE("AsynchDNS", NULL, CURL_VERSION_ASYNCHDNS),
#endif
#ifdef HAVE_BROTLI
FEATURE("brotli", NULL, CURL_VERSION_BROTLI),
#endif
#ifdef DEBUGBUILD
FEATURE("Debug", NULL, CURL_VERSION_DEBUG),
#endif
#ifdef USE_GSASL
FEATURE("gsasl", NULL, CURL_VERSION_GSASL),
#endif
#ifdef HAVE_GSSAPI
FEATURE("GSS-API", NULL, CURL_VERSION_GSSAPI),
#endif
#ifndef CURL_DISABLE_HSTS
FEATURE("HSTS", NULL, CURL_VERSION_HSTS),
#endif
#if defined(USE_NGHTTP2) || defined(USE_HYPER)
FEATURE("HTTP2", NULL, CURL_VERSION_HTTP2),
#endif
#if defined(ENABLE_QUIC)
FEATURE("HTTP3", NULL, CURL_VERSION_HTTP3),
#endif
#if defined(USE_SSL) && !defined(CURL_DISABLE_PROXY)
FEATURE("HTTPS-proxy", https_proxy_present, CURL_VERSION_HTTPS_PROXY),
#endif
#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) )
FEATURE("Largefile", NULL, CURL_VERSION_LARGEFILE),
#endif
#ifdef HAVE_LIBZ
FEATURE("libz", NULL, CURL_VERSION_LIBZ),
#endif
#ifdef CURL_WITH_MULTI_SSL
FEATURE("MultiSSL", NULL, CURL_VERSION_MULTI_SSL),
libcurl: add UNIX domain sockets support The ability to do HTTP requests over a UNIX domain socket has been requested before, in Apr 2008 [0][1] and Sep 2010 [2]. While a discussion happened, no patch seems to get through. I decided to give it a go since I need to test a nginx HTTP server which listens on a UNIX domain socket. One patch [3] seems to make it possible to use the CURLOPT_OPENSOCKETFUNCTION function to gain a UNIX domain socket. Another person wrote a Go program which can do HTTP over a UNIX socket for Docker[4] which uses a special URL scheme (though the name contains cURL, it has no relation to the cURL library). This patch considers support for UNIX domain sockets at the same level as HTTP proxies / IPv6, it acts as an intermediate socket provider and not as a separate protocol. Since this feature affects network operations, a new feature flag was added ("unix-sockets") with a corresponding CURL_VERSION_UNIX_SOCKETS macro. A new CURLOPT_UNIX_SOCKET_PATH option is added and documented. This option enables UNIX domain sockets support for all requests on the handle (replacing IP sockets and skipping proxies). A new configure option (--enable-unix-sockets) and CMake option (ENABLE_UNIX_SOCKETS) can disable this optional feature. Note that I deliberately did not mark this feature as advanced, this is a feature/component that should easily be available. [0]: http://curl.haxx.se/mail/lib-2008-04/0279.html [1]: http://daniel.haxx.se/blog/2008/04/14/http-over-unix-domain-sockets/ [2]: http://sourceforge.net/p/curl/feature-requests/53/ [3]: http://curl.haxx.se/mail/lib-2008-04/0361.html [4]: https://github.com/Soulou/curl-unix-socket Signed-off-by: Peter Wu <peter@lekensteyn.nl>
2014-11-28 06:59:25 +08:00
#endif
#ifdef USE_NTLM
FEATURE("NTLM", NULL, CURL_VERSION_NTLM),
#endif
#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)
FEATURE("PSL", NULL, CURL_VERSION_PSL),
#endif
#ifdef USE_SPNEGO
FEATURE("SPNEGO", NULL, CURL_VERSION_SPNEGO),
#endif
#ifdef USE_SSL
FEATURE("SSL", NULL, CURL_VERSION_SSL),
#endif
#ifdef USE_WINDOWS_SSPI
FEATURE("SSPI", NULL, CURL_VERSION_SSPI),
2019-03-03 18:17:52 +08:00
#endif
#ifdef GLOBAL_INIT_IS_THREADSAFE
FEATURE("threadsafe", NULL, CURL_VERSION_THREADSAFE),
#endif
#ifdef USE_TLS_SRP
FEATURE("TLS-SRP", NULL, CURL_VERSION_TLSAUTH_SRP),
#endif
#ifdef CURLDEBUG
FEATURE("TrackMemory", NULL, CURL_VERSION_CURLDEBUG),
#endif
#if defined(WIN32) && defined(UNICODE) && defined(_UNICODE)
FEATURE("Unicode", NULL, CURL_VERSION_UNICODE),
#endif
#ifdef USE_UNIX_SOCKETS
FEATURE("UnixSockets", NULL, CURL_VERSION_UNIX_SOCKETS),
#endif
#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 */
cmake: add support for "unity" builds Aka "jumbo" or "amalgamation" builds. It means to compile all sources per target as a single C source. This is experimental. You can enable it by passing `-DCMAKE_UNITY_BUILD=ON` to cmake. It requires CMake 3.16 or newer. It makes builds (much) faster, allows for better optimizations and tends to promote less ambiguous code. Also add a new AppVeyor CI job and convert an existing one to use "unity" mode (one MSVC, one MinGW), and enable it for one macOS CI job. Fix related issues: - add missing include guard to `easy_lock.h`. - rename static variables and functions (and a macro) with names reused across sources, or shadowed by local variables. - add an `#undef` after use. - add a missing `#undef` before use. - move internal definitions from `ftp.h` to `ftp.c`. - `curl_memory.h` fixes to make it work when included repeatedly. - stop building/linking curlx bits twice for a static-mode curl tool. These caused doubly defined symbols in unity builds. - silence missing extern declarations compiler warning for ` _CRT_glob`. - fix extern declarations for `tool_freq` and `tool_isVistaOrGreater`. - fix colliding static symbols in debug mode: `debugtime()` and `statename`. - rename `ssl_backend_data` structure to unique names for each TLS-backend, along with the `ssl_connect_data` struct member referencing them. This required adding casts for each access. - add workaround for missing `[P]UNICODE_STRING` types in certain Windows builds when compiling `lib/ldap.c`. To support "unity" builds, we had to enable `SCHANNEL_USE_BLACKLISTS` for Schannel (a Windows `schannel.h` option) _globally_. This caused an indirect inclusion of Windows `schannel.h` from `ldap.c` via `winldap.h` to have it enabled as well. This requires `[P]UNICODE_STRING` types, which is apperantly not defined automatically (as seen with both MSVS and mingw-w64). This patch includes `<subauth.h>` to fix it. Ref: https://github.com/curl/curl/runs/13987772013 Ref: https://dev.azure.com/daniel0244/curl/_build/results?buildId=15827&view=logs&jobId=2c9f582d-e278-56b6-4354-f38a4d851906&j=2c9f582d-e278-56b6-4354-f38a4d851906&t=90509b00-34fa-5a81-35d7-5ed9569d331c - tweak unity builds to compile `lib/memdebug.c` separately in memory trace builds to avoid PP confusion. - force-disable unity for test programs. - do not compile and link libcurl sources to libtests _twice_ when libcurl is built in static mode. KNOWN ISSUES: - running tests with unity builds may fail in cases. - some build configurations/env may not compile in unity mode. E.g.: https://ci.appveyor.com/project/curlorg/curl/builds/47230972/job/51wfesgnfuauwl8q#L250 Ref: https://github.com/libssh2/libssh2/issues/1034 Ref: https://cmake.org/cmake/help/latest/prop_tgt/UNITY_BUILD.html Ref: https://en.wikipedia.org/wiki/Unity_build Closes #11095
2023-05-09 18:10:40 +08:00
supported_protocols,
NULL, /* c-ares version */
0, /* c-ares version numerical */
2004-04-26 15:14:08 +08:00
NULL, /* libidn version */
2006-08-05 00:10:48 +08:00
0, /* iconv version */
NULL, /* ssh lib version */
0, /* brotli_ver_num */
NULL, /* brotli version */
0, /* nghttp2 version number */
NULL, /* nghttp2 version string */
NULL, /* quic library string */
#ifdef CURL_CA_BUNDLE
CURL_CA_BUNDLE, /* cainfo */
#else
NULL,
#endif
#ifdef CURL_CA_PATH
CURL_CA_PATH, /* capath */
#else
NULL,
#endif
0, /* zstd_ver_num */
2020-12-14 21:10:33 +08:00
NULL, /* zstd version */
NULL, /* Hyper 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
#ifdef USE_SSL
#ifdef CURL_WITH_MULTI_SSL
static char ssl_buffer[200];
#else
static char ssl_buffer[80];
2016-03-17 07:13:42 +08:00
#endif
#endif
#ifdef HAVE_BROTLI
static char brotli_buffer[80];
#endif
#ifdef HAVE_ZSTD
static char zstd_buffer[80];
#endif
(void)stamp; /* avoid compiler warnings, we don't use this */
2016-03-17 07:13:42 +08:00
#ifdef USE_SSL
Curl_ssl_version(ssl_buffer, sizeof(ssl_buffer));
version_info.ssl_version = ssl_buffer;
#endif
#ifdef HAVE_LIBZ
version_info.libz_version = zlibVersion();
/* libz left NULL if non-existing */
#endif
#ifdef USE_ARES
{
int aresnum;
version_info.ares = ares_version(&aresnum);
version_info.ares_num = aresnum;
}
#endif
#ifdef USE_LIBIDN2
/* 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);
#endif
2006-08-05 00:10:48 +08:00
#if defined(USE_SSH)
Curl_ssh_version(ssh_buffer, sizeof(ssh_buffer));
version_info.libssh_version = ssh_buffer;
#endif
#ifdef HAVE_BROTLI
version_info.brotli_ver_num = BrotliDecoderVersion();
brotli_version(brotli_buffer, sizeof(brotli_buffer));
version_info.brotli_version = brotli_buffer;
#endif
#ifdef HAVE_ZSTD
version_info.zstd_ver_num = (unsigned int)ZSTD_versionNumber();
zstd_version(zstd_buffer, sizeof(zstd_buffer));
version_info.zstd_version = zstd_buffer;
#endif
#ifdef USE_NGHTTP2
{
nghttp2_info *h2 = nghttp2_version(0);
version_info.nghttp2_ver_num = h2->version_num;
version_info.nghttp2_version = h2->version_str;
}
#endif
#ifdef ENABLE_QUIC
{
static char quicbuffer[80];
Curl_quic_ver(quicbuffer, sizeof(quicbuffer));
version_info.quic_version = quicbuffer;
}
#endif
2020-12-14 21:10:33 +08:00
#ifdef USE_HYPER
{
static char hyper_buffer[30];
msnprintf(hyper_buffer, sizeof(hyper_buffer), "Hyper/%s", hyper_version());
version_info.hyper_version = hyper_buffer;
}
#endif
#ifdef USE_GSASL
{
version_info.gsasl_version = gsasl_check_version(NULL);
}
#endif
/* 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;
}