| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193 |
- #ifndef HEADER_CURL_SETUP_H
- #define HEADER_CURL_SETUP_H
- /***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) Daniel Stenberg, <[email protected]>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at https://curl.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- * SPDX-License-Identifier: curl
- *
- ***************************************************************************/
- #if defined(BUILDING_LIBCURL) && !defined(CURL_NO_OLDIES)
- #define CURL_NO_OLDIES
- #endif
- /* Set default _WIN32_WINNT */
- #ifdef __MINGW32__
- #include <_mingw.h>
- #endif
- /* Workaround for Homebrew gcc 12.4.0, 13.3.0, 14.1.0, 14.2.0 (initial build)
- that started advertising the `availability` attribute, which then gets used
- by Apple SDK, but, in a way incompatible with gcc, resulting in misc errors
- inside SDK headers, e.g.:
- error: attributes should be specified before the declarator in a function
- definition
- error: expected ',' or '}' before
- Followed by missing declarations.
- Work it around by overriding the built-in feature-check macro used by the
- headers to enable the problematic attributes. This makes the feature check
- fail. Fixed in 14.2.0_1. Disable the workaround if the fix is detected. */
- #if defined(__APPLE__) && !defined(__clang__) && defined(__GNUC__) && \
- defined(__has_attribute)
- # if !defined(__has_feature)
- # define availability curl_pp_attribute_disabled
- # elif !__has_feature(attribute_availability)
- # define availability curl_pp_attribute_disabled
- # endif
- #endif
- #ifdef __APPLE__
- #include <sys/types.h>
- #include <TargetConditionals.h>
- /* Fixup faulty target macro initialization in macOS SDK since v14.4 (as of
- 15.0 beta). The SDK target detection in `TargetConditionals.h` correctly
- detects macOS, but fails to set the macro's old name `TARGET_OS_OSX`, then
- continues to set it to a default value of 0. Other parts of the SDK still
- rely on the old name, and with this inconsistency our builds fail due to
- missing declarations. It happens when using mainline llvm older than v18.
- Later versions fixed it by predefining these target macros, avoiding the
- faulty dynamic detection. gcc is not affected (for now) because it lacks
- the necessary dynamic detection features, so the SDK falls back to
- a codepath that sets both the old and new macro to 1. */
- #if defined(TARGET_OS_MAC) && TARGET_OS_MAC && \
- defined(TARGET_OS_OSX) && !TARGET_OS_OSX && \
- (!defined(TARGET_OS_IPHONE) || !TARGET_OS_IPHONE) && \
- (!defined(TARGET_OS_SIMULATOR) || !TARGET_OS_SIMULATOR)
- #undef TARGET_OS_OSX
- #define TARGET_OS_OSX TARGET_OS_MAC
- #endif
- #endif
- #if defined(__MINGW32__) && !defined(__MINGW32CE__) && \
- (!defined(__MINGW64_VERSION_MAJOR) || (__MINGW64_VERSION_MAJOR < 3))
- #error "Building curl requires mingw-w64 3.0 or later"
- #endif
- /* Visual Studio 2008 is the minimum Visual Studio version we support.
- Workarounds for older versions of Visual Studio have been removed. */
- #if defined(_MSC_VER) && (_MSC_VER < 1500)
- #error "Ancient versions of Visual Studio are no longer supported due to bugs."
- #endif
- #ifdef _MSC_VER
- /* Disable Visual Studio warnings: 4127 "conditional expression is constant" */
- #pragma warning(disable:4127)
- /* Avoid VS2005 and upper complaining about portable C functions. */
- #ifndef _CRT_NONSTDC_NO_DEPRECATE
- #define _CRT_NONSTDC_NO_DEPRECATE /* for strdup(), write(), etc. */
- #endif
- #ifndef _CRT_SECURE_NO_DEPRECATE
- #define _CRT_SECURE_NO_DEPRECATE /* for fopen(), getenv(), etc. */
- #endif
- #endif /* _MSC_VER */
- #ifdef _WIN32
- /*
- * Do not include unneeded stuff in Windows headers to avoid compiler
- * warnings and macro clashes.
- * Make sure to define this macro before including any Windows headers.
- */
- # ifndef WIN32_LEAN_AND_MEAN
- # define WIN32_LEAN_AND_MEAN
- # endif
- # ifndef NOGDI
- # define NOGDI
- # endif
- /* Detect Windows App environment which has a restricted access
- * to the Win32 APIs. */
- # if (defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0602)) || \
- defined(WINAPI_FAMILY)
- # include <winapifamily.h>
- # if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && \
- !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
- # define CURL_WINDOWS_UWP
- # endif
- # endif
- #endif
- /* Avoid bogus format check warnings with mingw32ce gcc 4.4.0 in
- C99 (-std=gnu99) mode */
- #if defined(__MINGW32CE__) && !defined(CURL_NO_FMT_CHECKS) && \
- (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) && \
- (defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 4))
- #define CURL_NO_FMT_CHECKS
- #endif
- /* Compatibility */
- #ifdef ENABLE_IPV6
- #define USE_IPV6 1
- #endif
- /*
- * Include configuration script results or hand-crafted
- * configuration file for platforms which lack config tool.
- */
- #ifdef HAVE_CONFIG_H
- #include "curl_config.h"
- #else /* HAVE_CONFIG_H */
- #ifdef _WIN32
- # include "config-win32.h"
- #endif
- #ifdef macintosh
- # include "config-mac.h"
- #endif
- #ifdef __riscos__
- # include "config-riscos.h"
- #endif
- #ifdef __OS400__
- # include "config-os400.h"
- #endif
- #ifdef __PLAN9__
- # include "config-plan9.h"
- #endif
- #endif /* HAVE_CONFIG_H */
- /* ================================================================ */
- /* Definition of preprocessor macros/symbols which modify compiler */
- /* behavior or generated code characteristics must be done here, */
- /* as appropriate, before any system header file is included. It is */
- /* also possible to have them defined in the config file included */
- /* before this point. As a result of all this we frown inclusion of */
- /* system header files in our config files, avoid this at any cost. */
- /* ================================================================ */
- #ifdef HAVE_LIBZ
- # ifndef ZLIB_CONST
- # define ZLIB_CONST /* Use z_const. Supported by v1.2.5.2 and upper. */
- # endif
- #endif
- /*
- * AIX 4.3 and newer needs _THREAD_SAFE defined to build
- * proper reentrant code. Others may also need it.
- */
- #ifdef NEED_THREAD_SAFE
- # ifndef _THREAD_SAFE
- # define _THREAD_SAFE
- # endif
- #endif
- /*
- * Tru64 needs _REENTRANT set for a few function prototypes and
- * things to appear in the system header files. Unixware needs it
- * to build proper reentrant code. Others may also need it.
- */
- #ifdef NEED_REENTRANT
- # ifndef _REENTRANT
- # define _REENTRANT
- # endif
- #endif
- /* Solaris needs this to get a POSIX-conformant getpwuid_r */
- #if defined(sun) || defined(__sun)
- # ifndef _POSIX_PTHREAD_SEMANTICS
- # define _POSIX_PTHREAD_SEMANTICS 1
- # endif
- #endif
- /* ================================================================ */
- /* If you need to include a system header file for your platform, */
- /* please, do it beyond the point further indicated in this file. */
- /* ================================================================ */
- /* Give calloc a chance to be dragging in early, so we do not redefine */
- #if defined(USE_THREADS_POSIX) && defined(HAVE_PTHREAD_H)
- # include <pthread.h>
- #endif
- /*
- * Disable other protocols when http is the only one desired.
- */
- #ifdef HTTP_ONLY
- # ifndef CURL_DISABLE_DICT
- # define CURL_DISABLE_DICT
- # endif
- # ifndef CURL_DISABLE_FILE
- # define CURL_DISABLE_FILE
- # endif
- # ifndef CURL_DISABLE_FTP
- # define CURL_DISABLE_FTP
- # endif
- # ifndef CURL_DISABLE_GOPHER
- # define CURL_DISABLE_GOPHER
- # endif
- # ifndef CURL_DISABLE_IMAP
- # define CURL_DISABLE_IMAP
- # endif
- # ifndef CURL_DISABLE_LDAP
- # define CURL_DISABLE_LDAP
- # endif
- # ifndef CURL_DISABLE_LDAPS
- # define CURL_DISABLE_LDAPS
- # endif
- # ifndef CURL_DISABLE_MQTT
- # define CURL_DISABLE_MQTT
- # endif
- # ifndef CURL_DISABLE_POP3
- # define CURL_DISABLE_POP3
- # endif
- # ifndef CURL_DISABLE_RTSP
- # define CURL_DISABLE_RTSP
- # endif
- # ifndef CURL_DISABLE_SMB
- # define CURL_DISABLE_SMB
- # endif
- # ifndef CURL_DISABLE_SMTP
- # define CURL_DISABLE_SMTP
- # endif
- # ifndef CURL_DISABLE_TELNET
- # define CURL_DISABLE_TELNET
- # endif
- # ifndef CURL_DISABLE_TFTP
- # define CURL_DISABLE_TFTP
- # endif
- #endif
- /*
- * When http is disabled rtsp is not supported.
- */
- #if defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_RTSP)
- # define CURL_DISABLE_RTSP
- #endif
- /*
- * When HTTP is disabled, disable HTTP-only features
- */
- #ifdef CURL_DISABLE_HTTP
- # define CURL_DISABLE_ALTSVC 1
- # define CURL_DISABLE_COOKIES 1
- # define CURL_DISABLE_BASIC_AUTH 1
- # define CURL_DISABLE_BEARER_AUTH 1
- # define CURL_DISABLE_AWS 1
- # define CURL_DISABLE_DOH 1
- # define CURL_DISABLE_FORM_API 1
- # define CURL_DISABLE_HEADERS_API 1
- # define CURL_DISABLE_HSTS 1
- # define CURL_DISABLE_HTTP_AUTH 1
- #endif
- /* ================================================================ */
- /* No system header file shall be included in this file before this */
- /* point. */
- /* ================================================================ */
- /*
- * OS/400 setup file includes some system headers.
- */
- #ifdef __OS400__
- # include "setup-os400.h"
- #endif
- /*
- * VMS setup file includes some system headers.
- */
- #ifdef __VMS
- # include "setup-vms.h"
- #endif
- /*
- * Windows setup file includes some system headers.
- */
- #ifdef _WIN32
- # include "setup-win32.h"
- #endif
- #include <curl/system.h>
- /* Helper macro to expand and concatenate two macros.
- * Direct macros concatenation does not work because macros
- * are not expanded before direct concatenation.
- */
- #define CURL_CONC_MACROS_(A,B) A ## B
- #define CURL_CONC_MACROS(A,B) CURL_CONC_MACROS_(A,B)
- /* curl uses its own printf() function internally. It understands the GNU
- * format. Use this format, so that it matches the GNU format attribute we
- * use with the MinGW compiler, allowing it to verify them at compile-time.
- */
- #ifdef __MINGW32__
- # undef CURL_FORMAT_CURL_OFF_T
- # undef CURL_FORMAT_CURL_OFF_TU
- # define CURL_FORMAT_CURL_OFF_T "lld"
- # define CURL_FORMAT_CURL_OFF_TU "llu"
- #endif
- /* based on logic in "curl/mprintf.h" */
- #if (defined(__GNUC__) || defined(__clang__) || \
- defined(__IAR_SYSTEMS_ICC__)) && \
- defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
- !defined(CURL_NO_FMT_CHECKS)
- #if defined(__MINGW32__) && !defined(__clang__)
- #define CURL_PRINTF(fmt, arg) \
- __attribute__((format(gnu_printf, fmt, arg)))
- #else
- #define CURL_PRINTF(fmt, arg) \
- __attribute__((format(__printf__, fmt, arg)))
- #endif
- #else
- #define CURL_PRINTF(fmt, arg)
- #endif
- /* Override default printf mask check rules in "curl/mprintf.h" */
- #define CURL_TEMP_PRINTF CURL_PRINTF
- /* Workaround for mainline llvm v16 and earlier missing a built-in macro
- expected by macOS SDK v14 / Xcode v15 (2023) and newer.
- gcc (as of v14) is also missing it. */
- #if defined(__APPLE__) && \
- ((!defined(__apple_build_version__) && \
- defined(__clang__) && __clang_major__ < 17) || \
- (defined(__GNUC__) && __GNUC__ <= 14)) && \
- defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && \
- !defined(__ENVIRONMENT_OS_VERSION_MIN_REQUIRED__)
- #define __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__ \
- __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
- #endif
- /*
- * Use getaddrinfo to resolve the IPv4 address literal. If the current network
- * interface does not support IPv4, but supports IPv6, NAT64, and DNS64,
- * performing this task will result in a synthesized IPv6 address.
- */
- #if defined(__APPLE__) && !defined(USE_ARES)
- # define USE_RESOLVE_ON_IPS 1
- # if TARGET_OS_MAC && !(defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) && \
- defined(USE_IPV6)
- # define CURL_MACOS_CALL_COPYPROXIES 1
- # endif
- #endif
- #ifdef USE_ARES
- # ifndef CARES_NO_DEPRECATED
- # define CARES_NO_DEPRECATED /* for ares_getsock() */
- # endif
- # if defined(CURL_STATICLIB) && !defined(CARES_STATICLIB) && defined(_WIN32)
- # define CARES_STATICLIB /* define it before including ares.h */
- # endif
- #endif
- #ifdef USE_LWIPSOCK
- # include <lwip/init.h>
- # include <lwip/sockets.h>
- # include <lwip/netdb.h>
- #endif
- #ifdef macintosh
- # include <extra/stricmp.h>
- # include <extra/strdup.h>
- #endif
- #ifdef __AMIGA__
- # ifdef __amigaos4__
- # define __USE_INLINE__
- /* use our own resolver which uses runtime feature detection */
- # define CURLRES_AMIGA
- /* getaddrinfo() currently crashes bsdsocket.library, so disable */
- # undef HAVE_GETADDRINFO
- # if !(defined(__NEWLIB__) || \
- (defined(__CLIB2__) && defined(__THREAD_SAFE)))
- /* disable threaded resolver with clib2 - requires newlib or clib-ts */
- # undef USE_THREADS_POSIX
- # endif
- # endif
- # include <exec/types.h>
- # include <exec/execbase.h>
- # include <proto/exec.h>
- # include <proto/dos.h>
- # include <unistd.h>
- # if defined(HAVE_PROTO_BSDSOCKET_H) && \
- (!defined(__amigaos4__) || defined(USE_AMISSL))
- /* use bsdsocket.library directly, instead of libc networking functions */
- # define _SYS_MBUF_H /* m_len define clashes with curl */
- # include <proto/bsdsocket.h>
- # ifdef __amigaos4__
- int Curl_amiga_select(int nfds, fd_set *readfds, fd_set *writefds,
- fd_set *errorfds, struct timeval *timeout);
- # define select(a,b,c,d,e) Curl_amiga_select(a,b,c,d,e)
- # else
- # define select(a,b,c,d,e) WaitSelect(a,b,c,d,e,0)
- # endif
- /* must not use libc's fcntl() on bsdsocket.library sockfds! */
- # undef HAVE_FCNTL
- # undef HAVE_FCNTL_O_NONBLOCK
- # else
- /* use libc networking and hence close() and fnctl() */
- # undef HAVE_CLOSESOCKET_CAMEL
- # undef HAVE_IOCTLSOCKET_CAMEL
- # endif
- /*
- * In clib2 arpa/inet.h warns that some prototypes may clash
- * with bsdsocket.library. This avoids the definition of those.
- */
- # define __NO_NET_API
- #endif
- /* Whether to use eventfd() */
- #if defined(HAVE_EVENTFD) && defined(HAVE_SYS_EVENTFD_H)
- #define USE_EVENTFD
- #endif
- #include <stdio.h>
- #include <assert.h>
- #ifdef __TANDEM /* for ns*-tandem-nsk systems */
- # if ! defined __LP64
- # include <floss.h> /* FLOSS is only used for 32-bit builds. */
- # endif
- #endif
- #ifndef STDC_HEADERS /* no standard C headers! */
- #include <curl/stdcheaders.h>
- #endif
- #if defined(HAVE_STDINT_H) || defined(USE_WOLFSSL)
- #include <stdint.h>
- #endif
- #include <limits.h>
- #ifdef _WIN32
- # ifdef HAVE_IO_H
- # include <io.h>
- # endif
- # include <sys/types.h>
- # include <sys/stat.h>
- # ifdef USE_WIN32_LARGE_FILES
- /* Large file (>2Gb) support using Win32 functions. */
- # undef lseek
- # define lseek(fdes, offset, whence) _lseeki64(fdes, offset, whence)
- # undef fstat
- # define fstat(fdes,stp) _fstati64(fdes, stp)
- # undef stat
- # define struct_stat struct _stati64
- # define LSEEK_ERROR (__int64)-1
- # else
- /* Small file (<2Gb) support using Win32 functions. */
- # ifndef UNDER_CE
- # undef lseek
- # define lseek(fdes, offset, whence) _lseek(fdes, (long)offset, whence)
- # define fstat(fdes, stp) _fstat(fdes, stp)
- # define struct_stat struct _stat
- # endif
- # define LSEEK_ERROR (long)-1
- # endif
- # ifndef UNDER_CE
- int curlx_win32_stat(const char *path, struct_stat *buffer);
- int curlx_win32_open(const char *filename, int oflag, ...);
- FILE *curlx_win32_fopen(const char *filename, const char *mode);
- # define stat(fname, stp) curlx_win32_stat(fname, stp)
- # define open curlx_win32_open
- # define CURL_FOPEN(fname, mode) curlx_win32_fopen(fname, mode)
- # define fopen(fname, mode) CURL_FOPEN(fname, mode)
- # endif
- #elif defined(__DJGPP__)
- /* Requires DJGPP 2.04 */
- # include <unistd.h>
- # undef lseek
- # define lseek(fdes,offset,whence) llseek(fdes, offset, whence)
- # define LSEEK_ERROR (offset_t)-1
- #endif
- #ifndef struct_stat
- #define struct_stat struct stat
- #endif
- #ifndef LSEEK_ERROR
- #define LSEEK_ERROR (off_t)-1
- #endif
- #ifndef SIZEOF_TIME_T
- /* assume default size of time_t to be 32 bits */
- #define SIZEOF_TIME_T 4
- #endif
- #ifndef SIZEOF_CURL_SOCKET_T
- /* configure and cmake check and set the define */
- # ifdef _WIN64
- # define SIZEOF_CURL_SOCKET_T 8
- # else
- /* default guess */
- # define SIZEOF_CURL_SOCKET_T 4
- # endif
- #endif
- #if SIZEOF_CURL_SOCKET_T < 8
- # define FMT_SOCKET_T "d"
- #elif defined(__MINGW32__)
- # define FMT_SOCKET_T "zd"
- #else
- # define FMT_SOCKET_T "qd"
- #endif
- /*
- * Default sizeof(off_t) in case it has not been defined in config file.
- */
- #ifndef SIZEOF_OFF_T
- # if defined(__VMS) && !defined(__VAX)
- # ifdef _LARGEFILE
- # define SIZEOF_OFF_T 8
- # endif
- # elif defined(__OS400__) && defined(__ILEC400__)
- # ifdef _LARGE_FILES
- # define SIZEOF_OFF_T 8
- # endif
- # elif defined(__MVS__) && defined(__IBMC__)
- # if defined(_LP64) || defined(_LARGE_FILES)
- # define SIZEOF_OFF_T 8
- # endif
- # elif defined(__370__) && defined(__IBMC__)
- # if defined(_LP64) || defined(_LARGE_FILES)
- # define SIZEOF_OFF_T 8
- # endif
- # endif
- # ifndef SIZEOF_OFF_T
- # define SIZEOF_OFF_T 4
- # endif
- #endif
- #if (SIZEOF_CURL_OFF_T < 8)
- #error "too small curl_off_t"
- #else
- /* assume SIZEOF_CURL_OFF_T == 8 */
- # define CURL_OFF_T_MAX 0x7FFFFFFFFFFFFFFF
- #endif
- #define CURL_OFF_T_MIN (-CURL_OFF_T_MAX - 1)
- #if (SIZEOF_CURL_OFF_T != 8)
- # error "curl_off_t must be exactly 64 bits"
- #else
- typedef unsigned CURL_TYPEOF_CURL_OFF_T curl_uint64_t;
- typedef CURL_TYPEOF_CURL_OFF_T curl_int64_t;
- # ifndef CURL_SUFFIX_CURL_OFF_TU
- # error "CURL_SUFFIX_CURL_OFF_TU must be defined"
- # endif
- # define CURL_UINT64_SUFFIX CURL_SUFFIX_CURL_OFF_TU
- # define CURL_UINT64_C(val) CURL_CONC_MACROS(val,CURL_UINT64_SUFFIX)
- # define FMT_PRId64 CURL_FORMAT_CURL_OFF_T
- # define FMT_PRIu64 CURL_FORMAT_CURL_OFF_TU
- #endif
- #define FMT_OFF_T CURL_FORMAT_CURL_OFF_T
- #define FMT_OFF_TU CURL_FORMAT_CURL_OFF_TU
- #if (SIZEOF_TIME_T == 4)
- # ifdef HAVE_TIME_T_UNSIGNED
- # define TIME_T_MAX UINT_MAX
- # define TIME_T_MIN 0
- # else
- # define TIME_T_MAX INT_MAX
- # define TIME_T_MIN INT_MIN
- # endif
- #else
- # ifdef HAVE_TIME_T_UNSIGNED
- # define TIME_T_MAX 0xFFFFFFFFFFFFFFFF
- # define TIME_T_MIN 0
- # else
- # define TIME_T_MAX 0x7FFFFFFFFFFFFFFF
- # define TIME_T_MIN (-TIME_T_MAX - 1)
- # endif
- #endif
- #ifndef SIZE_MAX
- /* some limits.h headers have this defined, some do not */
- #if defined(SIZEOF_SIZE_T) && (SIZEOF_SIZE_T > 4)
- #define SIZE_MAX 18446744073709551615U
- #else
- #define SIZE_MAX 4294967295U
- #endif
- #endif
- #ifndef SSIZE_MAX
- /* some limits.h headers have this defined, some do not */
- #if defined(SIZEOF_SIZE_T) && (SIZEOF_SIZE_T > 4)
- #define SSIZE_MAX 9223372036854775807
- #else
- #define SSIZE_MAX 2147483647
- #endif
- #endif
- /*
- * Arg 2 type for gethostname in case it has not been defined in config file.
- */
- #ifndef GETHOSTNAME_TYPE_ARG2
- # ifdef USE_WINSOCK
- # define GETHOSTNAME_TYPE_ARG2 int
- # else
- # define GETHOSTNAME_TYPE_ARG2 size_t
- # endif
- #endif
- /* Below we define some functions. They should
- 4. set the SIGALRM signal timeout
- 5. set dir/file naming defines
- */
- #ifdef _WIN32
- # define DIR_CHAR "\\"
- #else /* _WIN32 */
- # ifdef MSDOS /* Watt-32 */
- # include <sys/ioctl.h>
- # define select(n,r,w,x,t) select_s(n,r,w,x,t)
- # define ioctl(x,y,z) ioctlsocket(x,y,(char *)(z))
- # include <tcp.h>
- # undef word
- # undef byte
- # endif /* MSDOS */
- # ifdef __minix
- /* Minix 3 versions up to at least 3.1.3 are missing these prototypes */
- extern struct tm *gmtime_r(const time_t * const timep, struct tm *tmp);
- # endif
- # define DIR_CHAR "/"
- #endif /* _WIN32 */
- /* ---------------------------------------------------------------- */
- /* resolver specialty compile-time defines */
- /* CURLRES_* defines to use in the host*.c sources */
- /* ---------------------------------------------------------------- */
- /*
- * Mutually exclusive CURLRES_* definitions.
- */
- #if defined(USE_IPV6) && defined(HAVE_GETADDRINFO)
- # define CURLRES_IPV6
- #elif defined(USE_IPV6) && (defined(_WIN32) || defined(__CYGWIN__))
- /* assume on Windows that IPv6 without getaddrinfo is a broken build */
- # error "Unexpected build: IPv6 is enabled but getaddrinfo was not found."
- #else
- # define CURLRES_IPV4
- #endif
- #if defined(USE_THREADS_POSIX) || defined(USE_THREADS_WIN32)
- # define CURLRES_ASYNCH
- # define CURLRES_THREADED
- #elif defined(USE_ARES)
- # define CURLRES_ASYNCH
- # define CURLRES_ARES
- /* now undef the stock libc functions just to avoid them being used */
- # undef HAVE_GETADDRINFO
- # undef HAVE_FREEADDRINFO
- #else
- # define CURLRES_SYNCH
- #endif
- /* ---------------------------------------------------------------- */
- #if defined(HAVE_LIBIDN2) && defined(HAVE_IDN2_H) && \
- !defined(USE_WIN32_IDN) && !defined(USE_APPLE_IDN)
- /* The lib and header are present */
- #define USE_LIBIDN2
- #endif
- #if defined(USE_LIBIDN2) && (defined(USE_WIN32_IDN) || defined(USE_APPLE_IDN))
- #error "libidn2 cannot be enabled with WinIDN or AppleIDN, choose one."
- #endif
- #if defined(USE_GNUTLS) || defined(USE_OPENSSL) || defined(USE_MBEDTLS) || \
- defined(USE_WOLFSSL) || defined(USE_SCHANNEL) || \
- defined(USE_RUSTLS)
- #define USE_SSL /* SSL support has been enabled */
- #endif
- #if defined(USE_OPENSSL) && defined(USE_WOLFSSL)
- # include <wolfssl/version.h>
- # if LIBWOLFSSL_VERSION_HEX >= 0x05007006
- # ifndef OPENSSL_COEXIST
- # define OPENSSL_COEXIST
- # endif
- # else
- # error "OpenSSL can only coexist with wolfSSL v5.7.6 or upper"
- # endif
- #endif
- #if defined(USE_WOLFSSL) && defined(USE_GNUTLS)
- /* Avoid defining unprefixed wolfSSL SHA macros colliding with nettle ones */
- #define NO_OLD_WC_NAMES
- #endif
- /* Single point where USE_SPNEGO definition might be defined */
- #if !defined(CURL_DISABLE_NEGOTIATE_AUTH) && \
- (defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI))
- #define USE_SPNEGO
- #endif
- /* Single point where USE_KERBEROS5 definition might be defined */
- #if !defined(CURL_DISABLE_KERBEROS_AUTH) && \
- (defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI))
- #define USE_KERBEROS5
- #endif
- /* Single point where USE_NTLM definition might be defined */
- #ifndef CURL_DISABLE_NTLM
- # if defined(USE_OPENSSL) || defined(USE_MBEDTLS) || \
- defined(USE_GNUTLS) || \
- defined(USE_OS400CRYPTO) || defined(USE_WIN32_CRYPTO) || \
- (defined(USE_WOLFSSL) && defined(HAVE_WOLFSSL_DES_ECB_ENCRYPT))
- # define USE_CURL_NTLM_CORE
- # endif
- # if defined(USE_CURL_NTLM_CORE) || defined(USE_WINDOWS_SSPI)
- # define USE_NTLM
- # endif
- #endif
- #if defined(USE_LIBSSH2) || defined(USE_LIBSSH) || defined(USE_WOLFSSH)
- #define USE_SSH
- #endif
- /*
- * Provide a mechanism to silence picky compilers, such as gcc 4.6+.
- * Parameters should of course normally not be unused, but for example when
- * we have multiple implementations of the same interface it may happen.
- */
- #if defined(__GNUC__) && ((__GNUC__ >= 3) || \
- ((__GNUC__ == 2) && defined(__GNUC_MINOR__) && (__GNUC_MINOR__ >= 7)))
- # define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
- #elif defined(__IAR_SYSTEMS_ICC__) && (__VER__ >= 9040001)
- # define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
- #else
- # define WARN_UNUSED_RESULT
- #endif
- /* noreturn attribute */
- #ifndef CURL_NORETURN
- #if (defined(__GNUC__) && (__GNUC__ >= 3)) || defined(__clang__) || \
- defined(__IAR_SYSTEMS_ICC__)
- # define CURL_NORETURN __attribute__((__noreturn__))
- #elif defined(_MSC_VER)
- # define CURL_NORETURN __declspec(noreturn)
- #else
- # define CURL_NORETURN
- #endif
- #endif
- /* fallthrough attribute */
- #ifndef FALLTHROUGH
- #if (defined(__GNUC__) && __GNUC__ >= 7) || \
- (defined(__clang__) && __clang_major__ >= 10)
- # define FALLTHROUGH() __attribute__((fallthrough))
- #else
- # define FALLTHROUGH() do {} while (0)
- #endif
- #endif
- /*
- * Include macros and defines that should only be processed once.
- */
- #ifndef HEADER_CURL_SETUP_ONCE_H
- #include "curl_setup_once.h"
- #endif
- #ifdef UNDER_CE
- #define getenv curl_getenv /* Windows CE does not support getenv() */
- #define raise(s) ((void)(s))
- /* Terrible workarounds to make Windows CE compile */
- #define errno 0
- #define CURL_SETERRNO(x) ((void)(x))
- #define EINTR 4
- #define EAGAIN 11
- #define ENOMEM 12
- #define EACCES 13
- #define EEXIST 17
- #define EISDIR 21
- #define EINVAL 22
- #define ENOSPC 28
- #define strerror(x) "?"
- #undef STDIN_FILENO
- #define STDIN_FILENO 0
- #else
- #define CURL_SETERRNO(x) (errno = (x))
- #endif
- /*
- * Definition of our NOP statement Object-like macro
- */
- #ifndef Curl_nop_stmt
- #define Curl_nop_stmt do { } while(0)
- #endif
- /*
- * Ensure that Winsock and lwIP TCP/IP stacks are not mixed.
- */
- #if defined(__LWIP_OPT_H__) || defined(LWIP_HDR_OPT_H)
- # if defined(SOCKET) || defined(USE_WINSOCK)
- # error "Winsock and lwIP TCP/IP stack definitions shall not coexist!"
- # endif
- #endif
- /*
- * shutdown() flags for systems that do not define them
- */
- #ifndef SHUT_RD
- #define SHUT_RD 0x00
- #endif
- #ifndef SHUT_WR
- #define SHUT_WR 0x01
- #endif
- #ifndef SHUT_RDWR
- #define SHUT_RDWR 0x02
- #endif
- /* Define S_ISREG if not defined by system headers, e.g. MSVC */
- #if !defined(S_ISREG) && defined(S_IFMT) && defined(S_IFREG)
- #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
- #endif
- /* Define S_ISDIR if not defined by system headers, e.g. MSVC */
- #if !defined(S_ISDIR) && defined(S_IFMT) && defined(S_IFDIR)
- #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
- #endif
- /* For MSVC (all versions as of VS2022) */
- #ifndef STDIN_FILENO
- #define STDIN_FILENO fileno(stdin)
- #endif
- #ifndef STDOUT_FILENO
- #define STDOUT_FILENO fileno(stdout)
- #endif
- #ifndef STDERR_FILENO
- #define STDERR_FILENO fileno(stderr)
- #endif
- /* Since O_BINARY is used in bitmasks, setting it to zero makes it usable in
- source code but yet it does not ruin anything */
- #ifdef O_BINARY
- #define CURL_O_BINARY O_BINARY
- #else
- #define CURL_O_BINARY 0
- #endif
- /* In Windows the default file mode is text but an application can override it.
- Therefore we specify it explicitly. https://github.com/curl/curl/pull/258
- */
- #if defined(_WIN32) || defined(MSDOS)
- #define FOPEN_READTEXT "rt"
- #define FOPEN_WRITETEXT "wt"
- #define FOPEN_APPENDTEXT "at"
- #elif defined(__CYGWIN__)
- /* Cygwin has specific behavior we need to address when _WIN32 is not defined.
- https://cygwin.com/cygwin-ug-net/using-textbinary.html
- For write we want our output to have line endings of LF and be compatible with
- other Cygwin utilities. For read we want to handle input that may have line
- endings either CRLF or LF so 't' is appropriate.
- */
- #define FOPEN_READTEXT "rt"
- #define FOPEN_WRITETEXT "w"
- #define FOPEN_APPENDTEXT "a"
- #else
- #define FOPEN_READTEXT "r"
- #define FOPEN_WRITETEXT "w"
- #define FOPEN_APPENDTEXT "a"
- #endif
- /* for systems that do not detect this in configure */
- #ifndef CURL_SA_FAMILY_T
- # if defined(_WIN32) && !defined(UNDER_CE)
- # define CURL_SA_FAMILY_T ADDRESS_FAMILY
- # elif defined(HAVE_SA_FAMILY_T)
- # define CURL_SA_FAMILY_T sa_family_t
- # elif defined(__AMIGA__)
- # define CURL_SA_FAMILY_T unsigned char
- # else
- /* use a sensible default */
- # define CURL_SA_FAMILY_T unsigned short
- # endif
- #endif
- /* Some convenience macros to get the larger/smaller value out of two given.
- We prefix with CURL to prevent name collisions. */
- #define CURLMAX(x,y) ((x)>(y)?(x):(y))
- #define CURLMIN(x,y) ((x)<(y)?(x):(y))
- /* A convenience macro to provide both the string literal and the length of
- the string literal in one go, useful for functions that take "string,len"
- as their argument */
- #define STRCONST(x) x,sizeof(x)-1
- #define CURL_ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0]))
- #ifndef CURL_DID_MEMORY_FUNC_TYPEDEFS /* only if not already done */
- /*
- * The following memory function replacement typedef's are COPIED from
- * curl/curl.h and MUST match the originals. We copy them to avoid having to
- * include curl/curl.h here. We avoid that include since it includes stdio.h
- * and other headers that may get messed up with defines done here.
- */
- typedef void *(*curl_malloc_callback)(size_t size);
- typedef void (*curl_free_callback)(void *ptr);
- typedef void *(*curl_realloc_callback)(void *ptr, size_t size);
- typedef char *(*curl_strdup_callback)(const char *str);
- typedef void *(*curl_calloc_callback)(size_t nmemb, size_t size);
- #define CURL_DID_MEMORY_FUNC_TYPEDEFS
- #endif
- extern curl_malloc_callback Curl_cmalloc;
- extern curl_free_callback Curl_cfree;
- extern curl_realloc_callback Curl_crealloc;
- extern curl_strdup_callback Curl_cstrdup;
- extern curl_calloc_callback Curl_ccalloc;
- /*
- * Curl_safefree defined as a macro to allow MemoryTracking feature
- * to log free() calls at same location where Curl_safefree is used.
- * This macro also assigns NULL to given pointer when free'd.
- */
- #define Curl_safefree(ptr) \
- do { free((ptr)); (ptr) = NULL;} while(0)
- #ifdef CURLDEBUG
- #ifdef __clang__
- # define ALLOC_FUNC __attribute__((__malloc__))
- # if __clang_major__ >= 4
- # define ALLOC_SIZE(s) __attribute__((__alloc_size__(s)))
- # define ALLOC_SIZE2(n, s) __attribute__((__alloc_size__(n, s)))
- # else
- # define ALLOC_SIZE(s)
- # define ALLOC_SIZE2(n, s)
- # endif
- #elif defined(__GNUC__) && __GNUC__ >= 3
- # define ALLOC_FUNC __attribute__((__malloc__))
- # define ALLOC_SIZE(s) __attribute__((__alloc_size__(s)))
- # define ALLOC_SIZE2(n, s) __attribute__((__alloc_size__(n, s)))
- #elif defined(_MSC_VER)
- # define ALLOC_FUNC __declspec(restrict)
- # define ALLOC_SIZE(s)
- # define ALLOC_SIZE2(n, s)
- #else
- # define ALLOC_FUNC
- # define ALLOC_SIZE(s)
- # define ALLOC_SIZE2(n, s)
- #endif
- #include <curl/curl.h> /* for CURL_EXTERN */
- extern FILE *curl_dbg_logfile;
- /* memory functions */
- CURL_EXTERN void curl_dbg_free(void *ptr, int line, const char *source);
- CURL_EXTERN ALLOC_FUNC ALLOC_SIZE(1)
- void *curl_dbg_malloc(size_t size, int line, const char *source);
- CURL_EXTERN ALLOC_FUNC ALLOC_SIZE2(1, 2)
- void *curl_dbg_calloc(size_t n, size_t size, int line, const char *source);
- CURL_EXTERN ALLOC_SIZE(2)
- void *curl_dbg_realloc(void *ptr, size_t size, int line, const char *source);
- CURL_EXTERN ALLOC_FUNC
- char *curl_dbg_strdup(const char *str, int line, const char *src);
- #if defined(_WIN32) && defined(UNICODE)
- CURL_EXTERN ALLOC_FUNC
- wchar_t *curl_dbg_wcsdup(const wchar_t *str, int line, const char *source);
- #endif
- CURL_EXTERN void curl_dbg_memdebug(const char *logname);
- CURL_EXTERN void curl_dbg_memlimit(long limit);
- CURL_EXTERN void curl_dbg_log(const char *format, ...) CURL_PRINTF(1, 2);
- /* file descriptor manipulators */
- CURL_EXTERN curl_socket_t curl_dbg_socket(int domain, int type, int protocol,
- int line, const char *source);
- CURL_EXTERN void curl_dbg_mark_sclose(curl_socket_t sockfd,
- int line, const char *source);
- CURL_EXTERN int curl_dbg_sclose(curl_socket_t sockfd,
- int line, const char *source);
- CURL_EXTERN curl_socket_t curl_dbg_accept(curl_socket_t s, void *a, void *alen,
- int line, const char *source);
- #ifdef HAVE_ACCEPT4
- CURL_EXTERN curl_socket_t curl_dbg_accept4(curl_socket_t s, void *saddr,
- void *saddrlen, int flags,
- int line, const char *source);
- #endif
- #ifdef HAVE_SOCKETPAIR
- CURL_EXTERN int curl_dbg_socketpair(int domain, int type, int protocol,
- curl_socket_t socket_vector[2],
- int line, const char *source);
- #endif
- /* send/receive sockets */
- CURL_EXTERN SEND_TYPE_RETV curl_dbg_send(SEND_TYPE_ARG1 sockfd,
- SEND_QUAL_ARG2 SEND_TYPE_ARG2 buf,
- SEND_TYPE_ARG3 len,
- SEND_TYPE_ARG4 flags, int line,
- const char *source);
- CURL_EXTERN RECV_TYPE_RETV curl_dbg_recv(RECV_TYPE_ARG1 sockfd,
- RECV_TYPE_ARG2 buf,
- RECV_TYPE_ARG3 len,
- RECV_TYPE_ARG4 flags, int line,
- const char *source);
- /* FILE functions */
- CURL_EXTERN int curl_dbg_fclose(FILE *file, int line, const char *source);
- CURL_EXTERN ALLOC_FUNC
- FILE *curl_dbg_fopen(const char *file, const char *mode,
- int line, const char *source);
- CURL_EXTERN ALLOC_FUNC
- FILE *curl_dbg_fdopen(int filedes, const char *mode,
- int line, const char *source);
- #define sclose(sockfd) curl_dbg_sclose(sockfd,__LINE__,__FILE__)
- #define fake_sclose(sockfd) curl_dbg_mark_sclose(sockfd,__LINE__,__FILE__)
- #define CURL_GETADDRINFO(host,serv,hint,res) \
- curl_dbg_getaddrinfo(host, serv, hint, res, __LINE__, __FILE__)
- #define CURL_FREEADDRINFO(data) \
- curl_dbg_freeaddrinfo(data, __LINE__, __FILE__)
- #define CURL_ACCEPT(sock,addr,len) \
- curl_dbg_accept(sock, addr, len, __LINE__, __FILE__)
- #else /* !CURLDEBUG */
- #define sclose(x) CURL_SCLOSE(x)
- #define fake_sclose(x) Curl_nop_stmt
- #define CURL_GETADDRINFO getaddrinfo
- #define CURL_FREEADDRINFO freeaddrinfo
- #define CURL_ACCEPT accept
- #endif /* CURLDEBUG */
- /* Some versions of the Android NDK is missing the declaration */
- #if defined(HAVE_GETPWUID_R) && \
- defined(__ANDROID_API__) && (__ANDROID_API__ < 21)
- struct passwd;
- int getpwuid_r(uid_t uid, struct passwd *pwd, char *buf,
- size_t buflen, struct passwd **result);
- #endif
- #ifdef UNITTESTS
- #define UNITTEST
- #else
- #define UNITTEST static
- #endif
- #ifdef USE_NGHTTP2
- #define USE_HTTP2
- #endif
- #if (defined(USE_NGTCP2) && defined(USE_NGHTTP3)) || \
- (defined(USE_OPENSSL_QUIC) && defined(USE_NGHTTP3)) || \
- defined(USE_QUICHE)
- #ifdef CURL_WITH_MULTI_SSL
- #error "MultiSSL combined with QUIC is not supported"
- #endif
- #define USE_HTTP3
- #endif
- /* WebAssembly builds have TCP_NODELAY, but runtime support is missing. */
- #ifndef __EMSCRIPTEN__
- #define CURL_TCP_NODELAY_SUPPORTED
- #endif
- /* Certain Windows implementations are not aligned with what curl expects,
- so always use the local one on this platform. E.g. the mingw-w64
- implementation can return wrong results for non-ASCII inputs. */
- #if defined(HAVE_BASENAME) && defined(_WIN32)
- #undef HAVE_BASENAME
- #endif
- #if defined(USE_UNIX_SOCKETS) && defined(_WIN32)
- # ifndef UNIX_PATH_MAX
- /* Replicating logic present in afunix.h
- (distributed with newer Windows 10 SDK versions only) */
- # define UNIX_PATH_MAX 108
- /* !checksrc! disable TYPEDEFSTRUCT 1 */
- typedef struct sockaddr_un {
- CURL_SA_FAMILY_T sun_family;
- char sun_path[UNIX_PATH_MAX];
- } SOCKADDR_UN, *PSOCKADDR_UN;
- # define WIN32_SOCKADDR_UN
- # endif
- #endif
- #ifdef USE_OPENSSL
- /* OpenSSLv3 marks DES, MD5 and ENGINE functions deprecated but we have no
- replacements (yet) so tell the compiler to not warn for them. */
- # define OPENSSL_SUPPRESS_DEPRECATED
- # ifdef _WIN32
- /* Silence LibreSSL warnings about wincrypt.h collision. Works in 3.8.2+ */
- # ifndef LIBRESSL_DISABLE_OVERRIDE_WINCRYPT_DEFINES_WARNING
- # define LIBRESSL_DISABLE_OVERRIDE_WINCRYPT_DEFINES_WARNING
- # endif
- # endif
- #endif
- #ifdef CURL_INLINE
- /* 'CURL_INLINE' defined, use as-is */
- #elif defined(inline)
- # define CURL_INLINE inline /* 'inline' defined, assumed correct */
- #elif defined(__cplusplus)
- /* The code is compiled with C++ compiler.
- C++ always supports 'inline'. */
- # define CURL_INLINE inline /* 'inline' keyword supported */
- #elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901
- /* C99 (and later) supports 'inline' keyword */
- # define CURL_INLINE inline /* 'inline' keyword supported */
- #elif defined(__GNUC__) && __GNUC__ >= 3
- /* GCC supports '__inline__' as an extension */
- # define CURL_INLINE __inline__
- #elif defined(_MSC_VER)
- # define CURL_INLINE __inline
- #else
- /* Probably 'inline' is not supported by compiler.
- Define to the empty string to be on the safe side. */
- # define CURL_INLINE /* empty */
- #endif
- #endif /* HEADER_CURL_SETUP_H */
- #include "curl_mem_undef.h"
|