1 | #ifndef HEADER_CURL_SETUP_ONCE_H |
2 | #define |
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 | |
26 | /* |
27 | * Inclusion of common header files. |
28 | */ |
29 | |
30 | #include <stdio.h> |
31 | #include <stdlib.h> |
32 | #include <string.h> |
33 | #include <stdarg.h> |
34 | #include <ctype.h> |
35 | |
36 | #ifdef HAVE_ERRNO_H |
37 | #include <errno.h> |
38 | #endif |
39 | |
40 | #ifdef HAVE_SYS_TYPES_H |
41 | #include <sys/types.h> |
42 | #endif |
43 | |
44 | #ifdef NEED_MALLOC_H |
45 | #include <malloc.h> |
46 | #endif |
47 | |
48 | #ifdef NEED_MEMORY_H |
49 | #include <memory.h> |
50 | #endif |
51 | |
52 | #ifdef HAVE_SYS_STAT_H |
53 | #include <sys/stat.h> |
54 | #endif |
55 | |
56 | #ifdef HAVE_SYS_TIME_H |
57 | #include <sys/time.h> |
58 | #ifdef TIME_WITH_SYS_TIME |
59 | #include <time.h> |
60 | #endif |
61 | #else |
62 | #ifdef HAVE_TIME_H |
63 | #include <time.h> |
64 | #endif |
65 | #endif |
66 | |
67 | #ifdef WIN32 |
68 | #include <io.h> |
69 | #include <fcntl.h> |
70 | #endif |
71 | |
72 | #if defined(HAVE_STDBOOL_H) && defined(HAVE_BOOL_T) |
73 | #include <stdbool.h> |
74 | #endif |
75 | |
76 | #ifdef HAVE_UNISTD_H |
77 | #include <unistd.h> |
78 | #endif |
79 | |
80 | #ifdef __hpux |
81 | # if !defined(_XOPEN_SOURCE_EXTENDED) || defined(_KERNEL) |
82 | # ifdef _APP32_64BIT_OFF_T |
83 | # define OLD_APP32_64BIT_OFF_T _APP32_64BIT_OFF_T |
84 | # undef _APP32_64BIT_OFF_T |
85 | # else |
86 | # undef OLD_APP32_64BIT_OFF_T |
87 | # endif |
88 | # endif |
89 | #endif |
90 | |
91 | #ifdef HAVE_SYS_SOCKET_H |
92 | #include <sys/socket.h> |
93 | #endif |
94 | |
95 | #ifdef __hpux |
96 | # if !defined(_XOPEN_SOURCE_EXTENDED) || defined(_KERNEL) |
97 | # ifdef OLD_APP32_64BIT_OFF_T |
98 | # define _APP32_64BIT_OFF_T OLD_APP32_64BIT_OFF_T |
99 | # undef OLD_APP32_64BIT_OFF_T |
100 | # endif |
101 | # endif |
102 | #endif |
103 | |
104 | /* |
105 | * Definition of timeval struct for platforms that don't have it. |
106 | */ |
107 | |
108 | #ifndef HAVE_STRUCT_TIMEVAL |
109 | struct timeval { |
110 | long tv_sec; |
111 | long tv_usec; |
112 | }; |
113 | #endif |
114 | |
115 | |
116 | /* |
117 | * If we have the MSG_NOSIGNAL define, make sure we use |
118 | * it as the fourth argument of function send() |
119 | */ |
120 | |
121 | #ifdef HAVE_MSG_NOSIGNAL |
122 | #define SEND_4TH_ARG MSG_NOSIGNAL |
123 | #else |
124 | #define SEND_4TH_ARG 0 |
125 | #endif |
126 | |
127 | |
128 | #if defined(__minix) |
129 | /* Minix doesn't support recv on TCP sockets */ |
130 | #define sread(x,y,z) (ssize_t)read((RECV_TYPE_ARG1)(x), \ |
131 | (RECV_TYPE_ARG2)(y), \ |
132 | (RECV_TYPE_ARG3)(z)) |
133 | |
134 | #elif defined(HAVE_RECV) |
135 | /* |
136 | * The definitions for the return type and arguments types |
137 | * of functions recv() and send() belong and come from the |
138 | * configuration file. Do not define them in any other place. |
139 | * |
140 | * HAVE_RECV is defined if you have a function named recv() |
141 | * which is used to read incoming data from sockets. If your |
142 | * function has another name then don't define HAVE_RECV. |
143 | * |
144 | * If HAVE_RECV is defined then RECV_TYPE_ARG1, RECV_TYPE_ARG2, |
145 | * RECV_TYPE_ARG3, RECV_TYPE_ARG4 and RECV_TYPE_RETV must also |
146 | * be defined. |
147 | * |
148 | * HAVE_SEND is defined if you have a function named send() |
149 | * which is used to write outgoing data on a connected socket. |
150 | * If yours has another name then don't define HAVE_SEND. |
151 | * |
152 | * If HAVE_SEND is defined then SEND_TYPE_ARG1, SEND_QUAL_ARG2, |
153 | * SEND_TYPE_ARG2, SEND_TYPE_ARG3, SEND_TYPE_ARG4 and |
154 | * SEND_TYPE_RETV must also be defined. |
155 | */ |
156 | |
157 | #if !defined(RECV_TYPE_ARG1) || \ |
158 | !defined(RECV_TYPE_ARG2) || \ |
159 | !defined(RECV_TYPE_ARG3) || \ |
160 | !defined(RECV_TYPE_ARG4) || \ |
161 | !defined(RECV_TYPE_RETV) |
162 | /* */ |
163 | Error Missing_definition_of_return_and_arguments_types_of_recv |
164 | /* */ |
165 | #else |
166 | #define sread(x,y,z) (ssize_t)recv((RECV_TYPE_ARG1)(x), \ |
167 | (RECV_TYPE_ARG2)(y), \ |
168 | (RECV_TYPE_ARG3)(z), \ |
169 | (RECV_TYPE_ARG4)(0)) |
170 | #endif |
171 | #else /* HAVE_RECV */ |
172 | #ifndef sread |
173 | /* */ |
174 | Error Missing_definition_of_macro_sread |
175 | /* */ |
176 | #endif |
177 | #endif /* HAVE_RECV */ |
178 | |
179 | |
180 | #if defined(__minix) |
181 | /* Minix doesn't support send on TCP sockets */ |
182 | #define swrite(x,y,z) (ssize_t)write((SEND_TYPE_ARG1)(x), \ |
183 | (SEND_TYPE_ARG2)(y), \ |
184 | (SEND_TYPE_ARG3)(z)) |
185 | |
186 | #elif defined(HAVE_SEND) |
187 | #if !defined(SEND_TYPE_ARG1) || \ |
188 | !defined(SEND_QUAL_ARG2) || \ |
189 | !defined(SEND_TYPE_ARG2) || \ |
190 | !defined(SEND_TYPE_ARG3) || \ |
191 | !defined(SEND_TYPE_ARG4) || \ |
192 | !defined(SEND_TYPE_RETV) |
193 | /* */ |
194 | Error Missing_definition_of_return_and_arguments_types_of_send |
195 | /* */ |
196 | #else |
197 | #define swrite(x,y,z) (ssize_t)send((SEND_TYPE_ARG1)(x), \ |
198 | (SEND_QUAL_ARG2 SEND_TYPE_ARG2)(y), \ |
199 | (SEND_TYPE_ARG3)(z), \ |
200 | (SEND_TYPE_ARG4)(SEND_4TH_ARG)) |
201 | #endif |
202 | #else /* HAVE_SEND */ |
203 | #ifndef swrite |
204 | /* */ |
205 | Error Missing_definition_of_macro_swrite |
206 | /* */ |
207 | #endif |
208 | #endif /* HAVE_SEND */ |
209 | |
210 | |
211 | #if 0 |
212 | #if defined(HAVE_RECVFROM) |
213 | /* |
214 | * Currently recvfrom is only used on udp sockets. |
215 | */ |
216 | #if !defined(RECVFROM_TYPE_ARG1) || \ |
217 | !defined(RECVFROM_TYPE_ARG2) || \ |
218 | !defined(RECVFROM_TYPE_ARG3) || \ |
219 | !defined(RECVFROM_TYPE_ARG4) || \ |
220 | !defined(RECVFROM_TYPE_ARG5) || \ |
221 | !defined(RECVFROM_TYPE_ARG6) || \ |
222 | !defined(RECVFROM_TYPE_RETV) |
223 | /* */ |
224 | Error Missing_definition_of_return_and_arguments_types_of_recvfrom |
225 | /* */ |
226 | #else |
227 | #define sreadfrom(s,b,bl,f,fl) (ssize_t)recvfrom((RECVFROM_TYPE_ARG1) (s), \ |
228 | (RECVFROM_TYPE_ARG2 *)(b), \ |
229 | (RECVFROM_TYPE_ARG3) (bl), \ |
230 | (RECVFROM_TYPE_ARG4) (0), \ |
231 | (RECVFROM_TYPE_ARG5 *)(f), \ |
232 | (RECVFROM_TYPE_ARG6 *)(fl)) |
233 | #endif |
234 | #else /* HAVE_RECVFROM */ |
235 | #ifndef sreadfrom |
236 | /* */ |
237 | Error Missing_definition_of_macro_sreadfrom |
238 | /* */ |
239 | #endif |
240 | #endif /* HAVE_RECVFROM */ |
241 | |
242 | |
243 | #ifdef RECVFROM_TYPE_ARG6_IS_VOID |
244 | # define RECVFROM_ARG6_T int |
245 | #else |
246 | # define RECVFROM_ARG6_T RECVFROM_TYPE_ARG6 |
247 | #endif |
248 | #endif /* if 0 */ |
249 | |
250 | |
251 | /* |
252 | * Function-like macro definition used to close a socket. |
253 | */ |
254 | |
255 | #if defined(HAVE_CLOSESOCKET) |
256 | # define sclose(x) closesocket((x)) |
257 | #elif defined(HAVE_CLOSESOCKET_CAMEL) |
258 | # define sclose(x) CloseSocket((x)) |
259 | #elif defined(HAVE_CLOSE_S) |
260 | # define sclose(x) close_s((x)) |
261 | #elif defined(USE_LWIPSOCK) |
262 | # define sclose(x) lwip_close((x)) |
263 | #else |
264 | # define sclose(x) close((x)) |
265 | #endif |
266 | |
267 | /* |
268 | * Stack-independent version of fcntl() on sockets: |
269 | */ |
270 | #if defined(USE_LWIPSOCK) |
271 | # define sfcntl lwip_fcntl |
272 | #else |
273 | # define sfcntl fcntl |
274 | #endif |
275 | |
276 | #define TOLOWER(x) (tolower((int) ((unsigned char)x))) |
277 | |
278 | |
279 | /* |
280 | * 'bool' stuff compatible with HP-UX headers. |
281 | */ |
282 | |
283 | #if defined(__hpux) && !defined(HAVE_BOOL_T) |
284 | typedef int bool; |
285 | # define false 0 |
286 | # define true 1 |
287 | # define HAVE_BOOL_T |
288 | #endif |
289 | |
290 | |
291 | /* |
292 | * 'bool' exists on platforms with <stdbool.h>, i.e. C99 platforms. |
293 | * On non-C99 platforms there's no bool, so define an enum for that. |
294 | * On C99 platforms 'false' and 'true' also exist. Enum uses a |
295 | * global namespace though, so use bool_false and bool_true. |
296 | */ |
297 | |
298 | #ifndef HAVE_BOOL_T |
299 | typedef enum { |
300 | bool_false = 0, |
301 | bool_true = 1 |
302 | } bool; |
303 | |
304 | /* |
305 | * Use a define to let 'true' and 'false' use those enums. There |
306 | * are currently no use of true and false in libcurl proper, but |
307 | * there are some in the examples. This will cater for any later |
308 | * code happening to use true and false. |
309 | */ |
310 | # define false bool_false |
311 | # define true bool_true |
312 | # define HAVE_BOOL_T |
313 | #endif |
314 | |
315 | |
316 | /* |
317 | * Redefine TRUE and FALSE too, to catch current use. With this |
318 | * change, 'bool found = 1' will give a warning on MIPSPro, but |
319 | * 'bool found = TRUE' will not. Change tested on IRIX/MIPSPro, |
320 | * AIX 5.1/Xlc, Tru64 5.1/cc, w/make test too. |
321 | */ |
322 | |
323 | #ifndef TRUE |
324 | #define TRUE true |
325 | #endif |
326 | #ifndef FALSE |
327 | #define FALSE false |
328 | #endif |
329 | |
330 | #include "curl_ctype.h" |
331 | |
332 | /* |
333 | * Typedef to 'int' if sig_atomic_t is not an available 'typedefed' type. |
334 | */ |
335 | |
336 | #ifndef HAVE_SIG_ATOMIC_T |
337 | typedef int sig_atomic_t; |
338 | #define HAVE_SIG_ATOMIC_T |
339 | #endif |
340 | |
341 | |
342 | /* |
343 | * Convenience SIG_ATOMIC_T definition |
344 | */ |
345 | |
346 | #ifdef HAVE_SIG_ATOMIC_T_VOLATILE |
347 | #define SIG_ATOMIC_T static sig_atomic_t |
348 | #else |
349 | #define SIG_ATOMIC_T static volatile sig_atomic_t |
350 | #endif |
351 | |
352 | |
353 | /* |
354 | * Default return type for signal handlers. |
355 | */ |
356 | |
357 | #ifndef RETSIGTYPE |
358 | #define RETSIGTYPE void |
359 | #endif |
360 | |
361 | |
362 | /* |
363 | * Macro used to include code only in debug builds. |
364 | */ |
365 | |
366 | #ifdef DEBUGBUILD |
367 | #define DEBUGF(x) x |
368 | #else |
369 | #define DEBUGF(x) do { } while(0) |
370 | #endif |
371 | |
372 | |
373 | /* |
374 | * Macro used to include assertion code only in debug builds. |
375 | */ |
376 | |
377 | #if defined(DEBUGBUILD) && defined(HAVE_ASSERT_H) |
378 | #define DEBUGASSERT(x) assert(x) |
379 | #else |
380 | #define DEBUGASSERT(x) do { } while(0) |
381 | #endif |
382 | |
383 | |
384 | /* |
385 | * Macro SOCKERRNO / SET_SOCKERRNO() returns / sets the *socket-related* errno |
386 | * (or equivalent) on this platform to hide platform details to code using it. |
387 | */ |
388 | |
389 | #ifdef USE_WINSOCK |
390 | #define SOCKERRNO ((int)WSAGetLastError()) |
391 | #define SET_SOCKERRNO(x) (WSASetLastError((int)(x))) |
392 | #else |
393 | #define SOCKERRNO (errno) |
394 | #define SET_SOCKERRNO(x) (errno = (x)) |
395 | #endif |
396 | |
397 | |
398 | /* |
399 | * Portable error number symbolic names defined to Winsock error codes. |
400 | */ |
401 | |
402 | #ifdef USE_WINSOCK |
403 | #undef EBADF /* override definition in errno.h */ |
404 | #define EBADF WSAEBADF |
405 | #undef EINTR /* override definition in errno.h */ |
406 | #define EINTR WSAEINTR |
407 | #undef EINVAL /* override definition in errno.h */ |
408 | #define EINVAL WSAEINVAL |
409 | #undef EWOULDBLOCK /* override definition in errno.h */ |
410 | #define EWOULDBLOCK WSAEWOULDBLOCK |
411 | #undef EINPROGRESS /* override definition in errno.h */ |
412 | #define EINPROGRESS WSAEINPROGRESS |
413 | #undef EALREADY /* override definition in errno.h */ |
414 | #define EALREADY WSAEALREADY |
415 | #undef ENOTSOCK /* override definition in errno.h */ |
416 | #define ENOTSOCK WSAENOTSOCK |
417 | #undef EDESTADDRREQ /* override definition in errno.h */ |
418 | #define EDESTADDRREQ WSAEDESTADDRREQ |
419 | #undef EMSGSIZE /* override definition in errno.h */ |
420 | #define EMSGSIZE WSAEMSGSIZE |
421 | #undef EPROTOTYPE /* override definition in errno.h */ |
422 | #define EPROTOTYPE WSAEPROTOTYPE |
423 | #undef ENOPROTOOPT /* override definition in errno.h */ |
424 | #define ENOPROTOOPT WSAENOPROTOOPT |
425 | #undef EPROTONOSUPPORT /* override definition in errno.h */ |
426 | #define EPROTONOSUPPORT WSAEPROTONOSUPPORT |
427 | #define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT |
428 | #undef EOPNOTSUPP /* override definition in errno.h */ |
429 | #define EOPNOTSUPP WSAEOPNOTSUPP |
430 | #define EPFNOSUPPORT WSAEPFNOSUPPORT |
431 | #undef EAFNOSUPPORT /* override definition in errno.h */ |
432 | #define EAFNOSUPPORT WSAEAFNOSUPPORT |
433 | #undef EADDRINUSE /* override definition in errno.h */ |
434 | #define EADDRINUSE WSAEADDRINUSE |
435 | #undef EADDRNOTAVAIL /* override definition in errno.h */ |
436 | #define EADDRNOTAVAIL WSAEADDRNOTAVAIL |
437 | #undef ENETDOWN /* override definition in errno.h */ |
438 | #define ENETDOWN WSAENETDOWN |
439 | #undef ENETUNREACH /* override definition in errno.h */ |
440 | #define ENETUNREACH WSAENETUNREACH |
441 | #undef ENETRESET /* override definition in errno.h */ |
442 | #define ENETRESET WSAENETRESET |
443 | #undef ECONNABORTED /* override definition in errno.h */ |
444 | #define ECONNABORTED WSAECONNABORTED |
445 | #undef ECONNRESET /* override definition in errno.h */ |
446 | #define ECONNRESET WSAECONNRESET |
447 | #undef ENOBUFS /* override definition in errno.h */ |
448 | #define ENOBUFS WSAENOBUFS |
449 | #undef EISCONN /* override definition in errno.h */ |
450 | #define EISCONN WSAEISCONN |
451 | #undef ENOTCONN /* override definition in errno.h */ |
452 | #define ENOTCONN WSAENOTCONN |
453 | #define ESHUTDOWN WSAESHUTDOWN |
454 | #define ETOOMANYREFS WSAETOOMANYREFS |
455 | #undef ETIMEDOUT /* override definition in errno.h */ |
456 | #define ETIMEDOUT WSAETIMEDOUT |
457 | #undef ECONNREFUSED /* override definition in errno.h */ |
458 | #define ECONNREFUSED WSAECONNREFUSED |
459 | #undef ELOOP /* override definition in errno.h */ |
460 | #define ELOOP WSAELOOP |
461 | #ifndef ENAMETOOLONG /* possible previous definition in errno.h */ |
462 | #define ENAMETOOLONG WSAENAMETOOLONG |
463 | #endif |
464 | #define EHOSTDOWN WSAEHOSTDOWN |
465 | #undef EHOSTUNREACH /* override definition in errno.h */ |
466 | #define EHOSTUNREACH WSAEHOSTUNREACH |
467 | #ifndef ENOTEMPTY /* possible previous definition in errno.h */ |
468 | #define ENOTEMPTY WSAENOTEMPTY |
469 | #endif |
470 | #define EPROCLIM WSAEPROCLIM |
471 | #define EUSERS WSAEUSERS |
472 | #define EDQUOT WSAEDQUOT |
473 | #define ESTALE WSAESTALE |
474 | #define EREMOTE WSAEREMOTE |
475 | #endif |
476 | |
477 | /* |
478 | * Macro argv_item_t hides platform details to code using it. |
479 | */ |
480 | |
481 | #ifdef __VMS |
482 | #define argv_item_t __char_ptr32 |
483 | #else |
484 | #define argv_item_t char * |
485 | #endif |
486 | |
487 | |
488 | /* |
489 | * We use this ZERO_NULL to avoid picky compiler warnings, |
490 | * when assigning a NULL pointer to a function pointer var. |
491 | */ |
492 | |
493 | #define ZERO_NULL 0 |
494 | |
495 | |
496 | #endif /* HEADER_CURL_SETUP_ONCE_H */ |
497 | |