1 #ifndef HEADER_CURL_SETUP_H 2 #define HEADER_CURL_SETUP_H 3 /*************************************************************************** 4 * _ _ ____ _ 5 * Project ___| | | | _ \| | 6 * / __| | | | |_) | | 7 * | (__| |_| | _ <| |___ 8 * \___|\___/|_| \_\_____| 9 * 10 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al. 11 * 12 * This software is licensed as described in the file COPYING, which 13 * you should have received as part of this distribution. The terms 14 * are also available at https://curl.haxx.se/docs/copyright.html. 15 * 16 * You may opt to use, copy, modify, merge, publish, distribute and/or sell 17 * copies of the Software, and permit persons to whom the Software is 18 * furnished to do so, under the terms of the COPYING file. 19 * 20 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 21 * KIND, either express or implied. 22 * 23 ***************************************************************************/ 24 25 #if defined(BUILDING_LIBCURL) && !defined(CURL_NO_OLDIES) 26 #define CURL_NO_OLDIES 27 #endif 28 29 /* 30 * Define WIN32 when build target is Win32 API 31 */ 32 33 #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) && \ 34 !defined(__SYMBIAN32__) 35 #define WIN32 36 #endif 37 38 #ifdef WIN32 39 /* 40 * Don't include unneeded stuff in Windows headers to avoid compiler 41 * warnings and macro clashes. 42 * Make sure to define this macro before including any Windows headers. 43 */ 44 # ifndef WIN32_LEAN_AND_MEAN 45 # define WIN32_LEAN_AND_MEAN 46 # endif 47 # ifndef NOGDI 48 # define NOGDI 49 # endif 50 #endif 51 52 /* 53 * Include configuration script results or hand-crafted 54 * configuration file for platforms which lack config tool. 55 */ 56 57 #ifdef HAVE_CONFIG_H 58 59 #include "curl_config.h" 60 61 #else /* HAVE_CONFIG_H */ 62 63 #ifdef _WIN32_WCE 64 # include "config-win32ce.h" 65 #else 66 # ifdef WIN32 67 # include "config-win32.h" 68 # endif 69 #endif 70 71 #if defined(macintosh) && defined(__MRC__) 72 # include "config-mac.h" 73 #endif 74 75 #ifdef __riscos__ 76 # include "config-riscos.h" 77 #endif 78 79 #ifdef __AMIGA__ 80 # include "config-amigaos.h" 81 #endif 82 83 #ifdef __SYMBIAN32__ 84 # include "config-symbian.h" 85 #endif 86 87 #ifdef __OS400__ 88 # include "config-os400.h" 89 #endif 90 91 #ifdef TPF 92 # include "config-tpf.h" 93 #endif 94 95 #ifdef __VXWORKS__ 96 # include "config-vxworks.h" 97 #endif 98 99 #ifdef __PLAN9__ 100 # include "config-plan9.h" 101 #endif 102 103 #endif /* HAVE_CONFIG_H */ 104 105 /* ================================================================ */ 106 /* Definition of preprocessor macros/symbols which modify compiler */ 107 /* behavior or generated code characteristics must be done here, */ 108 /* as appropriate, before any system header file is included. It is */ 109 /* also possible to have them defined in the config file included */ 110 /* before this point. As a result of all this we frown inclusion of */ 111 /* system header files in our config files, avoid this at any cost. */ 112 /* ================================================================ */ 113 114 /* 115 * AIX 4.3 and newer needs _THREAD_SAFE defined to build 116 * proper reentrant code. Others may also need it. 117 */ 118 119 #ifdef NEED_THREAD_SAFE 120 # ifndef _THREAD_SAFE 121 # define _THREAD_SAFE 122 # endif 123 #endif 124 125 /* 126 * Tru64 needs _REENTRANT set for a few function prototypes and 127 * things to appear in the system header files. Unixware needs it 128 * to build proper reentrant code. Others may also need it. 129 */ 130 131 #ifdef NEED_REENTRANT 132 # ifndef _REENTRANT 133 # define _REENTRANT 134 # endif 135 #endif 136 137 /* Solaris needs this to get a POSIX-conformant getpwuid_r */ 138 #if defined(sun) || defined(__sun) 139 # ifndef _POSIX_PTHREAD_SEMANTICS 140 # define _POSIX_PTHREAD_SEMANTICS 1 141 # endif 142 #endif 143 144 /* ================================================================ */ 145 /* If you need to include a system header file for your platform, */ 146 /* please, do it beyond the point further indicated in this file. */ 147 /* ================================================================ */ 148 149 #include <curl/curl.h> 150 151 #define CURL_SIZEOF_CURL_OFF_T SIZEOF_CURL_OFF_T 152 153 /* 154 * Disable other protocols when http is the only one desired. 155 */ 156 157 #ifdef HTTP_ONLY 158 # ifndef CURL_DISABLE_TFTP 159 # define CURL_DISABLE_TFTP 160 # endif 161 # ifndef CURL_DISABLE_FTP 162 # define CURL_DISABLE_FTP 163 # endif 164 # ifndef CURL_DISABLE_LDAP 165 # define CURL_DISABLE_LDAP 166 # endif 167 # ifndef CURL_DISABLE_TELNET 168 # define CURL_DISABLE_TELNET 169 # endif 170 # ifndef CURL_DISABLE_DICT 171 # define CURL_DISABLE_DICT 172 # endif 173 # ifndef CURL_DISABLE_FILE 174 # define CURL_DISABLE_FILE 175 # endif 176 # ifndef CURL_DISABLE_RTSP 177 # define CURL_DISABLE_RTSP 178 # endif 179 # ifndef CURL_DISABLE_POP3 180 # define CURL_DISABLE_POP3 181 # endif 182 # ifndef CURL_DISABLE_IMAP 183 # define CURL_DISABLE_IMAP 184 # endif 185 # ifndef CURL_DISABLE_SMTP 186 # define CURL_DISABLE_SMTP 187 # endif 188 # ifndef CURL_DISABLE_GOPHER 189 # define CURL_DISABLE_GOPHER 190 # endif 191 # ifndef CURL_DISABLE_SMB 192 # define CURL_DISABLE_SMB 193 # endif 194 #endif 195 196 /* 197 * When http is disabled rtsp is not supported. 198 */ 199 200 #if defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_RTSP) 201 # define CURL_DISABLE_RTSP 202 #endif 203 204 /* ================================================================ */ 205 /* No system header file shall be included in this file before this */ 206 /* point. The only allowed ones are those included from curl/system.h */ 207 /* ================================================================ */ 208 209 /* 210 * OS/400 setup file includes some system headers. 211 */ 212 213 #ifdef __OS400__ 214 # include "setup-os400.h" 215 #endif 216 217 /* 218 * VMS setup file includes some system headers. 219 */ 220 221 #ifdef __VMS 222 # include "setup-vms.h" 223 #endif 224 225 /* 226 * Use getaddrinfo to resolve the IPv4 address literal. If the current network 227 * interface doesn't support IPv4, but supports IPv6, NAT64, and DNS64, 228 * performing this task will result in a synthesized IPv6 address. 229 */ 230 #ifdef __APPLE__ 231 #define USE_RESOLVE_ON_IPS 1 232 #endif 233 234 /* 235 * Include header files for windows builds before redefining anything. 236 * Use this preprocessor block only to include or exclude windows.h, 237 * winsock2.h, ws2tcpip.h or winsock.h. Any other windows thing belongs 238 * to any other further and independent block. Under Cygwin things work 239 * just as under linux (e.g. <sys/socket.h>) and the winsock headers should 240 * never be included when __CYGWIN__ is defined. configure script takes 241 * care of this, not defining HAVE_WINDOWS_H, HAVE_WINSOCK_H, HAVE_WINSOCK2_H, 242 * neither HAVE_WS2TCPIP_H when __CYGWIN__ is defined. 243 */ 244 245 #ifdef HAVE_WINDOWS_H 246 # if defined(UNICODE) && !defined(_UNICODE) 247 # define _UNICODE 248 # endif 249 # if defined(_UNICODE) && !defined(UNICODE) 250 # define UNICODE 251 # endif 252 # include <winerror.h> 253 # include <windows.h> 254 # ifdef HAVE_WINSOCK2_H 255 # include <winsock2.h> 256 # ifdef HAVE_WS2TCPIP_H 257 # include <ws2tcpip.h> 258 # endif 259 # else 260 # ifdef HAVE_WINSOCK_H 261 # include <winsock.h> 262 # endif 263 # endif 264 # include <tchar.h> 265 # ifdef UNICODE 266 typedef wchar_t *(*curl_wcsdup_callback)(const wchar_t *str); 267 # endif 268 #endif 269 270 /* 271 * Define USE_WINSOCK to 2 if we have and use WINSOCK2 API, else 272 * define USE_WINSOCK to 1 if we have and use WINSOCK API, else 273 * undefine USE_WINSOCK. 274 */ 275 276 #undef USE_WINSOCK 277 278 #ifdef HAVE_WINSOCK2_H 279 # define USE_WINSOCK 2 280 #else 281 # ifdef HAVE_WINSOCK_H 282 # define USE_WINSOCK 1 283 # endif 284 #endif 285 286 #ifdef USE_LWIPSOCK 287 # include <lwip/init.h> 288 # include <lwip/sockets.h> 289 # include <lwip/netdb.h> 290 #endif 291 292 #ifdef HAVE_EXTRA_STRICMP_H 293 # include <extra/stricmp.h> 294 #endif 295 296 #ifdef HAVE_EXTRA_STRDUP_H 297 # include <extra/strdup.h> 298 #endif 299 300 #ifdef TPF 301 # include <strings.h> /* for bzero, strcasecmp, and strncasecmp */ 302 # include <string.h> /* for strcpy and strlen */ 303 # include <stdlib.h> /* for rand and srand */ 304 # include <sys/socket.h> /* for select and ioctl*/ 305 # include <netdb.h> /* for in_addr_t definition */ 306 # include <tpf/sysapi.h> /* for tpf_process_signals */ 307 /* change which select is used for libcurl */ 308 # define select(a,b,c,d,e) tpf_select_libcurl(a,b,c,d,e) 309 #endif 310 311 #ifdef __VXWORKS__ 312 # include <sockLib.h> /* for generic BSD socket functions */ 313 # include <ioLib.h> /* for basic I/O interface functions */ 314 #endif 315 316 #ifdef __AMIGA__ 317 # include <exec/types.h> 318 # include <exec/execbase.h> 319 # include <proto/exec.h> 320 # include <proto/dos.h> 321 # ifdef HAVE_PROTO_BSDSOCKET_H 322 # include <proto/bsdsocket.h> /* ensure bsdsocket.library use */ 323 # define select(a,b,c,d,e) WaitSelect(a,b,c,d,e,0) 324 # endif 325 #endif 326 327 #include <stdio.h> 328 #ifdef HAVE_ASSERT_H 329 #include <assert.h> 330 #endif 331 332 #ifdef __TANDEM /* for nsr-tandem-nsk systems */ 333 #include <floss.h> 334 #endif 335 336 #ifndef STDC_HEADERS /* no standard C headers! */ 337 #include <curl/stdcheaders.h> 338 #endif 339 340 #ifdef __POCC__ 341 # include <sys/types.h> 342 # include <unistd.h> 343 # define sys_nerr EILSEQ 344 #endif 345 346 /* 347 * Salford-C kludge section (mostly borrowed from wxWidgets). 348 */ 349 #ifdef __SALFORDC__ 350 #pragma suppress 353 /* Possible nested comments */ 351 #pragma suppress 593 /* Define not used */ 352 #pragma suppress 61 /* enum has no name */ 353 #pragma suppress 106 /* unnamed, unused parameter */ 354 #include <clib.h> 355 #endif 356 357 /* 358 * Large file (>2Gb) support using WIN32 functions. 359 */ 360 361 #ifdef USE_WIN32_LARGE_FILES 362 # include <io.h> 363 # include <sys/types.h> 364 # include <sys/stat.h> 365 # undef lseek 366 # define lseek(fdes,offset,whence) _lseeki64(fdes, offset, whence) 367 # undef fstat 368 # define fstat(fdes,stp) _fstati64(fdes, stp) 369 # undef stat 370 # define stat(fname,stp) _stati64(fname, stp) 371 # define struct_stat struct _stati64 372 # define LSEEK_ERROR (__int64)-1 373 #endif 374 375 /* 376 * Small file (<2Gb) support using WIN32 functions. 377 */ 378 379 #ifdef USE_WIN32_SMALL_FILES 380 # include <io.h> 381 # include <sys/types.h> 382 # include <sys/stat.h> 383 # ifndef _WIN32_WCE 384 # undef lseek 385 # define lseek(fdes,offset,whence) _lseek(fdes, (long)offset, whence) 386 # define fstat(fdes,stp) _fstat(fdes, stp) 387 # define stat(fname,stp) _stat(fname, stp) 388 # define struct_stat struct _stat 389 # endif 390 # define LSEEK_ERROR (long)-1 391 #endif 392 393 #ifndef struct_stat 394 # define struct_stat struct stat 395 #endif 396 397 #ifndef LSEEK_ERROR 398 # define LSEEK_ERROR (off_t)-1 399 #endif 400 401 #ifndef SIZEOF_TIME_T 402 /* assume default size of time_t to be 32 bit */ 403 #define SIZEOF_TIME_T 4 404 #endif 405 406 /* 407 * Default sizeof(off_t) in case it hasn't been defined in config file. 408 */ 409 410 #ifndef SIZEOF_OFF_T 411 # if defined(__VMS) && !defined(__VAX) 412 # if defined(_LARGEFILE) 413 # define SIZEOF_OFF_T 8 414 # endif 415 # elif defined(__OS400__) && defined(__ILEC400__) 416 # if defined(_LARGE_FILES) 417 # define SIZEOF_OFF_T 8 418 # endif 419 # elif defined(__MVS__) && defined(__IBMC__) 420 # if defined(_LP64) || defined(_LARGE_FILES) 421 # define SIZEOF_OFF_T 8 422 # endif 423 # elif defined(__370__) && defined(__IBMC__) 424 # if defined(_LP64) || defined(_LARGE_FILES) 425 # define SIZEOF_OFF_T 8 426 # endif 427 # endif 428 # ifndef SIZEOF_OFF_T 429 # define SIZEOF_OFF_T 4 430 # endif 431 #endif 432 433 #if (SIZEOF_CURL_OFF_T == 4) 434 # define CURL_OFF_T_MAX CURL_OFF_T_C(0x7FFFFFFF) 435 #else 436 /* assume CURL_SIZEOF_CURL_OFF_T == 8 */ 437 # define CURL_OFF_T_MAX CURL_OFF_T_C(0x7FFFFFFFFFFFFFFF) 438 #endif 439 #define CURL_OFF_T_MIN (-CURL_OFF_T_MAX - CURL_OFF_T_C(1)) 440 441 #if (SIZEOF_TIME_T == 4) 442 # ifdef HAVE_TIME_T_UNSIGNED 443 # define TIME_T_MAX UINT_MAX 444 # define TIME_T_MIN 0 445 # else 446 # define TIME_T_MAX INT_MAX 447 # define TIME_T_MIN INT_MIN 448 # endif 449 #else 450 # ifdef HAVE_TIME_T_UNSIGNED 451 # define TIME_T_MAX 0xFFFFFFFFFFFFFFFF 452 # define TIME_T_MIN 0 453 # else 454 # define TIME_T_MAX 0x7FFFFFFFFFFFFFFF 455 # define TIME_T_MIN (-TIME_T_MAX - 1) 456 # endif 457 #endif 458 459 #ifndef SIZE_T_MAX 460 /* some limits.h headers have this defined, some don't */ 461 #if defined(SIZEOF_SIZE_T) && (SIZEOF_SIZE_T > 4) 462 #define SIZE_T_MAX 18446744073709551615U 463 #else 464 #define SIZE_T_MAX 4294967295U 465 #endif 466 #endif 467 468 /* 469 * Arg 2 type for gethostname in case it hasn't been defined in config file. 470 */ 471 472 #ifndef GETHOSTNAME_TYPE_ARG2 473 # ifdef USE_WINSOCK 474 # define GETHOSTNAME_TYPE_ARG2 int 475 # else 476 # define GETHOSTNAME_TYPE_ARG2 size_t 477 # endif 478 #endif 479 480 /* Below we define some functions. They should 481 482 4. set the SIGALRM signal timeout 483 5. set dir/file naming defines 484 */ 485 486 #ifdef WIN32 487 488 # define DIR_CHAR "\\" 489 490 #else /* WIN32 */ 491 492 # ifdef MSDOS /* Watt-32 */ 493 494 # include <sys/ioctl.h> 495 # define select(n,r,w,x,t) select_s(n,r,w,x,t) 496 # define ioctl(x,y,z) ioctlsocket(x,y,(char *)(z)) 497 # include <tcp.h> 498 # ifdef word 499 # undef word 500 # endif 501 # ifdef byte 502 # undef byte 503 # endif 504 505 # endif /* MSDOS */ 506 507 # ifdef __minix 508 /* Minix 3 versions up to at least 3.1.3 are missing these prototypes */ 509 extern char *strtok_r(char *s, const char *delim, char **last); 510 extern struct tm *gmtime_r(const time_t * const timep, struct tm *tmp); 511 # endif 512 513 # define DIR_CHAR "/" 514 515 # ifndef fileno /* sunos 4 have this as a macro! */ 516 int fileno(FILE *stream); 517 # endif 518 519 #endif /* WIN32 */ 520 521 /* 522 * msvc 6.0 requires PSDK in order to have INET6_ADDRSTRLEN 523 * defined in ws2tcpip.h as well as to provide IPv6 support. 524 * Does not apply if lwIP is used. 525 */ 526 527 #if defined(_MSC_VER) && !defined(__POCC__) && !defined(USE_LWIPSOCK) 528 # if !defined(HAVE_WS2TCPIP_H) || \ 529 ((_MSC_VER < 1300) && !defined(INET6_ADDRSTRLEN)) 530 # undef HAVE_GETADDRINFO_THREADSAFE 531 # undef HAVE_FREEADDRINFO 532 # undef HAVE_GETADDRINFO 533 # undef HAVE_GETNAMEINFO 534 # undef ENABLE_IPV6 535 # endif 536 #endif 537 538 /* ---------------------------------------------------------------- */ 539 /* resolver specialty compile-time defines */ 540 /* CURLRES_* defines to use in the host*.c sources */ 541 /* ---------------------------------------------------------------- */ 542 543 /* 544 * lcc-win32 doesn't have _beginthreadex(), lacks threads support. 545 */ 546 547 #if defined(__LCC__) && defined(WIN32) 548 # undef USE_THREADS_POSIX 549 # undef USE_THREADS_WIN32 550 #endif 551 552 /* 553 * MSVC threads support requires a multi-threaded runtime library. 554 * _beginthreadex() is not available in single-threaded ones. 555 */ 556 557 #if defined(_MSC_VER) && !defined(__POCC__) && !defined(_MT) 558 # undef USE_THREADS_POSIX 559 # undef USE_THREADS_WIN32 560 #endif 561 562 /* 563 * Mutually exclusive CURLRES_* definitions. 564 */ 565 566 #ifdef USE_ARES 567 # define CURLRES_ASYNCH 568 # define CURLRES_ARES 569 /* now undef the stock libc functions just to avoid them being used */ 570 # undef HAVE_GETADDRINFO 571 # undef HAVE_FREEADDRINFO 572 # undef HAVE_GETHOSTBYNAME 573 #elif defined(USE_THREADS_POSIX) || defined(USE_THREADS_WIN32) 574 # define CURLRES_ASYNCH 575 # define CURLRES_THREADED 576 #else 577 # define CURLRES_SYNCH 578 #endif 579 580 #ifdef ENABLE_IPV6 581 # define CURLRES_IPV6 582 #else 583 # define CURLRES_IPV4 584 #endif 585 586 /* ---------------------------------------------------------------- */ 587 588 /* 589 * When using WINSOCK, TELNET protocol requires WINSOCK2 API. 590 */ 591 592 #if defined(USE_WINSOCK) && (USE_WINSOCK != 2) 593 # define CURL_DISABLE_TELNET 1 594 #endif 595 596 /* 597 * msvc 6.0 does not have struct sockaddr_storage and 598 * does not define IPPROTO_ESP in winsock2.h. But both 599 * are available if PSDK is properly installed. 600 */ 601 602 #if defined(_MSC_VER) && !defined(__POCC__) 603 # if !defined(HAVE_WINSOCK2_H) || ((_MSC_VER < 1300) && !defined(IPPROTO_ESP)) 604 # undef HAVE_STRUCT_SOCKADDR_STORAGE 605 # endif 606 #endif 607 608 /* 609 * Intentionally fail to build when using msvc 6.0 without PSDK installed. 610 * The brave of heart can circumvent this, defining ALLOW_MSVC6_WITHOUT_PSDK 611 * in lib/config-win32.h although absolutely discouraged and unsupported. 612 */ 613 614 #if defined(_MSC_VER) && !defined(__POCC__) 615 # if !defined(HAVE_WINDOWS_H) || ((_MSC_VER < 1300) && !defined(_FILETIME_)) 616 # if !defined(ALLOW_MSVC6_WITHOUT_PSDK) 617 # error MSVC 6.0 requires "February 2003 Platform SDK" a.k.a. \ 618 "Windows Server 2003 PSDK" 619 # else 620 # define CURL_DISABLE_LDAP 1 621 # endif 622 # endif 623 #endif 624 625 #ifdef NETWARE 626 int netware_init(void); 627 #ifndef __NOVELL_LIBC__ 628 #include <sys/bsdskt.h> 629 #include <sys/timeval.h> 630 #endif 631 #endif 632 633 #if defined(HAVE_LIBIDN2) && defined(HAVE_IDN2_H) && !defined(USE_WIN32_IDN) 634 /* The lib and header are present */ 635 #define USE_LIBIDN2 636 #endif 637 638 #if defined(USE_LIBIDN2) && defined(USE_WIN32_IDN) 639 #error "Both libidn2 and WinIDN are enabled, choose one." 640 #endif 641 642 #define LIBIDN_REQUIRED_VERSION "0.4.1" 643 644 #if defined(USE_GNUTLS) || defined(USE_OPENSSL) || defined(USE_NSS) || \ 645 defined(USE_MBEDTLS) || \ 646 defined(USE_WOLFSSL) || defined(USE_SCHANNEL) || \ 647 defined(USE_SECTRANSP) || defined(USE_GSKIT) || defined(USE_MESALINK) 648 #define USE_SSL /* SSL support has been enabled */ 649 #endif 650 651 /* Single point where USE_SPNEGO definition might be defined */ 652 #if !defined(CURL_DISABLE_CRYPTO_AUTH) && \ 653 (defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)) 654 #define USE_SPNEGO 655 #endif 656 657 /* Single point where USE_KERBEROS5 definition might be defined */ 658 #if !defined(CURL_DISABLE_CRYPTO_AUTH) && \ 659 (defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)) 660 #define USE_KERBEROS5 661 #endif 662 663 /* Single point where USE_NTLM definition might be defined */ 664 #if !defined(CURL_DISABLE_NTLM) && !defined(CURL_DISABLE_CRYPTO_AUTH) 665 #if defined(USE_OPENSSL) || defined(USE_WINDOWS_SSPI) || \ 666 defined(USE_GNUTLS) || defined(USE_NSS) || defined(USE_SECTRANSP) || \ 667 defined(USE_OS400CRYPTO) || defined(USE_WIN32_CRYPTO) || \ 668 defined(USE_MBEDTLS) 669 670 #define USE_NTLM 671 672 # if defined(USE_MBEDTLS) 673 /* Get definition of MBEDTLS_MD4_C */ 674 # include <mbedtls/md4.h> 675 # endif 676 677 #endif 678 #endif 679 680 #ifdef CURL_WANTS_CA_BUNDLE_ENV 681 #error "No longer supported. Set CURLOPT_CAINFO at runtime instead." 682 #endif 683 684 #if defined(USE_LIBSSH2) || defined(USE_LIBSSH) || defined(USE_WOLFSSH) 685 #define USE_SSH 686 #endif 687 688 /* 689 * Provide a mechanism to silence picky compilers, such as gcc 4.6+. 690 * Parameters should of course normally not be unused, but for example when 691 * we have multiple implementations of the same interface it may happen. 692 */ 693 694 #if defined(__GNUC__) && ((__GNUC__ >= 3) || \ 695 ((__GNUC__ == 2) && defined(__GNUC_MINOR__) && (__GNUC_MINOR__ >= 7))) 696 # define UNUSED_PARAM __attribute__((__unused__)) 697 # define WARN_UNUSED_RESULT __attribute__((warn_unused_result)) 698 #else 699 # define UNUSED_PARAM /*NOTHING*/ 700 # define WARN_UNUSED_RESULT 701 #endif 702 703 /* 704 * Include macros and defines that should only be processed once. 705 */ 706 707 #ifndef HEADER_CURL_SETUP_ONCE_H 708 #include "curl_setup_once.h" 709 #endif 710 711 /* 712 * Definition of our NOP statement Object-like macro 713 */ 714 715 #ifndef Curl_nop_stmt 716 # define Curl_nop_stmt do { } WHILE_FALSE 717 #endif 718 719 /* 720 * Ensure that Winsock and lwIP TCP/IP stacks are not mixed. 721 */ 722 723 #if defined(__LWIP_OPT_H__) || defined(LWIP_HDR_OPT_H) 724 # if defined(SOCKET) || \ 725 defined(USE_WINSOCK) || \ 726 defined(HAVE_WINSOCK_H) || \ 727 defined(HAVE_WINSOCK2_H) || \ 728 defined(HAVE_WS2TCPIP_H) 729 # error "Winsock and lwIP TCP/IP stack definitions shall not coexist!" 730 # endif 731 #endif 732 733 /* 734 * Portable symbolic names for Winsock shutdown() mode flags. 735 */ 736 737 #ifdef USE_WINSOCK 738 # define SHUT_RD 0x00 739 # define SHUT_WR 0x01 740 # define SHUT_RDWR 0x02 741 #endif 742 743 /* Define S_ISREG if not defined by system headers, f.e. MSVC */ 744 #if !defined(S_ISREG) && defined(S_IFMT) && defined(S_IFREG) 745 #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) 746 #endif 747 748 /* Define S_ISDIR if not defined by system headers, f.e. MSVC */ 749 #if !defined(S_ISDIR) && defined(S_IFMT) && defined(S_IFDIR) 750 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) 751 #endif 752 753 /* In Windows the default file mode is text but an application can override it. 754 Therefore we specify it explicitly. https://github.com/curl/curl/pull/258 755 */ 756 #if defined(WIN32) || defined(MSDOS) 757 #define FOPEN_READTEXT "rt" 758 #define FOPEN_WRITETEXT "wt" 759 #define FOPEN_APPENDTEXT "at" 760 #elif defined(__CYGWIN__) 761 /* Cygwin has specific behavior we need to address when WIN32 is not defined. 762 https://cygwin.com/cygwin-ug-net/using-textbinary.html 763 For write we want our output to have line endings of LF and be compatible with 764 other Cygwin utilities. For read we want to handle input that may have line 765 endings either CRLF or LF so 't' is appropriate. 766 */ 767 #define FOPEN_READTEXT "rt" 768 #define FOPEN_WRITETEXT "w" 769 #define FOPEN_APPENDTEXT "a" 770 #else 771 #define FOPEN_READTEXT "r" 772 #define FOPEN_WRITETEXT "w" 773 #define FOPEN_APPENDTEXT "a" 774 #endif 775 776 /* WinSock destroys recv() buffer when send() failed. 777 * Enabled automatically for Windows and for Cygwin as Cygwin sockets are 778 * wrappers for WinSock sockets. https://github.com/curl/curl/issues/657 779 * Define DONT_USE_RECV_BEFORE_SEND_WORKAROUND to force disable workaround. 780 */ 781 #if !defined(DONT_USE_RECV_BEFORE_SEND_WORKAROUND) 782 # if defined(WIN32) || defined(__CYGWIN__) 783 # define USE_RECV_BEFORE_SEND_WORKAROUND 784 # endif 785 #else /* DONT_USE_RECV_BEFORE_SEND_WORKAROUND */ 786 # ifdef USE_RECV_BEFORE_SEND_WORKAROUND 787 # undef USE_RECV_BEFORE_SEND_WORKAROUND 788 # endif 789 #endif /* DONT_USE_RECV_BEFORE_SEND_WORKAROUND */ 790 791 /* Detect Windows App environment which has a restricted access 792 * to the Win32 APIs. */ 793 # if (defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0602)) || \ 794 defined(WINAPI_FAMILY) 795 # include <winapifamily.h> 796 # if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && \ 797 !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) 798 # define CURL_WINDOWS_APP 799 # endif 800 # endif 801 802 /* for systems that don't detect this in configure, use a sensible default */ 803 #ifndef CURL_SA_FAMILY_T 804 #define CURL_SA_FAMILY_T unsigned short 805 #endif 806 807 /* Some convenience macros to get the larger/smaller value out of two given. 808 We prefix with CURL to prevent name collisions. */ 809 #define CURLMAX(x,y) ((x)>(y)?(x):(y)) 810 #define CURLMIN(x,y) ((x)<(y)?(x):(y)) 811 812 /* Some versions of the Android SDK is missing the declaration */ 813 #if defined(HAVE_GETPWUID_R) && defined(HAVE_DECL_GETPWUID_R_MISSING) 814 struct passwd; 815 int getpwuid_r(uid_t uid, struct passwd *pwd, char *buf, 816 size_t buflen, struct passwd **result); 817 #endif 818 819 #ifdef DEBUGBUILD 820 #define UNITTEST 821 #else 822 #define UNITTEST static 823 #endif 824 825 #if defined(USE_NGTCP2) || defined(USE_QUICHE) 826 #define ENABLE_QUIC 827 #endif 828 829 #endif /* HEADER_CURL_SETUP_H */ 830