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