1#ifndef CURLINC_SYSTEM_H
2#define CURLINC_SYSTEM_H
3/***************************************************************************
4 * _ _ ____ _
5 * Project ___| | | | _ \| |
6 * / __| | | | |_) | |
7 * | (__| |_| | _ <| |___
8 * \___|\___/|_| \_\_____|
9 *
10 * Copyright (C) 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.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 * SPDX-License-Identifier: curl
24 *
25 ***************************************************************************/
26
27/*
28 * Try to keep one section per platform, compiler and architecture, otherwise,
29 * if an existing section is reused for a different one and later on the
30 * original is adjusted, probably the piggybacking one can be adversely
31 * changed.
32 *
33 * In order to differentiate between platforms/compilers/architectures use
34 * only compiler built-in predefined preprocessor symbols.
35 *
36 * curl_off_t
37 * ----------
38 *
39 * For any given platform/compiler curl_off_t MUST be typedef'ed to a 64-bit
40 * wide signed integral data type. The width of this data type must remain
41 * constant and independent of any possible large file support settings.
42 *
43 * As a general rule, curl_off_t shall not be mapped to off_t. This rule shall
44 * only be violated if off_t is the only 64-bit data type available and the
45 * size of off_t is independent of large file support settings. Keep your
46 * build on the safe side avoiding an off_t gating. If you have a 64-bit
47 * off_t then take for sure that another 64-bit data type exists, dig deeper
48 * and you will find it.
49 *
50 */
51
52#ifdef __DJGPP__
53# define CURL_TYPEOF_CURL_OFF_T long long
54# define CURL_FORMAT_CURL_OFF_T "lld"
55# define CURL_FORMAT_CURL_OFF_TU "llu"
56# define CURL_SUFFIX_CURL_OFF_T LL
57# define CURL_SUFFIX_CURL_OFF_TU ULL
58# define CURL_TYPEOF_CURL_SOCKLEN_T int
59
60#elif defined(__BORLANDC__)
61# define CURL_TYPEOF_CURL_OFF_T __int64
62# define CURL_FORMAT_CURL_OFF_T "I64d"
63# define CURL_FORMAT_CURL_OFF_TU "I64u"
64# define CURL_SUFFIX_CURL_OFF_T i64
65# define CURL_SUFFIX_CURL_OFF_TU ui64
66# define CURL_TYPEOF_CURL_SOCKLEN_T int
67
68#elif defined(__POCC__)
69# ifdef _MSC_VER
70# define CURL_TYPEOF_CURL_OFF_T __int64
71# define CURL_FORMAT_CURL_OFF_T "I64d"
72# define CURL_FORMAT_CURL_OFF_TU "I64u"
73# define CURL_SUFFIX_CURL_OFF_T i64
74# define CURL_SUFFIX_CURL_OFF_TU ui64
75# else
76# define CURL_TYPEOF_CURL_OFF_T long long
77# define CURL_FORMAT_CURL_OFF_T "lld"
78# define CURL_FORMAT_CURL_OFF_TU "llu"
79# define CURL_SUFFIX_CURL_OFF_T LL
80# define CURL_SUFFIX_CURL_OFF_TU ULL
81# endif
82# define CURL_TYPEOF_CURL_SOCKLEN_T int
83
84#elif defined(__LCC__)
85# ifdef __MCST__ /* MCST eLbrus Compiler Collection */
86# define CURL_TYPEOF_CURL_OFF_T long
87# define CURL_FORMAT_CURL_OFF_T "ld"
88# define CURL_FORMAT_CURL_OFF_TU "lu"
89# define CURL_SUFFIX_CURL_OFF_T L
90# define CURL_SUFFIX_CURL_OFF_TU UL
91# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
92# define CURL_PULL_SYS_TYPES_H 1
93# define CURL_PULL_SYS_SOCKET_H 1
94# else /* Local (or Little) C Compiler */
95# define CURL_TYPEOF_CURL_OFF_T long
96# define CURL_FORMAT_CURL_OFF_T "ld"
97# define CURL_FORMAT_CURL_OFF_TU "lu"
98# define CURL_SUFFIX_CURL_OFF_T L
99# define CURL_SUFFIX_CURL_OFF_TU UL
100# define CURL_TYPEOF_CURL_SOCKLEN_T int
101# endif
102
103#elif defined(macintosh)
104# include <ConditionalMacros.h>
105# if TYPE_LONGLONG
106# define CURL_TYPEOF_CURL_OFF_T long long
107# define CURL_FORMAT_CURL_OFF_T "lld"
108# define CURL_FORMAT_CURL_OFF_TU "llu"
109# define CURL_SUFFIX_CURL_OFF_T LL
110# define CURL_SUFFIX_CURL_OFF_TU ULL
111# else
112# define CURL_TYPEOF_CURL_OFF_T long
113# define CURL_FORMAT_CURL_OFF_T "ld"
114# define CURL_FORMAT_CURL_OFF_TU "lu"
115# define CURL_SUFFIX_CURL_OFF_T L
116# define CURL_SUFFIX_CURL_OFF_TU UL
117# endif
118# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int
119
120#elif defined(__TANDEM)
121# ifndef __LP64
122# define CURL_TYPEOF_CURL_OFF_T long long
123# define CURL_FORMAT_CURL_OFF_T "lld"
124# define CURL_FORMAT_CURL_OFF_TU "llu"
125# define CURL_SUFFIX_CURL_OFF_T LL
126# define CURL_SUFFIX_CURL_OFF_TU ULL
127# define CURL_TYPEOF_CURL_SOCKLEN_T int
128# else
129# define CURL_TYPEOF_CURL_OFF_T long
130# define CURL_FORMAT_CURL_OFF_T "ld"
131# define CURL_FORMAT_CURL_OFF_TU "lu"
132# define CURL_SUFFIX_CURL_OFF_T L
133# define CURL_SUFFIX_CURL_OFF_TU UL
134# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int
135# endif
136
137#elif defined(UNDER_CE)
138# ifdef __MINGW32CE__
139# define CURL_TYPEOF_CURL_OFF_T long long
140# define CURL_FORMAT_CURL_OFF_T "lld"
141# define CURL_FORMAT_CURL_OFF_TU "llu"
142# define CURL_SUFFIX_CURL_OFF_T LL
143# define CURL_SUFFIX_CURL_OFF_TU ULL
144# define CURL_TYPEOF_CURL_SOCKLEN_T int
145# else
146# define CURL_TYPEOF_CURL_OFF_T __int64
147# define CURL_FORMAT_CURL_OFF_T "I64d"
148# define CURL_FORMAT_CURL_OFF_TU "I64u"
149# define CURL_SUFFIX_CURL_OFF_T i64
150# define CURL_SUFFIX_CURL_OFF_TU ui64
151# define CURL_TYPEOF_CURL_SOCKLEN_T int
152# endif
153
154#elif defined(__MINGW32__)
155# include <inttypes.h>
156# define CURL_TYPEOF_CURL_OFF_T long long
157# define CURL_FORMAT_CURL_OFF_T PRId64
158# define CURL_FORMAT_CURL_OFF_TU PRIu64
159# define CURL_SUFFIX_CURL_OFF_T LL
160# define CURL_SUFFIX_CURL_OFF_TU ULL
161# define CURL_TYPEOF_CURL_SOCKLEN_T int
162# define CURL_PULL_SYS_TYPES_H 1
163
164#elif defined(__VMS)
165# ifdef __VAX
166# define CURL_TYPEOF_CURL_OFF_T long
167# define CURL_FORMAT_CURL_OFF_T "ld"
168# define CURL_FORMAT_CURL_OFF_TU "lu"
169# define CURL_SUFFIX_CURL_OFF_T L
170# define CURL_SUFFIX_CURL_OFF_TU UL
171# else
172# define CURL_TYPEOF_CURL_OFF_T long long
173# define CURL_FORMAT_CURL_OFF_T "lld"
174# define CURL_FORMAT_CURL_OFF_TU "llu"
175# define CURL_SUFFIX_CURL_OFF_T LL
176# define CURL_SUFFIX_CURL_OFF_TU ULL
177# endif
178# define CURL_TYPEOF_CURL_SOCKLEN_T unsigned int
179
180#elif defined(__OS400__)
181# define CURL_TYPEOF_CURL_OFF_T long long
182# define CURL_FORMAT_CURL_OFF_T "lld"
183# define CURL_FORMAT_CURL_OFF_TU "llu"
184# define CURL_SUFFIX_CURL_OFF_T LL
185# define CURL_SUFFIX_CURL_OFF_TU ULL
186# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
187# define CURL_PULL_SYS_TYPES_H 1
188# define CURL_PULL_SYS_SOCKET_H 1
189
190#elif defined(__MVS__)
191# ifdef _LONG_LONG
192# define CURL_TYPEOF_CURL_OFF_T long long
193# define CURL_FORMAT_CURL_OFF_T "lld"
194# define CURL_FORMAT_CURL_OFF_TU "llu"
195# define CURL_SUFFIX_CURL_OFF_T LL
196# define CURL_SUFFIX_CURL_OFF_TU ULL
197# else /* _LP64 and default */
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
203# endif
204# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
205# define CURL_PULL_SYS_TYPES_H 1
206# define CURL_PULL_SYS_SOCKET_H 1
207
208#elif defined(__370__)
209# if defined(__IBMC__) || defined(__IBMCPP__)
210# ifdef _LONG_LONG
211# define CURL_TYPEOF_CURL_OFF_T long long
212# define CURL_FORMAT_CURL_OFF_T "lld"
213# define CURL_FORMAT_CURL_OFF_TU "llu"
214# define CURL_SUFFIX_CURL_OFF_T LL
215# define CURL_SUFFIX_CURL_OFF_TU ULL
216# else /* _LP64 and default */
217# define CURL_TYPEOF_CURL_OFF_T long
218# define CURL_FORMAT_CURL_OFF_T "ld"
219# define CURL_FORMAT_CURL_OFF_TU "lu"
220# define CURL_SUFFIX_CURL_OFF_T L
221# define CURL_SUFFIX_CURL_OFF_TU UL
222# endif
223# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
224# define CURL_PULL_SYS_TYPES_H 1
225# define CURL_PULL_SYS_SOCKET_H 1
226# endif
227
228#elif defined(TPF)
229# define CURL_TYPEOF_CURL_OFF_T long
230# define CURL_FORMAT_CURL_OFF_T "ld"
231# define CURL_FORMAT_CURL_OFF_TU "lu"
232# define CURL_SUFFIX_CURL_OFF_T L
233# define CURL_SUFFIX_CURL_OFF_TU UL
234# define CURL_TYPEOF_CURL_SOCKLEN_T int
235
236#elif defined(__TINYC__) /* also known as tcc */
237# define CURL_TYPEOF_CURL_OFF_T long long
238# define CURL_FORMAT_CURL_OFF_T "lld"
239# define CURL_FORMAT_CURL_OFF_TU "llu"
240# define CURL_SUFFIX_CURL_OFF_T LL
241# define CURL_SUFFIX_CURL_OFF_TU ULL
242# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
243# define CURL_PULL_SYS_TYPES_H 1
244# define CURL_PULL_SYS_SOCKET_H 1
245
246#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) /* Oracle Solaris Studio */
247# if !defined(__LP64) && (defined(__ILP32) || \
248 defined(__i386) || \
249 defined(__sparcv8) || \
250 defined(__sparcv8plus))
251# define CURL_TYPEOF_CURL_OFF_T long long
252# define CURL_FORMAT_CURL_OFF_T "lld"
253# define CURL_FORMAT_CURL_OFF_TU "llu"
254# define CURL_SUFFIX_CURL_OFF_T LL
255# define CURL_SUFFIX_CURL_OFF_TU ULL
256# elif defined(__LP64) || \
257 defined(__amd64) || defined(__sparcv9)
258# define CURL_TYPEOF_CURL_OFF_T long
259# define CURL_FORMAT_CURL_OFF_T "ld"
260# define CURL_FORMAT_CURL_OFF_TU "lu"
261# define CURL_SUFFIX_CURL_OFF_T L
262# define CURL_SUFFIX_CURL_OFF_TU UL
263# endif
264# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
265# define CURL_PULL_SYS_TYPES_H 1
266# define CURL_PULL_SYS_SOCKET_H 1
267
268#elif defined(__xlc__) /* IBM xlc compiler */
269# ifndef _LP64
270# define CURL_TYPEOF_CURL_OFF_T long long
271# define CURL_FORMAT_CURL_OFF_T "lld"
272# define CURL_FORMAT_CURL_OFF_TU "llu"
273# define CURL_SUFFIX_CURL_OFF_T LL
274# define CURL_SUFFIX_CURL_OFF_TU ULL
275# else
276# define CURL_TYPEOF_CURL_OFF_T long
277# define CURL_FORMAT_CURL_OFF_T "ld"
278# define CURL_FORMAT_CURL_OFF_TU "lu"
279# define CURL_SUFFIX_CURL_OFF_T L
280# define CURL_SUFFIX_CURL_OFF_TU UL
281# endif
282# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
283# define CURL_PULL_SYS_TYPES_H 1
284# define CURL_PULL_SYS_SOCKET_H 1
285
286#elif defined(__hpux) /* HP aCC compiler */
287# ifndef _LP64
288# define CURL_TYPEOF_CURL_OFF_T long long
289# define CURL_FORMAT_CURL_OFF_T "lld"
290# define CURL_FORMAT_CURL_OFF_TU "llu"
291# define CURL_SUFFIX_CURL_OFF_T LL
292# define CURL_SUFFIX_CURL_OFF_TU ULL
293# else
294# define CURL_TYPEOF_CURL_OFF_T long
295# define CURL_FORMAT_CURL_OFF_T "ld"
296# define CURL_FORMAT_CURL_OFF_TU "lu"
297# define CURL_SUFFIX_CURL_OFF_T L
298# define CURL_SUFFIX_CURL_OFF_TU UL
299# endif
300# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
301# define CURL_PULL_SYS_TYPES_H 1
302# define CURL_PULL_SYS_SOCKET_H 1
303
304/* ===================================== */
305/* KEEP MSVC THE PENULTIMATE ENTRY */
306/* ===================================== */
307
308#elif defined(_MSC_VER)
309# if (_MSC_VER >= 1800)
310# include <inttypes.h>
311# define CURL_FORMAT_CURL_OFF_T PRId64
312# define CURL_FORMAT_CURL_OFF_TU PRIu64
313# else
314# define CURL_FORMAT_CURL_OFF_T "I64d"
315# define CURL_FORMAT_CURL_OFF_TU "I64u"
316# endif
317# define CURL_TYPEOF_CURL_OFF_T __int64
318# define CURL_SUFFIX_CURL_OFF_T i64
319# define CURL_SUFFIX_CURL_OFF_TU ui64
320# define CURL_TYPEOF_CURL_SOCKLEN_T int
321
322/* ===================================== */
323/* KEEP GENERIC GCC THE LAST ENTRY */
324/* ===================================== */
325
326#elif defined(__GNUC__) && !defined(_SCO_DS)
327# if !defined(__LP64__) && \
328 (defined(__ILP32__) || defined(__i386__) || defined(__hppa__) || \
329 defined(__ppc__) || defined(__powerpc__) || defined(__arm__) || \
330 defined(__sparc__) || defined(__mips__) || defined(__sh__) || \
331 defined(__XTENSA__) || \
332 (defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 4) || \
333 (defined(__LONG_MAX__) && __LONG_MAX__ == 2147483647L))
334# define CURL_TYPEOF_CURL_OFF_T long long
335# define CURL_FORMAT_CURL_OFF_T "lld"
336# define CURL_FORMAT_CURL_OFF_TU "llu"
337# define CURL_SUFFIX_CURL_OFF_T LL
338# define CURL_SUFFIX_CURL_OFF_TU ULL
339# if (__GNUC__ >= 4) || \
340 ((__GNUC__ == 3) && defined(__GNUC_MINOR__) && (__GNUC_MINOR__ >= 4))
341# define CURL_POPCOUNT64(x) __builtin_popcountll(x)
342# define CURL_CTZ64(x) __builtin_ctzll(x)
343# endif
344# elif defined(__LP64__) || \
345 defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) || \
346 defined(__e2k__) || \
347 (defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ == 8) || \
348 (defined(__LONG_MAX__) && __LONG_MAX__ == 9223372036854775807L)
349# define CURL_TYPEOF_CURL_OFF_T long
350# define CURL_FORMAT_CURL_OFF_T "ld"
351# define CURL_FORMAT_CURL_OFF_TU "lu"
352# define CURL_SUFFIX_CURL_OFF_T L
353# define CURL_SUFFIX_CURL_OFF_TU UL
354# if (__GNUC__ >= 4) || \
355 ((__GNUC__ == 3) && defined(__GNUC_MINOR__) && (__GNUC_MINOR__ >= 4))
356# define CURL_POPCOUNT64(x) __builtin_popcountl(x)
357# define CURL_CTZ64(x) __builtin_ctzl(x)
358# endif
359# endif
360# define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t
361# define CURL_PULL_SYS_TYPES_H 1
362# define CURL_PULL_SYS_SOCKET_H 1
363
364#else
365/* generic "safe guess" on old 32-bit style */
366# define CURL_TYPEOF_CURL_OFF_T long long
367# define CURL_FORMAT_CURL_OFF_T "lld"
368# define CURL_FORMAT_CURL_OFF_TU "llu"
369# define CURL_SUFFIX_CURL_OFF_T LL
370# define CURL_SUFFIX_CURL_OFF_TU ULL
371# define CURL_TYPEOF_CURL_SOCKLEN_T int
372#endif
373
374#ifdef _AIX
375/* AIX needs <sys/poll.h> */
376#define CURL_PULL_SYS_POLL_H
377#endif
378
379/* CURL_PULL_SYS_TYPES_H is defined above when inclusion of header file */
380/* sys/types.h is required here to properly make type definitions below. */
381#ifdef CURL_PULL_SYS_TYPES_H
382# include <sys/types.h>
383#endif
384
385/* CURL_PULL_SYS_SOCKET_H is defined above when inclusion of header file */
386/* sys/socket.h is required here to properly make type definitions below. */
387#ifdef CURL_PULL_SYS_SOCKET_H
388# include <sys/socket.h>
389#endif
390
391/* CURL_PULL_SYS_POLL_H is defined above when inclusion of header file */
392/* sys/poll.h is required here to properly make type definitions below. */
393#ifdef CURL_PULL_SYS_POLL_H
394# include <sys/poll.h>
395#endif
396
397/* Data type definition of curl_socklen_t. */
398#ifdef CURL_TYPEOF_CURL_SOCKLEN_T
399 typedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t;
400#endif
401
402/* Data type definition of curl_off_t. */
403
404#ifdef CURL_TYPEOF_CURL_OFF_T
405 typedef CURL_TYPEOF_CURL_OFF_T curl_off_t;
406#endif
407
408#endif /* CURLINC_SYSTEM_H */
409