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
626int 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 defined(USE_BEARSSL)
649#define USE_SSL /* SSL support has been enabled */
650#endif
651
652/* Single point where USE_SPNEGO definition might be defined */
653#if !defined(CURL_DISABLE_CRYPTO_AUTH) && \
654 (defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI))
655#define USE_SPNEGO
656#endif
657
658/* Single point where USE_KERBEROS5 definition might be defined */
659#if !defined(CURL_DISABLE_CRYPTO_AUTH) && \
660 (defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI))
661#define USE_KERBEROS5
662#endif
663
664/* Single point where USE_NTLM definition might be defined */
665#if !defined(CURL_DISABLE_NTLM) && !defined(CURL_DISABLE_CRYPTO_AUTH)
666#if defined(USE_OPENSSL) || defined(USE_WINDOWS_SSPI) || \
667 defined(USE_GNUTLS) || defined(USE_NSS) || defined(USE_SECTRANSP) || \
668 defined(USE_OS400CRYPTO) || defined(USE_WIN32_CRYPTO) || \
669 defined(USE_MBEDTLS)
670
671#define USE_NTLM
672
673# if defined(USE_MBEDTLS)
674/* Get definition of MBEDTLS_MD4_C */
675# include <mbedtls/md4.h>
676# endif
677
678#endif
679#endif
680
681#ifdef CURL_WANTS_CA_BUNDLE_ENV
682#error "No longer supported. Set CURLOPT_CAINFO at runtime instead."
683#endif
684
685#if defined(USE_LIBSSH2) || defined(USE_LIBSSH) || defined(USE_WOLFSSH)
686#define USE_SSH
687#endif
688
689/*
690 * Provide a mechanism to silence picky compilers, such as gcc 4.6+.
691 * Parameters should of course normally not be unused, but for example when
692 * we have multiple implementations of the same interface it may happen.
693 */
694
695#if defined(__GNUC__) && ((__GNUC__ >= 3) || \
696 ((__GNUC__ == 2) && defined(__GNUC_MINOR__) && (__GNUC_MINOR__ >= 7)))
697# define UNUSED_PARAM __attribute__((__unused__))
698# define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
699#else
700# define UNUSED_PARAM /*NOTHING*/
701# define WARN_UNUSED_RESULT
702#endif
703
704/*
705 * Include macros and defines that should only be processed once.
706 */
707
708#ifndef HEADER_CURL_SETUP_ONCE_H
709#include "curl_setup_once.h"
710#endif
711
712/*
713 * Definition of our NOP statement Object-like macro
714 */
715
716#ifndef Curl_nop_stmt
717# define Curl_nop_stmt do { } WHILE_FALSE
718#endif
719
720/*
721 * Ensure that Winsock and lwIP TCP/IP stacks are not mixed.
722 */
723
724#if defined(__LWIP_OPT_H__) || defined(LWIP_HDR_OPT_H)
725# if defined(SOCKET) || \
726 defined(USE_WINSOCK) || \
727 defined(HAVE_WINSOCK_H) || \
728 defined(HAVE_WINSOCK2_H) || \
729 defined(HAVE_WS2TCPIP_H)
730# error "Winsock and lwIP TCP/IP stack definitions shall not coexist!"
731# endif
732#endif
733
734/*
735 * Portable symbolic names for Winsock shutdown() mode flags.
736 */
737
738#ifdef USE_WINSOCK
739# define SHUT_RD 0x00
740# define SHUT_WR 0x01
741# define SHUT_RDWR 0x02
742#endif
743
744/* Define S_ISREG if not defined by system headers, f.e. MSVC */
745#if !defined(S_ISREG) && defined(S_IFMT) && defined(S_IFREG)
746#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
747#endif
748
749/* Define S_ISDIR if not defined by system headers, f.e. MSVC */
750#if !defined(S_ISDIR) && defined(S_IFMT) && defined(S_IFDIR)
751#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
752#endif
753
754/* In Windows the default file mode is text but an application can override it.
755Therefore we specify it explicitly. https://github.com/curl/curl/pull/258
756*/
757#if defined(WIN32) || defined(MSDOS)
758#define FOPEN_READTEXT "rt"
759#define FOPEN_WRITETEXT "wt"
760#define FOPEN_APPENDTEXT "at"
761#elif defined(__CYGWIN__)
762/* Cygwin has specific behavior we need to address when WIN32 is not defined.
763https://cygwin.com/cygwin-ug-net/using-textbinary.html
764For write we want our output to have line endings of LF and be compatible with
765other Cygwin utilities. For read we want to handle input that may have line
766endings either CRLF or LF so 't' is appropriate.
767*/
768#define FOPEN_READTEXT "rt"
769#define FOPEN_WRITETEXT "w"
770#define FOPEN_APPENDTEXT "a"
771#else
772#define FOPEN_READTEXT "r"
773#define FOPEN_WRITETEXT "w"
774#define FOPEN_APPENDTEXT "a"
775#endif
776
777/* WinSock destroys recv() buffer when send() failed.
778 * Enabled automatically for Windows and for Cygwin as Cygwin sockets are
779 * wrappers for WinSock sockets. https://github.com/curl/curl/issues/657
780 * Define DONT_USE_RECV_BEFORE_SEND_WORKAROUND to force disable workaround.
781 */
782#if !defined(DONT_USE_RECV_BEFORE_SEND_WORKAROUND)
783# if defined(WIN32) || defined(__CYGWIN__)
784# define USE_RECV_BEFORE_SEND_WORKAROUND
785# endif
786#else /* DONT_USE_RECV_BEFORE_SEND_WORKAROUND */
787# ifdef USE_RECV_BEFORE_SEND_WORKAROUND
788# undef USE_RECV_BEFORE_SEND_WORKAROUND
789# endif
790#endif /* DONT_USE_RECV_BEFORE_SEND_WORKAROUND */
791
792/* Detect Windows App environment which has a restricted access
793 * to the Win32 APIs. */
794# if (defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0602)) || \
795 defined(WINAPI_FAMILY)
796# include <winapifamily.h>
797# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && \
798 !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
799# define CURL_WINDOWS_APP
800# endif
801# endif
802
803/* for systems that don't detect this in configure, use a sensible default */
804#ifndef CURL_SA_FAMILY_T
805#define CURL_SA_FAMILY_T unsigned short
806#endif
807
808/* Some convenience macros to get the larger/smaller value out of two given.
809 We prefix with CURL to prevent name collisions. */
810#define CURLMAX(x,y) ((x)>(y)?(x):(y))
811#define CURLMIN(x,y) ((x)<(y)?(x):(y))
812
813/* Some versions of the Android SDK is missing the declaration */
814#if defined(HAVE_GETPWUID_R) && defined(HAVE_DECL_GETPWUID_R_MISSING)
815struct passwd;
816int getpwuid_r(uid_t uid, struct passwd *pwd, char *buf,
817 size_t buflen, struct passwd **result);
818#endif
819
820#ifdef DEBUGBUILD
821#define UNITTEST
822#else
823#define UNITTEST static
824#endif
825
826#if defined(USE_NGTCP2) || defined(USE_QUICHE)
827#define ENABLE_QUIC
828#endif
829
830#endif /* HEADER_CURL_SETUP_H */
831