1 #ifndef CURLINC_SYSTEM_H
2 #define CURLINC_SYSTEM_H
3 /***************************************************************************
5 * Project ___| | | | _ \| |
7 * | (__| |_| | _ <| |___
8 * \___|\___/|_| \_\_____|
10 * Copyright (C) 1998 - 2022, Daniel Stenberg, <daniel@haxx.se>, et al.
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.se/docs/copyright.html.
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.
20 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
21 * KIND, either express or implied.
23 ***************************************************************************/
26 * Try to keep one section per platform, compiler and architecture, otherwise,
27 * if an existing section is reused for a different one and later on the
28 * original is adjusted, probably the piggybacking one can be adversely
31 * In order to differentiate between platforms/compilers/architectures use
32 * only compiler built in predefined preprocessor symbols.
37 * For any given platform/compiler curl_off_t must be typedef'ed to a 64-bit
38 * wide signed integral data type. The width of this data type must remain
39 * constant and independent of any possible large file support settings.
41 * As an exception to the above, curl_off_t shall be typedef'ed to a 32-bit
42 * wide signed integral data type if there is no 64-bit type.
44 * As a general rule, curl_off_t shall not be mapped to off_t. This rule shall
45 * only be violated if off_t is the only 64-bit data type available and the
46 * size of off_t is independent of large file support settings. Keep your
47 * build on the safe side avoiding an off_t gating. If you have a 64-bit
48 * off_t then take for sure that another 64-bit data type exists, dig deeper
49 * and you will find it.
53 #if defined(__DJGPP__) || defined(__GO32__)
54 # if defined(__DJGPP__) && (__DJGPP__ > 1)
55 # define CURL_TYPEOF_CURL_OFF_T long long
56 # define CURL_FORMAT_CURL_OFF_T "lld"
57 # define CURL_FORMAT_CURL_OFF_TU "llu"
58 # define CURL_SUFFIX_CURL_OFF_T LL
59 # define CURL_SUFFIX_CURL_OFF_TU ULL
61 # define CURL_TYPEOF_CURL_OFF_T long
62 # define CURL_FORMAT_CURL_OFF_T "ld"
63 # define CURL_FORMAT_CURL_OFF_TU "lu"
64 # define CURL_SUFFIX_CURL_OFF_T L
65 # define CURL_SUFFIX_CURL_OFF_TU UL
67 # define CURL_TYPEOF_CURL_SOCKLEN_T int
69 #elif defined(__SALFORDC__)
70 # define CURL_TYPEOF_CURL_OFF_T long
71 # define CURL_FORMAT_CURL_OFF_T "ld"
72 # define CURL_FORMAT_CURL_OFF_TU "lu"
73 # define CURL_SUFFIX_CURL_OFF_T L
74 # define CURL_SUFFIX_CURL_OFF_TU UL
75 # define CURL_TYPEOF_CURL_SOCKLEN_T int
77 #elif defined(__BORLANDC__)
78 # if (__BORLANDC__ < 0x520)
79 # define CURL_TYPEOF_CURL_OFF_T long
80 # define CURL_FORMAT_CURL_OFF_T "ld"
81 # define CURL_FORMAT_CURL_OFF_TU "lu"
82 # define CURL_SUFFIX_CURL_OFF_T L
83 # define CURL_SUFFIX_CURL_OFF_TU UL
85 # define CURL_TYPEOF_CURL_OFF_T __int64
86 # define CURL_FORMAT_CURL_OFF_T "I64d"
87 # define CURL_FORMAT_CURL_OFF_TU "I64u"
88 # define CURL_SUFFIX_CURL_OFF_T i64
89 # define CURL_SUFFIX_CURL_OFF_TU ui64
91 # define CURL_TYPEOF_CURL_SOCKLEN_T int
93 #elif defined(__TURBOC__)
94 # define CURL_TYPEOF_CURL_OFF_T long
95 # define CURL_FORMAT_CURL_OFF_T "ld"
96 # define CURL_FORMAT_CURL_OFF_TU "lu"
97 # define CURL_SUFFIX_CURL_OFF_T L
98 # define CURL_SUFFIX_CURL_OFF_TU UL
99 # define CURL_TYPEOF_CURL_SOCKLEN_T int
101 #elif defined(__POCC__)
102 # if (__POCC__ < 280)
103 # define CURL_TYPEOF_CURL_OFF_T long
104 # define CURL_FORMAT_CURL_OFF_T "ld"
105 # define CURL_FORMAT_CURL_OFF_TU "lu"
106 # define CURL_SUFFIX_CURL_OFF_T L
107 # define CURL_SUFFIX_CURL_OFF_TU UL
108 # elif defined(_MSC_VER)
109 # define CURL_TYPEOF_CURL_OFF_T __int64
110 # define CURL_FORMAT_CURL_OFF_T "I64d"
111 # define CURL_FORMAT_CURL_OFF_TU "I64u"
112 # define CURL_SUFFIX_CURL_OFF_T i64
113 # define CURL_SUFFIX_CURL_OFF_TU ui64
115 # define CURL_TYPEOF_CURL_OFF_T long long
116 # define CURL_FORMAT_CURL_OFF_T "lld"
117 # define CURL_FORMAT_CURL_OFF_TU "llu"
118 # define CURL_SUFFIX_CURL_OFF_T LL
119 # define CURL_SUFFIX_CURL_OFF_TU ULL
121 # define CURL_TYPEOF_CURL_SOCKLEN_T int
123 #elif defined(__LCC__)
124 # if defined(__MCST__) /* MCST eLbrus Compiler Collection */
125 # define CURL_TYPEOF_CURL_OFF_T long
126 # define CURL_FORMAT_CURL_OFF_T "ld"
127 # define CURL_FORMAT_CURL_OFF_TU "lu"
128 # define CURL_SUFFIX_CURL_OFF_T L
129 # define CURL_SUFFIX_CURL_OFF_TU UL
130 # define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
131 # define CURL_PULL_SYS_TYPES_H 1
132 # define CURL_PULL_SYS_SOCKET_H 1
133 # else /* Local (or Little) C Compiler */
134 # define CURL_TYPEOF_CURL_OFF_T long
135 # define CURL_FORMAT_CURL_OFF_T "ld"
136 # define CURL_FORMAT_CURL_OFF_TU "lu"
137 # define CURL_SUFFIX_CURL_OFF_T L
138 # define CURL_SUFFIX_CURL_OFF_TU UL
139 # define CURL_TYPEOF_CURL_SOCKLEN_T int
142 #elif defined(__SYMBIAN32__)
143 # if defined(__EABI__) /* Treat all ARM compilers equally */
144 # define CURL_TYPEOF_CURL_OFF_T long long
145 # define CURL_FORMAT_CURL_OFF_T "lld"
146 # define CURL_FORMAT_CURL_OFF_TU "llu"
147 # define CURL_SUFFIX_CURL_OFF_T LL
148 # define CURL_SUFFIX_CURL_OFF_TU ULL
149 # elif defined(__CW32__)
151 # define CURL_TYPEOF_CURL_OFF_T long long
152 # define CURL_FORMAT_CURL_OFF_T "lld"
153 # define CURL_FORMAT_CURL_OFF_TU "llu"
154 # define CURL_SUFFIX_CURL_OFF_T LL
155 # define CURL_SUFFIX_CURL_OFF_TU ULL
156 # elif defined(__VC32__)
157 # define CURL_TYPEOF_CURL_OFF_T __int64
158 # define CURL_FORMAT_CURL_OFF_T "lld"
159 # define CURL_FORMAT_CURL_OFF_TU "llu"
160 # define CURL_SUFFIX_CURL_OFF_T LL
161 # define CURL_SUFFIX_CURL_OFF_TU ULL
163 # define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int
165 #elif defined(__MWERKS__)
166 # define CURL_TYPEOF_CURL_OFF_T long long
167 # define CURL_FORMAT_CURL_OFF_T "lld"
168 # define CURL_FORMAT_CURL_OFF_TU "llu"
169 # define CURL_SUFFIX_CURL_OFF_T LL
170 # define CURL_SUFFIX_CURL_OFF_TU ULL
171 # define CURL_TYPEOF_CURL_SOCKLEN_T int
173 #elif defined(_WIN32_WCE)
174 # define CURL_TYPEOF_CURL_OFF_T __int64
175 # define CURL_FORMAT_CURL_OFF_T "I64d"
176 # define CURL_FORMAT_CURL_OFF_TU "I64u"
177 # define CURL_SUFFIX_CURL_OFF_T i64
178 # define CURL_SUFFIX_CURL_OFF_TU ui64
179 # define CURL_TYPEOF_CURL_SOCKLEN_T int
181 #elif defined(__MINGW32__)
182 # define CURL_TYPEOF_CURL_OFF_T long long
183 # define CURL_FORMAT_CURL_OFF_T "I64d"
184 # define CURL_FORMAT_CURL_OFF_TU "I64u"
185 # define CURL_SUFFIX_CURL_OFF_T LL
186 # define CURL_SUFFIX_CURL_OFF_TU ULL
187 # define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
188 # define CURL_PULL_SYS_TYPES_H 1
189 # define CURL_PULL_WS2TCPIP_H 1
193 # define CURL_TYPEOF_CURL_OFF_T long
194 # define CURL_FORMAT_CURL_OFF_T "ld"
195 # define CURL_FORMAT_CURL_OFF_TU "lu"
196 # define CURL_SUFFIX_CURL_OFF_T L
197 # define CURL_SUFFIX_CURL_OFF_TU UL
199 # define CURL_TYPEOF_CURL_OFF_T long long
200 # define CURL_FORMAT_CURL_OFF_T "lld"
201 # define CURL_FORMAT_CURL_OFF_TU "llu"
202 # define CURL_SUFFIX_CURL_OFF_T LL
203 # define CURL_SUFFIX_CURL_OFF_TU ULL
205 # define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int
207 #elif defined(__OS400__)
208 # if defined(__ILEC400__)
209 # define CURL_TYPEOF_CURL_OFF_T long long
210 # define CURL_FORMAT_CURL_OFF_T "lld"
211 # define CURL_FORMAT_CURL_OFF_TU "llu"
212 # define CURL_SUFFIX_CURL_OFF_T LL
213 # define CURL_SUFFIX_CURL_OFF_TU ULL
214 # define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
215 # define CURL_PULL_SYS_TYPES_H 1
216 # define CURL_PULL_SYS_SOCKET_H 1
219 #elif defined(__MVS__)
220 # if defined(__IBMC__) || defined(__IBMCPP__)
222 # elif defined(_LP64)
224 # if defined(_LONG_LONG)
225 # define CURL_TYPEOF_CURL_OFF_T long long
226 # define CURL_FORMAT_CURL_OFF_T "lld"
227 # define CURL_FORMAT_CURL_OFF_TU "llu"
228 # define CURL_SUFFIX_CURL_OFF_T LL
229 # define CURL_SUFFIX_CURL_OFF_TU ULL
230 # elif defined(_LP64)
231 # define CURL_TYPEOF_CURL_OFF_T long
232 # define CURL_FORMAT_CURL_OFF_T "ld"
233 # define CURL_FORMAT_CURL_OFF_TU "lu"
234 # define CURL_SUFFIX_CURL_OFF_T L
235 # define CURL_SUFFIX_CURL_OFF_TU UL
237 # define CURL_TYPEOF_CURL_OFF_T long
238 # define CURL_FORMAT_CURL_OFF_T "ld"
239 # define CURL_FORMAT_CURL_OFF_TU "lu"
240 # define CURL_SUFFIX_CURL_OFF_T L
241 # define CURL_SUFFIX_CURL_OFF_TU UL
243 # define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
244 # define CURL_PULL_SYS_TYPES_H 1
245 # define CURL_PULL_SYS_SOCKET_H 1
248 #elif defined(__370__)
249 # if defined(__IBMC__) || defined(__IBMCPP__)
251 # elif defined(_LP64)
253 # if defined(_LONG_LONG)
254 # define CURL_TYPEOF_CURL_OFF_T long long
255 # define CURL_FORMAT_CURL_OFF_T "lld"
256 # define CURL_FORMAT_CURL_OFF_TU "llu"
257 # define CURL_SUFFIX_CURL_OFF_T LL
258 # define CURL_SUFFIX_CURL_OFF_TU ULL
259 # elif defined(_LP64)
260 # define CURL_TYPEOF_CURL_OFF_T long
261 # define CURL_FORMAT_CURL_OFF_T "ld"
262 # define CURL_FORMAT_CURL_OFF_TU "lu"
263 # define CURL_SUFFIX_CURL_OFF_T L
264 # define CURL_SUFFIX_CURL_OFF_TU UL
266 # define CURL_TYPEOF_CURL_OFF_T long
267 # define CURL_FORMAT_CURL_OFF_T "ld"
268 # define CURL_FORMAT_CURL_OFF_TU "lu"
269 # define CURL_SUFFIX_CURL_OFF_T L
270 # define CURL_SUFFIX_CURL_OFF_TU UL
272 # define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
273 # define CURL_PULL_SYS_TYPES_H 1
274 # define CURL_PULL_SYS_SOCKET_H 1
278 # define CURL_TYPEOF_CURL_OFF_T long
279 # define CURL_FORMAT_CURL_OFF_T "ld"
280 # define CURL_FORMAT_CURL_OFF_TU "lu"
281 # define CURL_SUFFIX_CURL_OFF_T L
282 # define CURL_SUFFIX_CURL_OFF_TU UL
283 # define CURL_TYPEOF_CURL_SOCKLEN_T int
285 #elif defined(__TINYC__) /* also known as tcc */
286 # define CURL_TYPEOF_CURL_OFF_T long long
287 # define CURL_FORMAT_CURL_OFF_T "lld"
288 # define CURL_FORMAT_CURL_OFF_TU "llu"
289 # define CURL_SUFFIX_CURL_OFF_T LL
290 # define CURL_SUFFIX_CURL_OFF_TU ULL
291 # define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
292 # define CURL_PULL_SYS_TYPES_H 1
293 # define CURL_PULL_SYS_SOCKET_H 1
295 #elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) /* Oracle Solaris Studio */
296 # if !defined(__LP64) && (defined(__ILP32) || \
298 defined(__sparcv8) || \
299 defined(__sparcv8plus))
300 # define CURL_TYPEOF_CURL_OFF_T long long
301 # define CURL_FORMAT_CURL_OFF_T "lld"
302 # define CURL_FORMAT_CURL_OFF_TU "llu"
303 # define CURL_SUFFIX_CURL_OFF_T LL
304 # define CURL_SUFFIX_CURL_OFF_TU ULL
305 # elif defined(__LP64) || \
306 defined(__amd64) || defined(__sparcv9)
307 # define CURL_TYPEOF_CURL_OFF_T long
308 # define CURL_FORMAT_CURL_OFF_T "ld"
309 # define CURL_FORMAT_CURL_OFF_TU "lu"
310 # define CURL_SUFFIX_CURL_OFF_T L
311 # define CURL_SUFFIX_CURL_OFF_TU UL
313 # define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
314 # define CURL_PULL_SYS_TYPES_H 1
315 # define CURL_PULL_SYS_SOCKET_H 1
317 #elif defined(__xlc__) /* IBM xlc compiler */
319 # define CURL_TYPEOF_CURL_OFF_T long long
320 # define CURL_FORMAT_CURL_OFF_T "lld"
321 # define CURL_FORMAT_CURL_OFF_TU "llu"
322 # define CURL_SUFFIX_CURL_OFF_T LL
323 # define CURL_SUFFIX_CURL_OFF_TU ULL
325 # define CURL_TYPEOF_CURL_OFF_T long
326 # define CURL_FORMAT_CURL_OFF_T "ld"
327 # define CURL_FORMAT_CURL_OFF_TU "lu"
328 # define CURL_SUFFIX_CURL_OFF_T L
329 # define CURL_SUFFIX_CURL_OFF_TU UL
331 # define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
332 # define CURL_PULL_SYS_TYPES_H 1
333 # define CURL_PULL_SYS_SOCKET_H 1
335 /* ===================================== */
336 /* KEEP MSVC THE PENULTIMATE ENTRY */
337 /* ===================================== */
339 #elif defined(_MSC_VER)
340 # if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64)
341 # define CURL_TYPEOF_CURL_OFF_T __int64
342 # define CURL_FORMAT_CURL_OFF_T "I64d"
343 # define CURL_FORMAT_CURL_OFF_TU "I64u"
344 # define CURL_SUFFIX_CURL_OFF_T i64
345 # define CURL_SUFFIX_CURL_OFF_TU ui64
347 # define CURL_TYPEOF_CURL_OFF_T long
348 # define CURL_FORMAT_CURL_OFF_T "ld"
349 # define CURL_FORMAT_CURL_OFF_TU "lu"
350 # define CURL_SUFFIX_CURL_OFF_T L
351 # define CURL_SUFFIX_CURL_OFF_TU UL
353 # define CURL_TYPEOF_CURL_SOCKLEN_T int
355 /* ===================================== */
356 /* KEEP GENERIC GCC THE LAST ENTRY */
357 /* ===================================== */
359 #elif defined(__GNUC__) && !defined(_SCO_DS)
360 # if !defined(__LP64__) && \
361 (defined(__ILP32__) || defined(__i386__) || defined(__hppa__) || \
362 defined(__ppc__) || defined(__powerpc__) || defined(__arm__) || \
363 defined(__sparc__) || defined(__mips__) || defined(__sh__) || \
364 defined(__XTENSA__) || \
365 (defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 4) || \
366 (defined(__LONG_MAX__) && __LONG_MAX__ == 2147483647L))
367 # define CURL_TYPEOF_CURL_OFF_T long long
368 # define CURL_FORMAT_CURL_OFF_T "lld"
369 # define CURL_FORMAT_CURL_OFF_TU "llu"
370 # define CURL_SUFFIX_CURL_OFF_T LL
371 # define CURL_SUFFIX_CURL_OFF_TU ULL
372 # elif defined(__LP64__) || \
373 defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) || \
374 defined(__e2k__) || \
375 (defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 8) || \
376 (defined(__LONG_MAX__) && __LONG_MAX__ == 9223372036854775807L)
377 # define CURL_TYPEOF_CURL_OFF_T long
378 # define CURL_FORMAT_CURL_OFF_T "ld"
379 # define CURL_FORMAT_CURL_OFF_TU "lu"
380 # define CURL_SUFFIX_CURL_OFF_T L
381 # define CURL_SUFFIX_CURL_OFF_TU UL
383 # define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
384 # define CURL_PULL_SYS_TYPES_H 1
385 # define CURL_PULL_SYS_SOCKET_H 1
388 /* generic "safe guess" on old 32 bit style */
389 # define CURL_TYPEOF_CURL_OFF_T long
390 # define CURL_FORMAT_CURL_OFF_T "ld"
391 # define CURL_FORMAT_CURL_OFF_TU "lu"
392 # define CURL_SUFFIX_CURL_OFF_T L
393 # define CURL_SUFFIX_CURL_OFF_TU UL
394 # define CURL_TYPEOF_CURL_SOCKLEN_T int
398 /* AIX needs <sys/poll.h> */
399 #define CURL_PULL_SYS_POLL_H
403 /* CURL_PULL_WS2TCPIP_H is defined above when inclusion of header file */
404 /* ws2tcpip.h is required here to properly make type definitions below. */
405 #ifdef CURL_PULL_WS2TCPIP_H
406 # include <winsock2.h>
407 # include <windows.h>
408 # include <ws2tcpip.h>
411 /* CURL_PULL_SYS_TYPES_H is defined above when inclusion of header file */
412 /* sys/types.h is required here to properly make type definitions below. */
413 #ifdef CURL_PULL_SYS_TYPES_H
414 # include <sys/types.h>
417 /* CURL_PULL_SYS_SOCKET_H is defined above when inclusion of header file */
418 /* sys/socket.h is required here to properly make type definitions below. */
419 #ifdef CURL_PULL_SYS_SOCKET_H
420 # include <sys/socket.h>
423 /* CURL_PULL_SYS_POLL_H is defined above when inclusion of header file */
424 /* sys/poll.h is required here to properly make type definitions below. */
425 #ifdef CURL_PULL_SYS_POLL_H
426 # include <sys/poll.h>
429 /* Data type definition of curl_socklen_t. */
430 #ifdef CURL_TYPEOF_CURL_SOCKLEN_T
431 typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t;
434 /* Data type definition of curl_off_t. */
436 #ifdef CURL_TYPEOF_CURL_OFF_T
437 typedef CURL_TYPEOF_CURL_OFF_T curl_off_t;
441 * CURL_ISOCPP and CURL_OFF_T_C definitions are done here in order to allow
442 * these to be visible and exported by the external libcurl interface API,
443 * while also making them visible to the library internals, simply including
444 * curl_setup.h, without actually needing to include curl.h internally.
445 * If some day this section would grow big enough, all this should be moved
446 * to its own header file.
450 * Figure out if we can use the ## preprocessor operator, which is supported
451 * by ISO/ANSI C and C++. Some compilers support it without setting __STDC__
452 * or __cplusplus so we need to carefully check for them too.
455 #if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \
456 defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) || \
457 defined(__POCC__) || defined(__SALFORDC__) || defined(__HIGHC__) || \
459 /* This compiler is believed to have an ISO compatible preprocessor */
462 /* This compiler is believed NOT to have an ISO compatible preprocessor */
467 * Macros for minimum-width signed and unsigned curl_off_t integer constants.
470 #if defined(__BORLANDC__) && (__BORLANDC__ == 0x0551)
471 # define CURLINC_OFF_T_C_HLPR2(x) x
472 # define CURLINC_OFF_T_C_HLPR1(x) CURLINC_OFF_T_C_HLPR2(x)
473 # define CURL_OFF_T_C(Val) CURLINC_OFF_T_C_HLPR1(Val) ## \
474 CURLINC_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T)
475 # define CURL_OFF_TU_C(Val) CURLINC_OFF_T_C_HLPR1(Val) ## \
476 CURLINC_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU)
479 # define CURLINC_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix
481 # define CURLINC_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix
483 # define CURLINC_OFF_T_C_HLPR1(Val,Suffix) CURLINC_OFF_T_C_HLPR2(Val,Suffix)
484 # define CURL_OFF_T_C(Val) CURLINC_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T)
485 # define CURL_OFF_TU_C(Val) CURLINC_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU)
488 #endif /* CURLINC_SYSTEM_H */