1 #ifndef __CURL_SYSTEM_H
2 #define __CURL_SYSTEM_H
3 /***************************************************************************
5 * Project ___| | | | _ \| |
7 * | (__| |_| | _ <| |___
8 * \___|\___/|_| \_\_____|
10 * Copyright (C) 1998 - 2017, 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.haxx.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(__WATCOMC__)
102 # if defined(__386__)
103 # define CURL_TYPEOF_CURL_OFF_T __int64
104 # define CURL_FORMAT_CURL_OFF_T "I64d"
105 # define CURL_FORMAT_CURL_OFF_TU "I64u"
106 # define CURL_SUFFIX_CURL_OFF_T i64
107 # define CURL_SUFFIX_CURL_OFF_TU ui64
109 # define CURL_TYPEOF_CURL_OFF_T long
110 # define CURL_FORMAT_CURL_OFF_T "ld"
111 # define CURL_FORMAT_CURL_OFF_TU "lu"
112 # define CURL_SUFFIX_CURL_OFF_T L
113 # define CURL_SUFFIX_CURL_OFF_TU UL
115 # define CURL_TYPEOF_CURL_SOCKLEN_T int
117 #elif defined(__POCC__)
118 # if (__POCC__ < 280)
119 # define CURL_TYPEOF_CURL_OFF_T long
120 # define CURL_FORMAT_CURL_OFF_T "ld"
121 # define CURL_FORMAT_CURL_OFF_TU "lu"
122 # define CURL_SUFFIX_CURL_OFF_T L
123 # define CURL_SUFFIX_CURL_OFF_TU UL
124 # elif defined(_MSC_VER)
125 # define CURL_TYPEOF_CURL_OFF_T __int64
126 # define CURL_FORMAT_CURL_OFF_T "I64d"
127 # define CURL_FORMAT_CURL_OFF_TU "I64u"
128 # define CURL_SUFFIX_CURL_OFF_T i64
129 # define CURL_SUFFIX_CURL_OFF_TU ui64
131 # define CURL_TYPEOF_CURL_OFF_T long long
132 # define CURL_FORMAT_CURL_OFF_T "lld"
133 # define CURL_FORMAT_CURL_OFF_TU "llu"
134 # define CURL_SUFFIX_CURL_OFF_T LL
135 # define CURL_SUFFIX_CURL_OFF_TU ULL
137 # define CURL_TYPEOF_CURL_SOCKLEN_T int
139 #elif defined(__LCC__)
140 # define CURL_TYPEOF_CURL_OFF_T long
141 # define CURL_FORMAT_CURL_OFF_T "ld"
142 # define CURL_FORMAT_CURL_OFF_TU "lu"
143 # define CURL_SUFFIX_CURL_OFF_T L
144 # define CURL_SUFFIX_CURL_OFF_TU UL
145 # define CURL_TYPEOF_CURL_SOCKLEN_T int
147 #elif defined(__SYMBIAN32__)
148 # if defined(__EABI__) /* Treat all ARM compilers equally */
149 # define CURL_TYPEOF_CURL_OFF_T long long
150 # define CURL_FORMAT_CURL_OFF_T "lld"
151 # define CURL_FORMAT_CURL_OFF_TU "llu"
152 # define CURL_SUFFIX_CURL_OFF_T LL
153 # define CURL_SUFFIX_CURL_OFF_TU ULL
154 # elif defined(__CW32__)
156 # define CURL_TYPEOF_CURL_OFF_T long long
157 # define CURL_FORMAT_CURL_OFF_T "lld"
158 # define CURL_FORMAT_CURL_OFF_TU "llu"
159 # define CURL_SUFFIX_CURL_OFF_T LL
160 # define CURL_SUFFIX_CURL_OFF_TU ULL
161 # elif defined(__VC32__)
162 # define CURL_TYPEOF_CURL_OFF_T __int64
163 # define CURL_FORMAT_CURL_OFF_T "lld"
164 # define CURL_FORMAT_CURL_OFF_TU "llu"
165 # define CURL_SUFFIX_CURL_OFF_T LL
166 # define CURL_SUFFIX_CURL_OFF_TU ULL
168 # define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int
170 #elif defined(__MWERKS__)
171 # define CURL_TYPEOF_CURL_OFF_T long long
172 # define CURL_FORMAT_CURL_OFF_T "lld"
173 # define CURL_FORMAT_CURL_OFF_TU "llu"
174 # define CURL_SUFFIX_CURL_OFF_T LL
175 # define CURL_SUFFIX_CURL_OFF_TU ULL
176 # define CURL_TYPEOF_CURL_SOCKLEN_T int
178 #elif defined(_WIN32_WCE)
179 # define CURL_TYPEOF_CURL_OFF_T __int64
180 # define CURL_FORMAT_CURL_OFF_T "I64d"
181 # define CURL_FORMAT_CURL_OFF_TU "I64u"
182 # define CURL_SUFFIX_CURL_OFF_T i64
183 # define CURL_SUFFIX_CURL_OFF_TU ui64
184 # define CURL_TYPEOF_CURL_SOCKLEN_T int
186 #elif defined(__MINGW32__)
187 # define CURL_TYPEOF_CURL_OFF_T long long
188 # define CURL_FORMAT_CURL_OFF_T "I64d"
189 # define CURL_FORMAT_CURL_OFF_TU "I64u"
190 # define CURL_SUFFIX_CURL_OFF_T LL
191 # define CURL_SUFFIX_CURL_OFF_TU ULL
192 # define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
193 # define CURL_PULL_SYS_TYPES_H 1
194 # define CURL_PULL_WS2TCPIP_H 1
198 # define CURL_TYPEOF_CURL_OFF_T long
199 # define CURL_FORMAT_CURL_OFF_T "ld"
200 # define CURL_FORMAT_CURL_OFF_TU "lu"
201 # define CURL_SUFFIX_CURL_OFF_T L
202 # define CURL_SUFFIX_CURL_OFF_TU UL
204 # define CURL_TYPEOF_CURL_OFF_T long long
205 # define CURL_FORMAT_CURL_OFF_T "lld"
206 # define CURL_FORMAT_CURL_OFF_TU "llu"
207 # define CURL_SUFFIX_CURL_OFF_T LL
208 # define CURL_SUFFIX_CURL_OFF_TU ULL
210 # define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int
212 #elif defined(__OS400__)
213 # if defined(__ILEC400__)
214 # define CURL_TYPEOF_CURL_OFF_T long long
215 # define CURL_FORMAT_CURL_OFF_T "lld"
216 # define CURL_FORMAT_CURL_OFF_TU "llu"
217 # define CURL_SUFFIX_CURL_OFF_T LL
218 # define CURL_SUFFIX_CURL_OFF_TU ULL
219 # define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
220 # define CURL_PULL_SYS_TYPES_H 1
221 # define CURL_PULL_SYS_SOCKET_H 1
224 #elif defined(__MVS__)
225 # if defined(__IBMC__) || defined(__IBMCPP__)
227 # elif defined(_LP64)
229 # if defined(_LONG_LONG)
230 # define CURL_TYPEOF_CURL_OFF_T long long
231 # define CURL_FORMAT_CURL_OFF_T "lld"
232 # define CURL_FORMAT_CURL_OFF_TU "llu"
233 # define CURL_SUFFIX_CURL_OFF_T LL
234 # define CURL_SUFFIX_CURL_OFF_TU ULL
235 # elif defined(_LP64)
236 # define CURL_TYPEOF_CURL_OFF_T long
237 # define CURL_FORMAT_CURL_OFF_T "ld"
238 # define CURL_FORMAT_CURL_OFF_TU "lu"
239 # define CURL_SUFFIX_CURL_OFF_T L
240 # define CURL_SUFFIX_CURL_OFF_TU UL
242 # define CURL_TYPEOF_CURL_OFF_T long
243 # define CURL_FORMAT_CURL_OFF_T "ld"
244 # define CURL_FORMAT_CURL_OFF_TU "lu"
245 # define CURL_SUFFIX_CURL_OFF_T L
246 # define CURL_SUFFIX_CURL_OFF_TU UL
248 # define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
249 # define CURL_PULL_SYS_TYPES_H 1
250 # define CURL_PULL_SYS_SOCKET_H 1
253 #elif defined(__370__)
254 # if defined(__IBMC__) || defined(__IBMCPP__)
256 # elif defined(_LP64)
258 # if defined(_LONG_LONG)
259 # define CURL_TYPEOF_CURL_OFF_T long long
260 # define CURL_FORMAT_CURL_OFF_T "lld"
261 # define CURL_FORMAT_CURL_OFF_TU "llu"
262 # define CURL_SUFFIX_CURL_OFF_T LL
263 # define CURL_SUFFIX_CURL_OFF_TU ULL
264 # elif defined(_LP64)
265 # define CURL_TYPEOF_CURL_OFF_T long
266 # define CURL_FORMAT_CURL_OFF_T "ld"
267 # define CURL_FORMAT_CURL_OFF_TU "lu"
268 # define CURL_SUFFIX_CURL_OFF_T L
269 # define CURL_SUFFIX_CURL_OFF_TU UL
271 # define CURL_TYPEOF_CURL_OFF_T long
272 # define CURL_FORMAT_CURL_OFF_T "ld"
273 # define CURL_FORMAT_CURL_OFF_TU "lu"
274 # define CURL_SUFFIX_CURL_OFF_T L
275 # define CURL_SUFFIX_CURL_OFF_TU UL
277 # define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
278 # define CURL_PULL_SYS_TYPES_H 1
279 # define CURL_PULL_SYS_SOCKET_H 1
283 # define CURL_TYPEOF_CURL_OFF_T long
284 # define CURL_FORMAT_CURL_OFF_T "ld"
285 # define CURL_FORMAT_CURL_OFF_TU "lu"
286 # define CURL_SUFFIX_CURL_OFF_T L
287 # define CURL_SUFFIX_CURL_OFF_TU UL
288 # define CURL_TYPEOF_CURL_SOCKLEN_T int
290 #elif defined(__TINYC__) /* also known as tcc */
292 # define CURL_TYPEOF_CURL_OFF_T long long
293 # define CURL_FORMAT_CURL_OFF_T "lld"
294 # define CURL_FORMAT_CURL_OFF_TU "llu"
295 # define CURL_SUFFIX_CURL_OFF_T LL
296 # define CURL_SUFFIX_CURL_OFF_TU ULL
297 # define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
298 # define CURL_PULL_SYS_TYPES_H 1
299 # define CURL_PULL_SYS_SOCKET_H 1
301 #elif defined(__SUNPRO_C) /* Oracle Solaris Studio */
302 # if !defined(__LP64) && (defined(__ILP32) || \
303 defined(__i386) || defined(__sparcv8))
304 # define CURL_TYPEOF_CURL_OFF_T long long
305 # define CURL_FORMAT_CURL_OFF_T "lld"
306 # define CURL_FORMAT_CURL_OFF_TU "llu"
307 # define CURL_SUFFIX_CURL_OFF_T LL
308 # define CURL_SUFFIX_CURL_OFF_TU ULL
309 # elif defined(__LP64) || \
310 defined(__amd64) || defined(__sparcv9)
311 # define CURL_TYPEOF_CURL_OFF_T long
312 # define CURL_FORMAT_CURL_OFF_T "ld"
313 # define CURL_FORMAT_CURL_OFF_TU "lu"
314 # define CURL_SUFFIX_CURL_OFF_T L
315 # define CURL_SUFFIX_CURL_OFF_TU UL
317 # define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
318 # define CURL_PULL_SYS_TYPES_H 1
319 # define CURL_PULL_SYS_SOCKET_H 1
321 /* ===================================== */
322 /* KEEP MSVC THE PENULTIMATE ENTRY */
323 /* ===================================== */
325 #elif defined(_MSC_VER)
326 # if (_MSC_VER >= 900) && (_INTEGRAL_MAX_BITS >= 64)
327 # define CURL_TYPEOF_CURL_OFF_T __int64
328 # define CURL_FORMAT_CURL_OFF_T "I64d"
329 # define CURL_FORMAT_CURL_OFF_TU "I64u"
330 # define CURL_SUFFIX_CURL_OFF_T i64
331 # define CURL_SUFFIX_CURL_OFF_TU ui64
333 # define CURL_TYPEOF_CURL_OFF_T long
334 # define CURL_FORMAT_CURL_OFF_T "ld"
335 # define CURL_FORMAT_CURL_OFF_TU "lu"
336 # define CURL_SUFFIX_CURL_OFF_T L
337 # define CURL_SUFFIX_CURL_OFF_TU UL
339 # define CURL_TYPEOF_CURL_SOCKLEN_T int
341 /* ===================================== */
342 /* KEEP GENERIC GCC THE LAST ENTRY */
343 /* ===================================== */
345 #elif defined(__GNUC__)
346 # if !defined(__LP64__) && \
347 (defined(__ILP32__) || defined(__i386__) || defined(__hppa__) || \
348 defined(__ppc__) || defined(__powerpc__) || defined(__arm__) || \
349 defined(__sparc__) || defined(__mips__) || defined(__sh__) || \
350 defined(__XTENSA__) || \
351 (defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 4) || \
352 (defined(__LONG_MAX__) && __LONG_MAX__ == 2147483647L))
353 # define CURL_TYPEOF_CURL_OFF_T long long
354 # define CURL_FORMAT_CURL_OFF_T "lld"
355 # define CURL_FORMAT_CURL_OFF_TU "llu"
356 # define CURL_SUFFIX_CURL_OFF_T LL
357 # define CURL_SUFFIX_CURL_OFF_TU ULL
358 # elif defined(__LP64__) || \
359 defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) || \
360 (defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 8) || \
361 (defined(__LONG_MAX__) && __LONG_MAX__ == 9223372036854775807L)
362 # define CURL_TYPEOF_CURL_OFF_T long
363 # define CURL_FORMAT_CURL_OFF_T "ld"
364 # define CURL_FORMAT_CURL_OFF_TU "lu"
365 # define CURL_SUFFIX_CURL_OFF_T L
366 # define CURL_SUFFIX_CURL_OFF_TU UL
368 # define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
369 # define CURL_PULL_SYS_TYPES_H 1
370 # define CURL_PULL_SYS_SOCKET_H 1
373 /* generic "safe guess" on old 32 bit style */
374 # define CURL_TYPEOF_CURL_OFF_T long
375 # define CURL_FORMAT_CURL_OFF_T "ld"
376 # define CURL_FORMAT_CURL_OFF_TU "lu"
377 # define CURL_SUFFIX_CURL_OFF_T L
378 # define CURL_SUFFIX_CURL_OFF_TU UL
379 # define CURL_TYPEOF_CURL_SOCKLEN_T int
383 /* AIX needs <sys/poll.h> */
384 #define CURL_PULL_SYS_POLL_H
388 /* CURL_PULL_WS2TCPIP_H is defined above when inclusion of header file */
389 /* ws2tcpip.h is required here to properly make type definitions below. */
390 #ifdef CURL_PULL_WS2TCPIP_H
391 # include <winsock2.h>
392 # include <windows.h>
393 # include <ws2tcpip.h>
396 /* CURL_PULL_SYS_TYPES_H is defined above when inclusion of header file */
397 /* sys/types.h is required here to properly make type definitions below. */
398 #ifdef CURL_PULL_SYS_TYPES_H
399 # include <sys/types.h>
402 /* CURL_PULL_SYS_SOCKET_H is defined above when inclusion of header file */
403 /* sys/socket.h is required here to properly make type definitions below. */
404 #ifdef CURL_PULL_SYS_SOCKET_H
405 # include <sys/socket.h>
408 /* CURL_PULL_SYS_POLL_H is defined above when inclusion of header file */
409 /* sys/poll.h is required here to properly make type definitions below. */
410 #ifdef CURL_PULL_SYS_POLL_H
411 # include <sys/poll.h>
414 /* Data type definition of curl_socklen_t. */
415 #ifdef CURL_TYPEOF_CURL_SOCKLEN_T
416 typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t;
419 /* Data type definition of curl_off_t. */
421 #ifdef CURL_TYPEOF_CURL_OFF_T
422 typedef CURL_TYPEOF_CURL_OFF_T curl_off_t;
426 * CURL_ISOCPP and CURL_OFF_T_C definitions are done here in order to allow
427 * these to be visible and exported by the external libcurl interface API,
428 * while also making them visible to the library internals, simply including
429 * curl_setup.h, without actually needing to include curl.h internally.
430 * If some day this section would grow big enough, all this should be moved
431 * to its own header file.
435 * Figure out if we can use the ## preprocessor operator, which is supported
436 * by ISO/ANSI C and C++. Some compilers support it without setting __STDC__
437 * or __cplusplus so we need to carefully check for them too.
440 #if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \
441 defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) || \
442 defined(__POCC__) || defined(__SALFORDC__) || defined(__HIGHC__) || \
444 /* This compiler is believed to have an ISO compatible preprocessor */
447 /* This compiler is believed NOT to have an ISO compatible preprocessor */
452 * Macros for minimum-width signed and unsigned curl_off_t integer constants.
455 #if defined(__BORLANDC__) && (__BORLANDC__ == 0x0551)
456 # define __CURL_OFF_T_C_HLPR2(x) x
457 # define __CURL_OFF_T_C_HLPR1(x) __CURL_OFF_T_C_HLPR2(x)
458 # define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \
459 __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T)
460 # define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \
461 __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU)
464 # define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix
466 # define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix
468 # define __CURL_OFF_T_C_HLPR1(Val,Suffix) __CURL_OFF_T_C_HLPR2(Val,Suffix)
469 # define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T)
470 # define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU)
473 #endif /* __CURL_SYSTEM_H */