xref: /aosp_15_r20/external/curl/lib/version.c (revision 6236dae45794135f37c4eb022389c904c8b0090d)
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