1*6236dae4SAndroid Build Coastguard Worker /***************************************************************************
2*6236dae4SAndroid Build Coastguard Worker * _ _ ____ _
3*6236dae4SAndroid Build Coastguard Worker * Project ___| | | | _ \| |
4*6236dae4SAndroid Build Coastguard Worker * / __| | | | |_) | |
5*6236dae4SAndroid Build Coastguard Worker * | (__| |_| | _ <| |___
6*6236dae4SAndroid Build Coastguard Worker * \___|\___/|_| \_\_____|
7*6236dae4SAndroid Build Coastguard Worker *
8*6236dae4SAndroid Build Coastguard Worker * Copyright (C) Daniel Stenberg, <[email protected]>, et al.
9*6236dae4SAndroid Build Coastguard Worker *
10*6236dae4SAndroid Build Coastguard Worker * This software is licensed as described in the file COPYING, which
11*6236dae4SAndroid Build Coastguard Worker * you should have received as part of this distribution. The terms
12*6236dae4SAndroid Build Coastguard Worker * are also available at https://curl.se/docs/copyright.html.
13*6236dae4SAndroid Build Coastguard Worker *
14*6236dae4SAndroid Build Coastguard Worker * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15*6236dae4SAndroid Build Coastguard Worker * copies of the Software, and permit persons to whom the Software is
16*6236dae4SAndroid Build Coastguard Worker * furnished to do so, under the terms of the COPYING file.
17*6236dae4SAndroid Build Coastguard Worker *
18*6236dae4SAndroid Build Coastguard Worker * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19*6236dae4SAndroid Build Coastguard Worker * KIND, either express or implied.
20*6236dae4SAndroid Build Coastguard Worker *
21*6236dae4SAndroid Build Coastguard Worker * SPDX-License-Identifier: curl
22*6236dae4SAndroid Build Coastguard Worker *
23*6236dae4SAndroid Build Coastguard Worker ***************************************************************************/
24*6236dae4SAndroid Build Coastguard Worker
25*6236dae4SAndroid Build Coastguard Worker #include "curl_setup.h"
26*6236dae4SAndroid Build Coastguard Worker
27*6236dae4SAndroid Build Coastguard Worker #ifdef USE_NGHTTP2
28*6236dae4SAndroid Build Coastguard Worker #include <nghttp2/nghttp2.h>
29*6236dae4SAndroid Build Coastguard Worker #endif
30*6236dae4SAndroid Build Coastguard Worker
31*6236dae4SAndroid Build Coastguard Worker #include <curl/curl.h>
32*6236dae4SAndroid Build Coastguard Worker #include "urldata.h"
33*6236dae4SAndroid Build Coastguard Worker #include "vtls/vtls.h"
34*6236dae4SAndroid Build Coastguard Worker #include "http2.h"
35*6236dae4SAndroid Build Coastguard Worker #include "vssh/ssh.h"
36*6236dae4SAndroid Build Coastguard Worker #include "vquic/vquic.h"
37*6236dae4SAndroid Build Coastguard Worker #include "curl_printf.h"
38*6236dae4SAndroid Build Coastguard Worker #include "easy_lock.h"
39*6236dae4SAndroid Build Coastguard Worker
40*6236dae4SAndroid Build Coastguard Worker #ifdef USE_ARES
41*6236dae4SAndroid Build Coastguard Worker # if defined(CURL_STATICLIB) && !defined(CARES_STATICLIB) && \
42*6236dae4SAndroid Build Coastguard Worker defined(_WIN32)
43*6236dae4SAndroid Build Coastguard Worker # define CARES_STATICLIB
44*6236dae4SAndroid Build Coastguard Worker # endif
45*6236dae4SAndroid Build Coastguard Worker # include <ares.h>
46*6236dae4SAndroid Build Coastguard Worker #endif
47*6236dae4SAndroid Build Coastguard Worker
48*6236dae4SAndroid Build Coastguard Worker #ifdef USE_LIBIDN2
49*6236dae4SAndroid Build Coastguard Worker #include <idn2.h>
50*6236dae4SAndroid Build Coastguard Worker #endif
51*6236dae4SAndroid Build Coastguard Worker
52*6236dae4SAndroid Build Coastguard Worker #ifdef USE_LIBPSL
53*6236dae4SAndroid Build Coastguard Worker #include <libpsl.h>
54*6236dae4SAndroid Build Coastguard Worker #endif
55*6236dae4SAndroid Build Coastguard Worker
56*6236dae4SAndroid Build Coastguard Worker #ifdef USE_LIBRTMP
57*6236dae4SAndroid Build Coastguard Worker #include <librtmp/rtmp.h>
58*6236dae4SAndroid Build Coastguard Worker #include "curl_rtmp.h"
59*6236dae4SAndroid Build Coastguard Worker #endif
60*6236dae4SAndroid Build Coastguard Worker
61*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_LIBZ
62*6236dae4SAndroid Build Coastguard Worker #include <zlib.h>
63*6236dae4SAndroid Build Coastguard Worker #endif
64*6236dae4SAndroid Build Coastguard Worker
65*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_BROTLI
66*6236dae4SAndroid Build Coastguard Worker #if defined(__GNUC__) || defined(__clang__)
67*6236dae4SAndroid Build Coastguard Worker /* Ignore -Wvla warnings in brotli headers */
68*6236dae4SAndroid Build Coastguard Worker #pragma GCC diagnostic push
69*6236dae4SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wvla"
70*6236dae4SAndroid Build Coastguard Worker #endif
71*6236dae4SAndroid Build Coastguard Worker #include <brotli/decode.h>
72*6236dae4SAndroid Build Coastguard Worker #if defined(__GNUC__) || defined(__clang__)
73*6236dae4SAndroid Build Coastguard Worker #pragma GCC diagnostic pop
74*6236dae4SAndroid Build Coastguard Worker #endif
75*6236dae4SAndroid Build Coastguard Worker #endif
76*6236dae4SAndroid Build Coastguard Worker
77*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_ZSTD
78*6236dae4SAndroid Build Coastguard Worker #include <zstd.h>
79*6236dae4SAndroid Build Coastguard Worker #endif
80*6236dae4SAndroid Build Coastguard Worker
81*6236dae4SAndroid Build Coastguard Worker #ifdef USE_GSASL
82*6236dae4SAndroid Build Coastguard Worker #include <gsasl.h>
83*6236dae4SAndroid Build Coastguard Worker #endif
84*6236dae4SAndroid Build Coastguard Worker
85*6236dae4SAndroid Build Coastguard Worker #ifdef USE_OPENLDAP
86*6236dae4SAndroid Build Coastguard Worker #include <ldap.h>
87*6236dae4SAndroid Build Coastguard Worker #endif
88*6236dae4SAndroid Build Coastguard Worker
89*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_BROTLI
brotli_version(char * buf,size_t bufsz)90*6236dae4SAndroid Build Coastguard Worker static void brotli_version(char *buf, size_t bufsz)
91*6236dae4SAndroid Build Coastguard Worker {
92*6236dae4SAndroid Build Coastguard Worker uint32_t brotli_version = BrotliDecoderVersion();
93*6236dae4SAndroid Build Coastguard Worker unsigned int major = brotli_version >> 24;
94*6236dae4SAndroid Build Coastguard Worker unsigned int minor = (brotli_version & 0x00FFFFFF) >> 12;
95*6236dae4SAndroid Build Coastguard Worker unsigned int patch = brotli_version & 0x00000FFF;
96*6236dae4SAndroid Build Coastguard Worker (void)msnprintf(buf, bufsz, "brotli/%u.%u.%u", major, minor, patch);
97*6236dae4SAndroid Build Coastguard Worker }
98*6236dae4SAndroid Build Coastguard Worker #endif
99*6236dae4SAndroid Build Coastguard Worker
100*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_ZSTD
zstd_version(char * buf,size_t bufsz)101*6236dae4SAndroid Build Coastguard Worker static void zstd_version(char *buf, size_t bufsz)
102*6236dae4SAndroid Build Coastguard Worker {
103*6236dae4SAndroid Build Coastguard Worker unsigned int version = ZSTD_versionNumber();
104*6236dae4SAndroid Build Coastguard Worker unsigned int major = version / (100 * 100);
105*6236dae4SAndroid Build Coastguard Worker unsigned int minor = (version - (major * 100 * 100)) / 100;
106*6236dae4SAndroid Build Coastguard Worker unsigned int patch = version - (major * 100 * 100) - (minor * 100);
107*6236dae4SAndroid Build Coastguard Worker (void)msnprintf(buf, bufsz, "zstd/%u.%u.%u", major, minor, patch);
108*6236dae4SAndroid Build Coastguard Worker }
109*6236dae4SAndroid Build Coastguard Worker #endif
110*6236dae4SAndroid Build Coastguard Worker
111*6236dae4SAndroid Build Coastguard Worker #ifdef USE_OPENLDAP
oldap_version(char * buf,size_t bufsz)112*6236dae4SAndroid Build Coastguard Worker static void oldap_version(char *buf, size_t bufsz)
113*6236dae4SAndroid Build Coastguard Worker {
114*6236dae4SAndroid Build Coastguard Worker LDAPAPIInfo api;
115*6236dae4SAndroid Build Coastguard Worker api.ldapai_info_version = LDAP_API_INFO_VERSION;
116*6236dae4SAndroid Build Coastguard Worker
117*6236dae4SAndroid Build Coastguard Worker if(ldap_get_option(NULL, LDAP_OPT_API_INFO, &api) == LDAP_OPT_SUCCESS) {
118*6236dae4SAndroid Build Coastguard Worker unsigned int patch = (unsigned int)(api.ldapai_vendor_version % 100);
119*6236dae4SAndroid Build Coastguard Worker unsigned int major = (unsigned int)(api.ldapai_vendor_version / 10000);
120*6236dae4SAndroid Build Coastguard Worker unsigned int minor =
121*6236dae4SAndroid Build Coastguard Worker (((unsigned int)api.ldapai_vendor_version - major * 10000)
122*6236dae4SAndroid Build Coastguard Worker - patch) / 100;
123*6236dae4SAndroid Build Coastguard Worker msnprintf(buf, bufsz, "%s/%u.%u.%u",
124*6236dae4SAndroid Build Coastguard Worker api.ldapai_vendor_name, major, minor, patch);
125*6236dae4SAndroid Build Coastguard Worker ldap_memfree(api.ldapai_vendor_name);
126*6236dae4SAndroid Build Coastguard Worker ber_memvfree((void **)api.ldapai_extensions);
127*6236dae4SAndroid Build Coastguard Worker }
128*6236dae4SAndroid Build Coastguard Worker else
129*6236dae4SAndroid Build Coastguard Worker msnprintf(buf, bufsz, "OpenLDAP");
130*6236dae4SAndroid Build Coastguard Worker }
131*6236dae4SAndroid Build Coastguard Worker #endif
132*6236dae4SAndroid Build Coastguard Worker
133*6236dae4SAndroid Build Coastguard Worker #ifdef USE_LIBPSL
psl_version(char * buf,size_t bufsz)134*6236dae4SAndroid Build Coastguard Worker static void psl_version(char *buf, size_t bufsz)
135*6236dae4SAndroid Build Coastguard Worker {
136*6236dae4SAndroid Build Coastguard Worker #if defined(PSL_VERSION_MAJOR) && (PSL_VERSION_MAJOR > 0 || \
137*6236dae4SAndroid Build Coastguard Worker PSL_VERSION_MINOR >= 11)
138*6236dae4SAndroid Build Coastguard Worker int num = psl_check_version_number(0);
139*6236dae4SAndroid Build Coastguard Worker msnprintf(buf, bufsz, "libpsl/%d.%d.%d",
140*6236dae4SAndroid Build Coastguard Worker num >> 16, (num >> 8) & 0xff, num & 0xff);
141*6236dae4SAndroid Build Coastguard Worker #else
142*6236dae4SAndroid Build Coastguard Worker msnprintf(buf, bufsz, "libpsl/%s", psl_get_version());
143*6236dae4SAndroid Build Coastguard Worker #endif
144*6236dae4SAndroid Build Coastguard Worker }
145*6236dae4SAndroid Build Coastguard Worker #endif
146*6236dae4SAndroid Build Coastguard Worker
147*6236dae4SAndroid Build Coastguard Worker #if defined(USE_LIBIDN2) || defined(USE_WIN32_IDN) || defined(USE_APPLE_IDN)
148*6236dae4SAndroid Build Coastguard Worker #define USE_IDN
149*6236dae4SAndroid Build Coastguard Worker #endif
150*6236dae4SAndroid Build Coastguard Worker
151*6236dae4SAndroid Build Coastguard Worker #ifdef USE_IDN
idn_version(char * buf,size_t bufsz)152*6236dae4SAndroid Build Coastguard Worker static void idn_version(char *buf, size_t bufsz)
153*6236dae4SAndroid Build Coastguard Worker {
154*6236dae4SAndroid Build Coastguard Worker #ifdef USE_LIBIDN2
155*6236dae4SAndroid Build Coastguard Worker msnprintf(buf, bufsz, "libidn2/%s", idn2_check_version(NULL));
156*6236dae4SAndroid Build Coastguard Worker #elif defined(USE_WIN32_IDN)
157*6236dae4SAndroid Build Coastguard Worker msnprintf(buf, bufsz, "WinIDN");
158*6236dae4SAndroid Build Coastguard Worker #elif defined(USE_APPLE_IDN)
159*6236dae4SAndroid Build Coastguard Worker msnprintf(buf, bufsz, "AppleIDN");
160*6236dae4SAndroid Build Coastguard Worker #endif
161*6236dae4SAndroid Build Coastguard Worker }
162*6236dae4SAndroid Build Coastguard Worker #endif
163*6236dae4SAndroid Build Coastguard Worker
164*6236dae4SAndroid Build Coastguard Worker /*
165*6236dae4SAndroid Build Coastguard Worker * curl_version() returns a pointer to a static buffer.
166*6236dae4SAndroid Build Coastguard Worker *
167*6236dae4SAndroid Build Coastguard Worker * It is implemented to work multi-threaded by making sure repeated invokes
168*6236dae4SAndroid Build Coastguard Worker * generate the exact same string and never write any temporary data like
169*6236dae4SAndroid Build Coastguard Worker * zeros in the data.
170*6236dae4SAndroid Build Coastguard Worker */
171*6236dae4SAndroid Build Coastguard Worker
172*6236dae4SAndroid Build Coastguard Worker #define VERSION_PARTS 16 /* number of substrings we can concatenate */
173*6236dae4SAndroid Build Coastguard Worker
curl_version(void)174*6236dae4SAndroid Build Coastguard Worker char *curl_version(void)
175*6236dae4SAndroid Build Coastguard Worker {
176*6236dae4SAndroid Build Coastguard Worker static char out[300];
177*6236dae4SAndroid Build Coastguard Worker char *outp;
178*6236dae4SAndroid Build Coastguard Worker size_t outlen;
179*6236dae4SAndroid Build Coastguard Worker const char *src[VERSION_PARTS];
180*6236dae4SAndroid Build Coastguard Worker #ifdef USE_SSL
181*6236dae4SAndroid Build Coastguard Worker char ssl_version[200];
182*6236dae4SAndroid Build Coastguard Worker #endif
183*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_LIBZ
184*6236dae4SAndroid Build Coastguard Worker char z_version[30];
185*6236dae4SAndroid Build Coastguard Worker #endif
186*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_BROTLI
187*6236dae4SAndroid Build Coastguard Worker char br_version[30];
188*6236dae4SAndroid Build Coastguard Worker #endif
189*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_ZSTD
190*6236dae4SAndroid Build Coastguard Worker char zstd_ver[30];
191*6236dae4SAndroid Build Coastguard Worker #endif
192*6236dae4SAndroid Build Coastguard Worker #ifdef USE_ARES
193*6236dae4SAndroid Build Coastguard Worker char cares_version[30];
194*6236dae4SAndroid Build Coastguard Worker #endif
195*6236dae4SAndroid Build Coastguard Worker #ifdef USE_IDN
196*6236dae4SAndroid Build Coastguard Worker char idn_ver[30];
197*6236dae4SAndroid Build Coastguard Worker #endif
198*6236dae4SAndroid Build Coastguard Worker #ifdef USE_LIBPSL
199*6236dae4SAndroid Build Coastguard Worker char psl_ver[30];
200*6236dae4SAndroid Build Coastguard Worker #endif
201*6236dae4SAndroid Build Coastguard Worker #ifdef USE_SSH
202*6236dae4SAndroid Build Coastguard Worker char ssh_version[30];
203*6236dae4SAndroid Build Coastguard Worker #endif
204*6236dae4SAndroid Build Coastguard Worker #ifdef USE_NGHTTP2
205*6236dae4SAndroid Build Coastguard Worker char h2_version[30];
206*6236dae4SAndroid Build Coastguard Worker #endif
207*6236dae4SAndroid Build Coastguard Worker #ifdef USE_HTTP3
208*6236dae4SAndroid Build Coastguard Worker char h3_version[30];
209*6236dae4SAndroid Build Coastguard Worker #endif
210*6236dae4SAndroid Build Coastguard Worker #ifdef USE_LIBRTMP
211*6236dae4SAndroid Build Coastguard Worker char rtmp_version[30];
212*6236dae4SAndroid Build Coastguard Worker #endif
213*6236dae4SAndroid Build Coastguard Worker #ifdef USE_HYPER
214*6236dae4SAndroid Build Coastguard Worker char hyper_buf[30];
215*6236dae4SAndroid Build Coastguard Worker #endif
216*6236dae4SAndroid Build Coastguard Worker #ifdef USE_GSASL
217*6236dae4SAndroid Build Coastguard Worker char gsasl_buf[30];
218*6236dae4SAndroid Build Coastguard Worker #endif
219*6236dae4SAndroid Build Coastguard Worker #ifdef USE_OPENLDAP
220*6236dae4SAndroid Build Coastguard Worker char ldap_buf[30];
221*6236dae4SAndroid Build Coastguard Worker #endif
222*6236dae4SAndroid Build Coastguard Worker int i = 0;
223*6236dae4SAndroid Build Coastguard Worker int j;
224*6236dae4SAndroid Build Coastguard Worker
225*6236dae4SAndroid Build Coastguard Worker #ifdef DEBUGBUILD
226*6236dae4SAndroid Build Coastguard Worker /* Override version string when environment variable CURL_VERSION is set */
227*6236dae4SAndroid Build Coastguard Worker const char *debugversion = getenv("CURL_VERSION");
228*6236dae4SAndroid Build Coastguard Worker if(debugversion) {
229*6236dae4SAndroid Build Coastguard Worker msnprintf(out, sizeof(out), "%s", debugversion);
230*6236dae4SAndroid Build Coastguard Worker return out;
231*6236dae4SAndroid Build Coastguard Worker }
232*6236dae4SAndroid Build Coastguard Worker #endif
233*6236dae4SAndroid Build Coastguard Worker
234*6236dae4SAndroid Build Coastguard Worker src[i++] = LIBCURL_NAME "/" LIBCURL_VERSION;
235*6236dae4SAndroid Build Coastguard Worker #ifdef USE_SSL
236*6236dae4SAndroid Build Coastguard Worker Curl_ssl_version(ssl_version, sizeof(ssl_version));
237*6236dae4SAndroid Build Coastguard Worker src[i++] = ssl_version;
238*6236dae4SAndroid Build Coastguard Worker #endif
239*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_LIBZ
240*6236dae4SAndroid Build Coastguard Worker msnprintf(z_version, sizeof(z_version), "zlib/%s", zlibVersion());
241*6236dae4SAndroid Build Coastguard Worker src[i++] = z_version;
242*6236dae4SAndroid Build Coastguard Worker #endif
243*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_BROTLI
244*6236dae4SAndroid Build Coastguard Worker brotli_version(br_version, sizeof(br_version));
245*6236dae4SAndroid Build Coastguard Worker src[i++] = br_version;
246*6236dae4SAndroid Build Coastguard Worker #endif
247*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_ZSTD
248*6236dae4SAndroid Build Coastguard Worker zstd_version(zstd_ver, sizeof(zstd_ver));
249*6236dae4SAndroid Build Coastguard Worker src[i++] = zstd_ver;
250*6236dae4SAndroid Build Coastguard Worker #endif
251*6236dae4SAndroid Build Coastguard Worker #ifdef USE_ARES
252*6236dae4SAndroid Build Coastguard Worker msnprintf(cares_version, sizeof(cares_version),
253*6236dae4SAndroid Build Coastguard Worker "c-ares/%s", ares_version(NULL));
254*6236dae4SAndroid Build Coastguard Worker src[i++] = cares_version;
255*6236dae4SAndroid Build Coastguard Worker #endif
256*6236dae4SAndroid Build Coastguard Worker #ifdef USE_IDN
257*6236dae4SAndroid Build Coastguard Worker idn_version(idn_ver, sizeof(idn_ver));
258*6236dae4SAndroid Build Coastguard Worker src[i++] = idn_ver;
259*6236dae4SAndroid Build Coastguard Worker #endif
260*6236dae4SAndroid Build Coastguard Worker #ifdef USE_LIBPSL
261*6236dae4SAndroid Build Coastguard Worker psl_version(psl_ver, sizeof(psl_ver));
262*6236dae4SAndroid Build Coastguard Worker src[i++] = psl_ver;
263*6236dae4SAndroid Build Coastguard Worker #endif
264*6236dae4SAndroid Build Coastguard Worker #ifdef USE_SSH
265*6236dae4SAndroid Build Coastguard Worker Curl_ssh_version(ssh_version, sizeof(ssh_version));
266*6236dae4SAndroid Build Coastguard Worker src[i++] = ssh_version;
267*6236dae4SAndroid Build Coastguard Worker #endif
268*6236dae4SAndroid Build Coastguard Worker #ifdef USE_NGHTTP2
269*6236dae4SAndroid Build Coastguard Worker Curl_http2_ver(h2_version, sizeof(h2_version));
270*6236dae4SAndroid Build Coastguard Worker src[i++] = h2_version;
271*6236dae4SAndroid Build Coastguard Worker #endif
272*6236dae4SAndroid Build Coastguard Worker #ifdef USE_HTTP3
273*6236dae4SAndroid Build Coastguard Worker Curl_quic_ver(h3_version, sizeof(h3_version));
274*6236dae4SAndroid Build Coastguard Worker src[i++] = h3_version;
275*6236dae4SAndroid Build Coastguard Worker #endif
276*6236dae4SAndroid Build Coastguard Worker #ifdef USE_LIBRTMP
277*6236dae4SAndroid Build Coastguard Worker Curl_rtmp_version(rtmp_version, sizeof(rtmp_version));
278*6236dae4SAndroid Build Coastguard Worker src[i++] = rtmp_version;
279*6236dae4SAndroid Build Coastguard Worker #endif
280*6236dae4SAndroid Build Coastguard Worker #ifdef USE_HYPER
281*6236dae4SAndroid Build Coastguard Worker msnprintf(hyper_buf, sizeof(hyper_buf), "Hyper/%s", hyper_version());
282*6236dae4SAndroid Build Coastguard Worker src[i++] = hyper_buf;
283*6236dae4SAndroid Build Coastguard Worker #endif
284*6236dae4SAndroid Build Coastguard Worker #ifdef USE_GSASL
285*6236dae4SAndroid Build Coastguard Worker msnprintf(gsasl_buf, sizeof(gsasl_buf), "libgsasl/%s",
286*6236dae4SAndroid Build Coastguard Worker gsasl_check_version(NULL));
287*6236dae4SAndroid Build Coastguard Worker src[i++] = gsasl_buf;
288*6236dae4SAndroid Build Coastguard Worker #endif
289*6236dae4SAndroid Build Coastguard Worker #ifdef USE_OPENLDAP
290*6236dae4SAndroid Build Coastguard Worker oldap_version(ldap_buf, sizeof(ldap_buf));
291*6236dae4SAndroid Build Coastguard Worker src[i++] = ldap_buf;
292*6236dae4SAndroid Build Coastguard Worker #endif
293*6236dae4SAndroid Build Coastguard Worker
294*6236dae4SAndroid Build Coastguard Worker DEBUGASSERT(i <= VERSION_PARTS);
295*6236dae4SAndroid Build Coastguard Worker
296*6236dae4SAndroid Build Coastguard Worker outp = &out[0];
297*6236dae4SAndroid Build Coastguard Worker outlen = sizeof(out);
298*6236dae4SAndroid Build Coastguard Worker for(j = 0; j < i; j++) {
299*6236dae4SAndroid Build Coastguard Worker size_t n = strlen(src[j]);
300*6236dae4SAndroid Build Coastguard Worker /* we need room for a space, the string and the final zero */
301*6236dae4SAndroid Build Coastguard Worker if(outlen <= (n + 2))
302*6236dae4SAndroid Build Coastguard Worker break;
303*6236dae4SAndroid Build Coastguard Worker if(j) {
304*6236dae4SAndroid Build Coastguard Worker /* prepend a space if not the first */
305*6236dae4SAndroid Build Coastguard Worker *outp++ = ' ';
306*6236dae4SAndroid Build Coastguard Worker outlen--;
307*6236dae4SAndroid Build Coastguard Worker }
308*6236dae4SAndroid Build Coastguard Worker memcpy(outp, src[j], n);
309*6236dae4SAndroid Build Coastguard Worker outp += n;
310*6236dae4SAndroid Build Coastguard Worker outlen -= n;
311*6236dae4SAndroid Build Coastguard Worker }
312*6236dae4SAndroid Build Coastguard Worker *outp = 0;
313*6236dae4SAndroid Build Coastguard Worker
314*6236dae4SAndroid Build Coastguard Worker return out;
315*6236dae4SAndroid Build Coastguard Worker }
316*6236dae4SAndroid Build Coastguard Worker
317*6236dae4SAndroid Build Coastguard Worker /* data for curl_version_info
318*6236dae4SAndroid Build Coastguard Worker
319*6236dae4SAndroid Build Coastguard Worker Keep the list sorted alphabetically. It is also written so that each
320*6236dae4SAndroid Build Coastguard Worker protocol line has its own #if line to make things easier on the eye.
321*6236dae4SAndroid Build Coastguard Worker */
322*6236dae4SAndroid Build Coastguard Worker
323*6236dae4SAndroid Build Coastguard Worker static const char * const supported_protocols[] = {
324*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_DICT
325*6236dae4SAndroid Build Coastguard Worker "dict",
326*6236dae4SAndroid Build Coastguard Worker #endif
327*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_FILE
328*6236dae4SAndroid Build Coastguard Worker "file",
329*6236dae4SAndroid Build Coastguard Worker #endif
330*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_FTP
331*6236dae4SAndroid Build Coastguard Worker "ftp",
332*6236dae4SAndroid Build Coastguard Worker #endif
333*6236dae4SAndroid Build Coastguard Worker #if defined(USE_SSL) && !defined(CURL_DISABLE_FTP)
334*6236dae4SAndroid Build Coastguard Worker "ftps",
335*6236dae4SAndroid Build Coastguard Worker #endif
336*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_GOPHER
337*6236dae4SAndroid Build Coastguard Worker "gopher",
338*6236dae4SAndroid Build Coastguard Worker #endif
339*6236dae4SAndroid Build Coastguard Worker #if defined(USE_SSL) && !defined(CURL_DISABLE_GOPHER)
340*6236dae4SAndroid Build Coastguard Worker "gophers",
341*6236dae4SAndroid Build Coastguard Worker #endif
342*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_HTTP
343*6236dae4SAndroid Build Coastguard Worker "http",
344*6236dae4SAndroid Build Coastguard Worker #endif
345*6236dae4SAndroid Build Coastguard Worker #if defined(USE_SSL) && !defined(CURL_DISABLE_HTTP)
346*6236dae4SAndroid Build Coastguard Worker "https",
347*6236dae4SAndroid Build Coastguard Worker #endif
348*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_IMAP
349*6236dae4SAndroid Build Coastguard Worker "imap",
350*6236dae4SAndroid Build Coastguard Worker #endif
351*6236dae4SAndroid Build Coastguard Worker #if defined(USE_SSL) && !defined(CURL_DISABLE_IMAP)
352*6236dae4SAndroid Build Coastguard Worker "imaps",
353*6236dae4SAndroid Build Coastguard Worker #endif
354*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_LDAP
355*6236dae4SAndroid Build Coastguard Worker "ldap",
356*6236dae4SAndroid Build Coastguard Worker #if !defined(CURL_DISABLE_LDAPS) && \
357*6236dae4SAndroid Build Coastguard Worker ((defined(USE_OPENLDAP) && defined(USE_SSL)) || \
358*6236dae4SAndroid Build Coastguard Worker (!defined(USE_OPENLDAP) && defined(HAVE_LDAP_SSL)))
359*6236dae4SAndroid Build Coastguard Worker "ldaps",
360*6236dae4SAndroid Build Coastguard Worker #endif
361*6236dae4SAndroid Build Coastguard Worker #endif
362*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_MQTT
363*6236dae4SAndroid Build Coastguard Worker "mqtt",
364*6236dae4SAndroid Build Coastguard Worker #endif
365*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_POP3
366*6236dae4SAndroid Build Coastguard Worker "pop3",
367*6236dae4SAndroid Build Coastguard Worker #endif
368*6236dae4SAndroid Build Coastguard Worker #if defined(USE_SSL) && !defined(CURL_DISABLE_POP3)
369*6236dae4SAndroid Build Coastguard Worker "pop3s",
370*6236dae4SAndroid Build Coastguard Worker #endif
371*6236dae4SAndroid Build Coastguard Worker #ifdef USE_LIBRTMP
372*6236dae4SAndroid Build Coastguard Worker "rtmp",
373*6236dae4SAndroid Build Coastguard Worker "rtmpe",
374*6236dae4SAndroid Build Coastguard Worker "rtmps",
375*6236dae4SAndroid Build Coastguard Worker "rtmpt",
376*6236dae4SAndroid Build Coastguard Worker "rtmpte",
377*6236dae4SAndroid Build Coastguard Worker "rtmpts",
378*6236dae4SAndroid Build Coastguard Worker #endif
379*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_RTSP
380*6236dae4SAndroid Build Coastguard Worker "rtsp",
381*6236dae4SAndroid Build Coastguard Worker #endif
382*6236dae4SAndroid Build Coastguard Worker #if defined(USE_SSH) && !defined(USE_WOLFSSH)
383*6236dae4SAndroid Build Coastguard Worker "scp",
384*6236dae4SAndroid Build Coastguard Worker #endif
385*6236dae4SAndroid Build Coastguard Worker #ifdef USE_SSH
386*6236dae4SAndroid Build Coastguard Worker "sftp",
387*6236dae4SAndroid Build Coastguard Worker #endif
388*6236dae4SAndroid Build Coastguard Worker #if !defined(CURL_DISABLE_SMB) && defined(USE_CURL_NTLM_CORE)
389*6236dae4SAndroid Build Coastguard Worker "smb",
390*6236dae4SAndroid Build Coastguard Worker # ifdef USE_SSL
391*6236dae4SAndroid Build Coastguard Worker "smbs",
392*6236dae4SAndroid Build Coastguard Worker # endif
393*6236dae4SAndroid Build Coastguard Worker #endif
394*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_SMTP
395*6236dae4SAndroid Build Coastguard Worker "smtp",
396*6236dae4SAndroid Build Coastguard Worker #endif
397*6236dae4SAndroid Build Coastguard Worker #if defined(USE_SSL) && !defined(CURL_DISABLE_SMTP)
398*6236dae4SAndroid Build Coastguard Worker "smtps",
399*6236dae4SAndroid Build Coastguard Worker #endif
400*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_TELNET
401*6236dae4SAndroid Build Coastguard Worker "telnet",
402*6236dae4SAndroid Build Coastguard Worker #endif
403*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_TFTP
404*6236dae4SAndroid Build Coastguard Worker "tftp",
405*6236dae4SAndroid Build Coastguard Worker #endif
406*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_HTTP
407*6236dae4SAndroid Build Coastguard Worker /* WebSocket support relies on HTTP */
408*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_WEBSOCKETS
409*6236dae4SAndroid Build Coastguard Worker "ws",
410*6236dae4SAndroid Build Coastguard Worker #endif
411*6236dae4SAndroid Build Coastguard Worker #if defined(USE_SSL) && !defined(CURL_DISABLE_WEBSOCKETS)
412*6236dae4SAndroid Build Coastguard Worker "wss",
413*6236dae4SAndroid Build Coastguard Worker #endif
414*6236dae4SAndroid Build Coastguard Worker #endif
415*6236dae4SAndroid Build Coastguard Worker
416*6236dae4SAndroid Build Coastguard Worker NULL
417*6236dae4SAndroid Build Coastguard Worker };
418*6236dae4SAndroid Build Coastguard Worker
419*6236dae4SAndroid Build Coastguard Worker /*
420*6236dae4SAndroid Build Coastguard Worker * Feature presence runtime check functions.
421*6236dae4SAndroid Build Coastguard Worker *
422*6236dae4SAndroid Build Coastguard Worker * Warning: the value returned by these should not change between
423*6236dae4SAndroid Build Coastguard Worker * curl_global_init() and curl_global_cleanup() calls.
424*6236dae4SAndroid Build Coastguard Worker */
425*6236dae4SAndroid Build Coastguard Worker
426*6236dae4SAndroid Build Coastguard Worker #if defined(USE_LIBIDN2)
idn_present(curl_version_info_data * info)427*6236dae4SAndroid Build Coastguard Worker static int idn_present(curl_version_info_data *info)
428*6236dae4SAndroid Build Coastguard Worker {
429*6236dae4SAndroid Build Coastguard Worker return info->libidn != NULL;
430*6236dae4SAndroid Build Coastguard Worker }
431*6236dae4SAndroid Build Coastguard Worker #else
432*6236dae4SAndroid Build Coastguard Worker #define idn_present NULL
433*6236dae4SAndroid Build Coastguard Worker #endif
434*6236dae4SAndroid Build Coastguard Worker
435*6236dae4SAndroid Build Coastguard Worker #if defined(USE_SSL) && !defined(CURL_DISABLE_PROXY) && \
436*6236dae4SAndroid Build Coastguard Worker !defined(CURL_DISABLE_HTTP)
https_proxy_present(curl_version_info_data * info)437*6236dae4SAndroid Build Coastguard Worker static int https_proxy_present(curl_version_info_data *info)
438*6236dae4SAndroid Build Coastguard Worker {
439*6236dae4SAndroid Build Coastguard Worker (void) info;
440*6236dae4SAndroid Build Coastguard Worker return Curl_ssl_supports(NULL, SSLSUPP_HTTPS_PROXY);
441*6236dae4SAndroid Build Coastguard Worker }
442*6236dae4SAndroid Build Coastguard Worker #endif
443*6236dae4SAndroid Build Coastguard Worker
444*6236dae4SAndroid Build Coastguard Worker #if defined(USE_SSL) && defined(USE_ECH)
ech_present(curl_version_info_data * info)445*6236dae4SAndroid Build Coastguard Worker static int ech_present(curl_version_info_data *info)
446*6236dae4SAndroid Build Coastguard Worker {
447*6236dae4SAndroid Build Coastguard Worker (void) info;
448*6236dae4SAndroid Build Coastguard Worker return Curl_ssl_supports(NULL, SSLSUPP_ECH);
449*6236dae4SAndroid Build Coastguard Worker }
450*6236dae4SAndroid Build Coastguard Worker #endif
451*6236dae4SAndroid Build Coastguard Worker
452*6236dae4SAndroid Build Coastguard Worker /*
453*6236dae4SAndroid Build Coastguard Worker * Features table.
454*6236dae4SAndroid Build Coastguard Worker *
455*6236dae4SAndroid Build Coastguard Worker * Keep the features alphabetically sorted.
456*6236dae4SAndroid Build Coastguard Worker * Use FEATURE() macro to define an entry: this allows documentation check.
457*6236dae4SAndroid Build Coastguard Worker */
458*6236dae4SAndroid Build Coastguard Worker
459*6236dae4SAndroid Build Coastguard Worker #define FEATURE(name, present, bitmask) {(name), (present), (bitmask)}
460*6236dae4SAndroid Build Coastguard Worker
461*6236dae4SAndroid Build Coastguard Worker struct feat {
462*6236dae4SAndroid Build Coastguard Worker const char *name;
463*6236dae4SAndroid Build Coastguard Worker int (*present)(curl_version_info_data *info);
464*6236dae4SAndroid Build Coastguard Worker int bitmask;
465*6236dae4SAndroid Build Coastguard Worker };
466*6236dae4SAndroid Build Coastguard Worker
467*6236dae4SAndroid Build Coastguard Worker static const struct feat features_table[] = {
468*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_ALTSVC
469*6236dae4SAndroid Build Coastguard Worker FEATURE("alt-svc", NULL, CURL_VERSION_ALTSVC),
470*6236dae4SAndroid Build Coastguard Worker #endif
471*6236dae4SAndroid Build Coastguard Worker #ifdef CURLRES_ASYNCH
472*6236dae4SAndroid Build Coastguard Worker FEATURE("AsynchDNS", NULL, CURL_VERSION_ASYNCHDNS),
473*6236dae4SAndroid Build Coastguard Worker #endif
474*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_BROTLI
475*6236dae4SAndroid Build Coastguard Worker FEATURE("brotli", NULL, CURL_VERSION_BROTLI),
476*6236dae4SAndroid Build Coastguard Worker #endif
477*6236dae4SAndroid Build Coastguard Worker #ifdef DEBUGBUILD
478*6236dae4SAndroid Build Coastguard Worker FEATURE("Debug", NULL, CURL_VERSION_DEBUG),
479*6236dae4SAndroid Build Coastguard Worker #endif
480*6236dae4SAndroid Build Coastguard Worker #if defined(USE_SSL) && defined(USE_ECH)
481*6236dae4SAndroid Build Coastguard Worker FEATURE("ECH", ech_present, 0),
482*6236dae4SAndroid Build Coastguard Worker #endif
483*6236dae4SAndroid Build Coastguard Worker #ifdef USE_GSASL
484*6236dae4SAndroid Build Coastguard Worker FEATURE("gsasl", NULL, CURL_VERSION_GSASL),
485*6236dae4SAndroid Build Coastguard Worker #endif
486*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_GSSAPI
487*6236dae4SAndroid Build Coastguard Worker FEATURE("GSS-API", NULL, CURL_VERSION_GSSAPI),
488*6236dae4SAndroid Build Coastguard Worker #endif
489*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_HSTS
490*6236dae4SAndroid Build Coastguard Worker FEATURE("HSTS", NULL, CURL_VERSION_HSTS),
491*6236dae4SAndroid Build Coastguard Worker #endif
492*6236dae4SAndroid Build Coastguard Worker #if defined(USE_NGHTTP2)
493*6236dae4SAndroid Build Coastguard Worker FEATURE("HTTP2", NULL, CURL_VERSION_HTTP2),
494*6236dae4SAndroid Build Coastguard Worker #endif
495*6236dae4SAndroid Build Coastguard Worker #if defined(USE_HTTP3)
496*6236dae4SAndroid Build Coastguard Worker FEATURE("HTTP3", NULL, CURL_VERSION_HTTP3),
497*6236dae4SAndroid Build Coastguard Worker #endif
498*6236dae4SAndroid Build Coastguard Worker #if defined(USE_SSL) && !defined(CURL_DISABLE_PROXY) && \
499*6236dae4SAndroid Build Coastguard Worker !defined(CURL_DISABLE_HTTP)
500*6236dae4SAndroid Build Coastguard Worker FEATURE("HTTPS-proxy", https_proxy_present, CURL_VERSION_HTTPS_PROXY),
501*6236dae4SAndroid Build Coastguard Worker #endif
502*6236dae4SAndroid Build Coastguard Worker #if defined(USE_LIBIDN2) || defined(USE_WIN32_IDN) || defined(USE_APPLE_IDN)
503*6236dae4SAndroid Build Coastguard Worker FEATURE("IDN", idn_present, CURL_VERSION_IDN),
504*6236dae4SAndroid Build Coastguard Worker #endif
505*6236dae4SAndroid Build Coastguard Worker #ifdef USE_IPV6
506*6236dae4SAndroid Build Coastguard Worker FEATURE("IPv6", NULL, CURL_VERSION_IPV6),
507*6236dae4SAndroid Build Coastguard Worker #endif
508*6236dae4SAndroid Build Coastguard Worker #ifdef USE_KERBEROS5
509*6236dae4SAndroid Build Coastguard Worker FEATURE("Kerberos", NULL, CURL_VERSION_KERBEROS5),
510*6236dae4SAndroid Build Coastguard Worker #endif
511*6236dae4SAndroid Build Coastguard Worker #if (SIZEOF_CURL_OFF_T > 4) && \
512*6236dae4SAndroid Build Coastguard Worker ( (SIZEOF_OFF_T > 4) || defined(USE_WIN32_LARGE_FILES) )
513*6236dae4SAndroid Build Coastguard Worker FEATURE("Largefile", NULL, CURL_VERSION_LARGEFILE),
514*6236dae4SAndroid Build Coastguard Worker #endif
515*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_LIBZ
516*6236dae4SAndroid Build Coastguard Worker FEATURE("libz", NULL, CURL_VERSION_LIBZ),
517*6236dae4SAndroid Build Coastguard Worker #endif
518*6236dae4SAndroid Build Coastguard Worker #ifdef CURL_WITH_MULTI_SSL
519*6236dae4SAndroid Build Coastguard Worker FEATURE("MultiSSL", NULL, CURL_VERSION_MULTI_SSL),
520*6236dae4SAndroid Build Coastguard Worker #endif
521*6236dae4SAndroid Build Coastguard Worker #ifdef USE_NTLM
522*6236dae4SAndroid Build Coastguard Worker FEATURE("NTLM", NULL, CURL_VERSION_NTLM),
523*6236dae4SAndroid Build Coastguard Worker #endif
524*6236dae4SAndroid Build Coastguard Worker #if defined(USE_LIBPSL)
525*6236dae4SAndroid Build Coastguard Worker FEATURE("PSL", NULL, CURL_VERSION_PSL),
526*6236dae4SAndroid Build Coastguard Worker #endif
527*6236dae4SAndroid Build Coastguard Worker #ifdef USE_SPNEGO
528*6236dae4SAndroid Build Coastguard Worker FEATURE("SPNEGO", NULL, CURL_VERSION_SPNEGO),
529*6236dae4SAndroid Build Coastguard Worker #endif
530*6236dae4SAndroid Build Coastguard Worker #ifdef USE_SSL
531*6236dae4SAndroid Build Coastguard Worker FEATURE("SSL", NULL, CURL_VERSION_SSL),
532*6236dae4SAndroid Build Coastguard Worker #endif
533*6236dae4SAndroid Build Coastguard Worker #ifdef USE_WINDOWS_SSPI
534*6236dae4SAndroid Build Coastguard Worker FEATURE("SSPI", NULL, CURL_VERSION_SSPI),
535*6236dae4SAndroid Build Coastguard Worker #endif
536*6236dae4SAndroid Build Coastguard Worker #ifdef GLOBAL_INIT_IS_THREADSAFE
537*6236dae4SAndroid Build Coastguard Worker FEATURE("threadsafe", NULL, CURL_VERSION_THREADSAFE),
538*6236dae4SAndroid Build Coastguard Worker #endif
539*6236dae4SAndroid Build Coastguard Worker #ifdef USE_TLS_SRP
540*6236dae4SAndroid Build Coastguard Worker FEATURE("TLS-SRP", NULL, CURL_VERSION_TLSAUTH_SRP),
541*6236dae4SAndroid Build Coastguard Worker #endif
542*6236dae4SAndroid Build Coastguard Worker #ifdef CURLDEBUG
543*6236dae4SAndroid Build Coastguard Worker FEATURE("TrackMemory", NULL, CURL_VERSION_CURLDEBUG),
544*6236dae4SAndroid Build Coastguard Worker #endif
545*6236dae4SAndroid Build Coastguard Worker #if defined(_WIN32) && defined(UNICODE) && defined(_UNICODE)
546*6236dae4SAndroid Build Coastguard Worker FEATURE("Unicode", NULL, CURL_VERSION_UNICODE),
547*6236dae4SAndroid Build Coastguard Worker #endif
548*6236dae4SAndroid Build Coastguard Worker #ifdef USE_UNIX_SOCKETS
549*6236dae4SAndroid Build Coastguard Worker FEATURE("UnixSockets", NULL, CURL_VERSION_UNIX_SOCKETS),
550*6236dae4SAndroid Build Coastguard Worker #endif
551*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_ZSTD
552*6236dae4SAndroid Build Coastguard Worker FEATURE("zstd", NULL, CURL_VERSION_ZSTD),
553*6236dae4SAndroid Build Coastguard Worker #endif
554*6236dae4SAndroid Build Coastguard Worker {NULL, NULL, 0}
555*6236dae4SAndroid Build Coastguard Worker };
556*6236dae4SAndroid Build Coastguard Worker
557*6236dae4SAndroid Build Coastguard Worker static const char *feature_names[sizeof(features_table) /
558*6236dae4SAndroid Build Coastguard Worker sizeof(features_table[0])] = {NULL};
559*6236dae4SAndroid Build Coastguard Worker
560*6236dae4SAndroid Build Coastguard Worker
561*6236dae4SAndroid Build Coastguard Worker static curl_version_info_data version_info = {
562*6236dae4SAndroid Build Coastguard Worker CURLVERSION_NOW,
563*6236dae4SAndroid Build Coastguard Worker LIBCURL_VERSION,
564*6236dae4SAndroid Build Coastguard Worker LIBCURL_VERSION_NUM,
565*6236dae4SAndroid Build Coastguard Worker CURL_OS, /* as found by configure or set by hand at build-time */
566*6236dae4SAndroid Build Coastguard Worker 0, /* features bitmask is built at runtime */
567*6236dae4SAndroid Build Coastguard Worker NULL, /* ssl_version */
568*6236dae4SAndroid Build Coastguard Worker 0, /* ssl_version_num, this is kept at zero */
569*6236dae4SAndroid Build Coastguard Worker NULL, /* zlib_version */
570*6236dae4SAndroid Build Coastguard Worker supported_protocols,
571*6236dae4SAndroid Build Coastguard Worker NULL, /* c-ares version */
572*6236dae4SAndroid Build Coastguard Worker 0, /* c-ares version numerical */
573*6236dae4SAndroid Build Coastguard Worker NULL, /* libidn version */
574*6236dae4SAndroid Build Coastguard Worker 0, /* iconv version */
575*6236dae4SAndroid Build Coastguard Worker NULL, /* ssh lib version */
576*6236dae4SAndroid Build Coastguard Worker 0, /* brotli_ver_num */
577*6236dae4SAndroid Build Coastguard Worker NULL, /* brotli version */
578*6236dae4SAndroid Build Coastguard Worker 0, /* nghttp2 version number */
579*6236dae4SAndroid Build Coastguard Worker NULL, /* nghttp2 version string */
580*6236dae4SAndroid Build Coastguard Worker NULL, /* quic library string */
581*6236dae4SAndroid Build Coastguard Worker #ifdef CURL_CA_BUNDLE
582*6236dae4SAndroid Build Coastguard Worker CURL_CA_BUNDLE, /* cainfo */
583*6236dae4SAndroid Build Coastguard Worker #else
584*6236dae4SAndroid Build Coastguard Worker NULL,
585*6236dae4SAndroid Build Coastguard Worker #endif
586*6236dae4SAndroid Build Coastguard Worker #ifdef CURL_CA_PATH
587*6236dae4SAndroid Build Coastguard Worker CURL_CA_PATH, /* capath */
588*6236dae4SAndroid Build Coastguard Worker #else
589*6236dae4SAndroid Build Coastguard Worker NULL,
590*6236dae4SAndroid Build Coastguard Worker #endif
591*6236dae4SAndroid Build Coastguard Worker 0, /* zstd_ver_num */
592*6236dae4SAndroid Build Coastguard Worker NULL, /* zstd version */
593*6236dae4SAndroid Build Coastguard Worker NULL, /* Hyper version */
594*6236dae4SAndroid Build Coastguard Worker NULL, /* gsasl version */
595*6236dae4SAndroid Build Coastguard Worker feature_names,
596*6236dae4SAndroid Build Coastguard Worker NULL /* rtmp version */
597*6236dae4SAndroid Build Coastguard Worker };
598*6236dae4SAndroid Build Coastguard Worker
curl_version_info(CURLversion stamp)599*6236dae4SAndroid Build Coastguard Worker curl_version_info_data *curl_version_info(CURLversion stamp)
600*6236dae4SAndroid Build Coastguard Worker {
601*6236dae4SAndroid Build Coastguard Worker size_t n;
602*6236dae4SAndroid Build Coastguard Worker const struct feat *p;
603*6236dae4SAndroid Build Coastguard Worker int features = 0;
604*6236dae4SAndroid Build Coastguard Worker
605*6236dae4SAndroid Build Coastguard Worker #if defined(USE_SSH)
606*6236dae4SAndroid Build Coastguard Worker static char ssh_buf[80]; /* 'ssh_buffer' clashes with libssh/libssh.h */
607*6236dae4SAndroid Build Coastguard Worker #endif
608*6236dae4SAndroid Build Coastguard Worker #ifdef USE_SSL
609*6236dae4SAndroid Build Coastguard Worker #ifdef CURL_WITH_MULTI_SSL
610*6236dae4SAndroid Build Coastguard Worker static char ssl_buffer[200];
611*6236dae4SAndroid Build Coastguard Worker #else
612*6236dae4SAndroid Build Coastguard Worker static char ssl_buffer[80];
613*6236dae4SAndroid Build Coastguard Worker #endif
614*6236dae4SAndroid Build Coastguard Worker #endif
615*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_BROTLI
616*6236dae4SAndroid Build Coastguard Worker static char brotli_buffer[80];
617*6236dae4SAndroid Build Coastguard Worker #endif
618*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_ZSTD
619*6236dae4SAndroid Build Coastguard Worker static char zstd_buffer[80];
620*6236dae4SAndroid Build Coastguard Worker #endif
621*6236dae4SAndroid Build Coastguard Worker
622*6236dae4SAndroid Build Coastguard Worker (void)stamp; /* avoid compiler warnings, we do not use this */
623*6236dae4SAndroid Build Coastguard Worker
624*6236dae4SAndroid Build Coastguard Worker #ifdef USE_SSL
625*6236dae4SAndroid Build Coastguard Worker Curl_ssl_version(ssl_buffer, sizeof(ssl_buffer));
626*6236dae4SAndroid Build Coastguard Worker version_info.ssl_version = ssl_buffer;
627*6236dae4SAndroid Build Coastguard Worker #endif
628*6236dae4SAndroid Build Coastguard Worker
629*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_LIBZ
630*6236dae4SAndroid Build Coastguard Worker version_info.libz_version = zlibVersion();
631*6236dae4SAndroid Build Coastguard Worker /* libz left NULL if non-existing */
632*6236dae4SAndroid Build Coastguard Worker #endif
633*6236dae4SAndroid Build Coastguard Worker #ifdef USE_ARES
634*6236dae4SAndroid Build Coastguard Worker {
635*6236dae4SAndroid Build Coastguard Worker int aresnum;
636*6236dae4SAndroid Build Coastguard Worker version_info.ares = ares_version(&aresnum);
637*6236dae4SAndroid Build Coastguard Worker version_info.ares_num = aresnum;
638*6236dae4SAndroid Build Coastguard Worker }
639*6236dae4SAndroid Build Coastguard Worker #endif
640*6236dae4SAndroid Build Coastguard Worker #ifdef USE_LIBIDN2
641*6236dae4SAndroid Build Coastguard Worker /* This returns a version string if we use the given version or later,
642*6236dae4SAndroid Build Coastguard Worker otherwise it returns NULL */
643*6236dae4SAndroid Build Coastguard Worker version_info.libidn = idn2_check_version(IDN2_VERSION);
644*6236dae4SAndroid Build Coastguard Worker #endif
645*6236dae4SAndroid Build Coastguard Worker
646*6236dae4SAndroid Build Coastguard Worker #if defined(USE_SSH)
647*6236dae4SAndroid Build Coastguard Worker Curl_ssh_version(ssh_buf, sizeof(ssh_buf));
648*6236dae4SAndroid Build Coastguard Worker version_info.libssh_version = ssh_buf;
649*6236dae4SAndroid Build Coastguard Worker #endif
650*6236dae4SAndroid Build Coastguard Worker
651*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_BROTLI
652*6236dae4SAndroid Build Coastguard Worker version_info.brotli_ver_num = BrotliDecoderVersion();
653*6236dae4SAndroid Build Coastguard Worker brotli_version(brotli_buffer, sizeof(brotli_buffer));
654*6236dae4SAndroid Build Coastguard Worker version_info.brotli_version = brotli_buffer;
655*6236dae4SAndroid Build Coastguard Worker #endif
656*6236dae4SAndroid Build Coastguard Worker
657*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_ZSTD
658*6236dae4SAndroid Build Coastguard Worker version_info.zstd_ver_num = (unsigned int)ZSTD_versionNumber();
659*6236dae4SAndroid Build Coastguard Worker zstd_version(zstd_buffer, sizeof(zstd_buffer));
660*6236dae4SAndroid Build Coastguard Worker version_info.zstd_version = zstd_buffer;
661*6236dae4SAndroid Build Coastguard Worker #endif
662*6236dae4SAndroid Build Coastguard Worker
663*6236dae4SAndroid Build Coastguard Worker #ifdef USE_NGHTTP2
664*6236dae4SAndroid Build Coastguard Worker {
665*6236dae4SAndroid Build Coastguard Worker nghttp2_info *h2 = nghttp2_version(0);
666*6236dae4SAndroid Build Coastguard Worker version_info.nghttp2_ver_num = (unsigned int)h2->version_num;
667*6236dae4SAndroid Build Coastguard Worker version_info.nghttp2_version = h2->version_str;
668*6236dae4SAndroid Build Coastguard Worker }
669*6236dae4SAndroid Build Coastguard Worker #endif
670*6236dae4SAndroid Build Coastguard Worker
671*6236dae4SAndroid Build Coastguard Worker #ifdef USE_HTTP3
672*6236dae4SAndroid Build Coastguard Worker {
673*6236dae4SAndroid Build Coastguard Worker static char quicbuffer[80];
674*6236dae4SAndroid Build Coastguard Worker Curl_quic_ver(quicbuffer, sizeof(quicbuffer));
675*6236dae4SAndroid Build Coastguard Worker version_info.quic_version = quicbuffer;
676*6236dae4SAndroid Build Coastguard Worker }
677*6236dae4SAndroid Build Coastguard Worker #endif
678*6236dae4SAndroid Build Coastguard Worker
679*6236dae4SAndroid Build Coastguard Worker #ifdef USE_HYPER
680*6236dae4SAndroid Build Coastguard Worker {
681*6236dae4SAndroid Build Coastguard Worker static char hyper_buffer[30];
682*6236dae4SAndroid Build Coastguard Worker msnprintf(hyper_buffer, sizeof(hyper_buffer), "Hyper/%s", hyper_version());
683*6236dae4SAndroid Build Coastguard Worker version_info.hyper_version = hyper_buffer;
684*6236dae4SAndroid Build Coastguard Worker }
685*6236dae4SAndroid Build Coastguard Worker #endif
686*6236dae4SAndroid Build Coastguard Worker
687*6236dae4SAndroid Build Coastguard Worker #ifdef USE_GSASL
688*6236dae4SAndroid Build Coastguard Worker {
689*6236dae4SAndroid Build Coastguard Worker version_info.gsasl_version = gsasl_check_version(NULL);
690*6236dae4SAndroid Build Coastguard Worker }
691*6236dae4SAndroid Build Coastguard Worker #endif
692*6236dae4SAndroid Build Coastguard Worker
693*6236dae4SAndroid Build Coastguard Worker /* Get available features, build bitmask and names array. */
694*6236dae4SAndroid Build Coastguard Worker n = 0;
695*6236dae4SAndroid Build Coastguard Worker for(p = features_table; p->name; p++)
696*6236dae4SAndroid Build Coastguard Worker if(!p->present || p->present(&version_info)) {
697*6236dae4SAndroid Build Coastguard Worker features |= p->bitmask;
698*6236dae4SAndroid Build Coastguard Worker feature_names[n++] = p->name;
699*6236dae4SAndroid Build Coastguard Worker }
700*6236dae4SAndroid Build Coastguard Worker
701*6236dae4SAndroid Build Coastguard Worker feature_names[n] = NULL; /* Terminate array. */
702*6236dae4SAndroid Build Coastguard Worker version_info.features = features;
703*6236dae4SAndroid Build Coastguard Worker
704*6236dae4SAndroid Build Coastguard Worker #ifdef USE_LIBRTMP
705*6236dae4SAndroid Build Coastguard Worker {
706*6236dae4SAndroid Build Coastguard Worker static char rtmp_version[30];
707*6236dae4SAndroid Build Coastguard Worker Curl_rtmp_version(rtmp_version, sizeof(rtmp_version));
708*6236dae4SAndroid Build Coastguard Worker version_info.rtmp_version = rtmp_version;
709*6236dae4SAndroid Build Coastguard Worker }
710*6236dae4SAndroid Build Coastguard Worker #endif
711*6236dae4SAndroid Build Coastguard Worker
712*6236dae4SAndroid Build Coastguard Worker return &version_info;
713*6236dae4SAndroid Build Coastguard Worker }
714