Annotation of embedaddon/curl/lib/curl_setup_once.h, revision 1.1.1.1
1.1 misho 1: #ifndef HEADER_CURL_SETUP_ONCE_H
2: #define HEADER_CURL_SETUP_ONCE_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:
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: #undef DEBUGASSERT
378: #if defined(DEBUGBUILD) && defined(HAVE_ASSERT_H)
379: #define DEBUGASSERT(x) assert(x)
380: #else
381: #define DEBUGASSERT(x) do { } while(0)
382: #endif
383:
384:
385: /*
386: * Macro SOCKERRNO / SET_SOCKERRNO() returns / sets the *socket-related* errno
387: * (or equivalent) on this platform to hide platform details to code using it.
388: */
389:
390: #ifdef USE_WINSOCK
391: #define SOCKERRNO ((int)WSAGetLastError())
392: #define SET_SOCKERRNO(x) (WSASetLastError((int)(x)))
393: #else
394: #define SOCKERRNO (errno)
395: #define SET_SOCKERRNO(x) (errno = (x))
396: #endif
397:
398:
399: /*
400: * Portable error number symbolic names defined to Winsock error codes.
401: */
402:
403: #ifdef USE_WINSOCK
404: #undef EBADF /* override definition in errno.h */
405: #define EBADF WSAEBADF
406: #undef EINTR /* override definition in errno.h */
407: #define EINTR WSAEINTR
408: #undef EINVAL /* override definition in errno.h */
409: #define EINVAL WSAEINVAL
410: #undef EWOULDBLOCK /* override definition in errno.h */
411: #define EWOULDBLOCK WSAEWOULDBLOCK
412: #undef EINPROGRESS /* override definition in errno.h */
413: #define EINPROGRESS WSAEINPROGRESS
414: #undef EALREADY /* override definition in errno.h */
415: #define EALREADY WSAEALREADY
416: #undef ENOTSOCK /* override definition in errno.h */
417: #define ENOTSOCK WSAENOTSOCK
418: #undef EDESTADDRREQ /* override definition in errno.h */
419: #define EDESTADDRREQ WSAEDESTADDRREQ
420: #undef EMSGSIZE /* override definition in errno.h */
421: #define EMSGSIZE WSAEMSGSIZE
422: #undef EPROTOTYPE /* override definition in errno.h */
423: #define EPROTOTYPE WSAEPROTOTYPE
424: #undef ENOPROTOOPT /* override definition in errno.h */
425: #define ENOPROTOOPT WSAENOPROTOOPT
426: #undef EPROTONOSUPPORT /* override definition in errno.h */
427: #define EPROTONOSUPPORT WSAEPROTONOSUPPORT
428: #define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
429: #undef EOPNOTSUPP /* override definition in errno.h */
430: #define EOPNOTSUPP WSAEOPNOTSUPP
431: #define EPFNOSUPPORT WSAEPFNOSUPPORT
432: #undef EAFNOSUPPORT /* override definition in errno.h */
433: #define EAFNOSUPPORT WSAEAFNOSUPPORT
434: #undef EADDRINUSE /* override definition in errno.h */
435: #define EADDRINUSE WSAEADDRINUSE
436: #undef EADDRNOTAVAIL /* override definition in errno.h */
437: #define EADDRNOTAVAIL WSAEADDRNOTAVAIL
438: #undef ENETDOWN /* override definition in errno.h */
439: #define ENETDOWN WSAENETDOWN
440: #undef ENETUNREACH /* override definition in errno.h */
441: #define ENETUNREACH WSAENETUNREACH
442: #undef ENETRESET /* override definition in errno.h */
443: #define ENETRESET WSAENETRESET
444: #undef ECONNABORTED /* override definition in errno.h */
445: #define ECONNABORTED WSAECONNABORTED
446: #undef ECONNRESET /* override definition in errno.h */
447: #define ECONNRESET WSAECONNRESET
448: #undef ENOBUFS /* override definition in errno.h */
449: #define ENOBUFS WSAENOBUFS
450: #undef EISCONN /* override definition in errno.h */
451: #define EISCONN WSAEISCONN
452: #undef ENOTCONN /* override definition in errno.h */
453: #define ENOTCONN WSAENOTCONN
454: #define ESHUTDOWN WSAESHUTDOWN
455: #define ETOOMANYREFS WSAETOOMANYREFS
456: #undef ETIMEDOUT /* override definition in errno.h */
457: #define ETIMEDOUT WSAETIMEDOUT
458: #undef ECONNREFUSED /* override definition in errno.h */
459: #define ECONNREFUSED WSAECONNREFUSED
460: #undef ELOOP /* override definition in errno.h */
461: #define ELOOP WSAELOOP
462: #ifndef ENAMETOOLONG /* possible previous definition in errno.h */
463: #define ENAMETOOLONG WSAENAMETOOLONG
464: #endif
465: #define EHOSTDOWN WSAEHOSTDOWN
466: #undef EHOSTUNREACH /* override definition in errno.h */
467: #define EHOSTUNREACH WSAEHOSTUNREACH
468: #ifndef ENOTEMPTY /* possible previous definition in errno.h */
469: #define ENOTEMPTY WSAENOTEMPTY
470: #endif
471: #define EPROCLIM WSAEPROCLIM
472: #define EUSERS WSAEUSERS
473: #define EDQUOT WSAEDQUOT
474: #define ESTALE WSAESTALE
475: #define EREMOTE WSAEREMOTE
476: #endif
477:
478: /*
479: * Macro argv_item_t hides platform details to code using it.
480: */
481:
482: #ifdef __VMS
483: #define argv_item_t __char_ptr32
484: #else
485: #define argv_item_t char *
486: #endif
487:
488:
489: /*
490: * We use this ZERO_NULL to avoid picky compiler warnings,
491: * when assigning a NULL pointer to a function pointer var.
492: */
493:
494: #define ZERO_NULL 0
495:
496:
497: #endif /* HEADER_CURL_SETUP_ONCE_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>