xref: /aosp_15_r20/external/libevent/include/event2/util.h (revision 663afb9b963571284e0f0a60f257164ab54f64bf)
1*663afb9bSAndroid Build Coastguard Worker /*
2*663afb9bSAndroid Build Coastguard Worker  * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
3*663afb9bSAndroid Build Coastguard Worker  *
4*663afb9bSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
5*663afb9bSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
6*663afb9bSAndroid Build Coastguard Worker  * are met:
7*663afb9bSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
8*663afb9bSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
9*663afb9bSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
10*663afb9bSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
11*663afb9bSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
12*663afb9bSAndroid Build Coastguard Worker  * 3. The name of the author may not be used to endorse or promote products
13*663afb9bSAndroid Build Coastguard Worker  *    derived from this software without specific prior written permission.
14*663afb9bSAndroid Build Coastguard Worker  *
15*663afb9bSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16*663afb9bSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17*663afb9bSAndroid Build Coastguard Worker  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18*663afb9bSAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19*663afb9bSAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20*663afb9bSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21*663afb9bSAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22*663afb9bSAndroid Build Coastguard Worker  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23*663afb9bSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24*663afb9bSAndroid Build Coastguard Worker  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25*663afb9bSAndroid Build Coastguard Worker  */
26*663afb9bSAndroid Build Coastguard Worker #ifndef EVENT2_UTIL_H_INCLUDED_
27*663afb9bSAndroid Build Coastguard Worker #define EVENT2_UTIL_H_INCLUDED_
28*663afb9bSAndroid Build Coastguard Worker 
29*663afb9bSAndroid Build Coastguard Worker /** @file event2/util.h
30*663afb9bSAndroid Build Coastguard Worker 
31*663afb9bSAndroid Build Coastguard Worker   Common convenience functions for cross-platform portability and
32*663afb9bSAndroid Build Coastguard Worker   related socket manipulations.
33*663afb9bSAndroid Build Coastguard Worker 
34*663afb9bSAndroid Build Coastguard Worker  */
35*663afb9bSAndroid Build Coastguard Worker #include <event2/visibility.h>
36*663afb9bSAndroid Build Coastguard Worker 
37*663afb9bSAndroid Build Coastguard Worker #ifdef __cplusplus
38*663afb9bSAndroid Build Coastguard Worker extern "C" {
39*663afb9bSAndroid Build Coastguard Worker #endif
40*663afb9bSAndroid Build Coastguard Worker 
41*663afb9bSAndroid Build Coastguard Worker #include <event2/event-config.h>
42*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_SYS_TIME_H
43*663afb9bSAndroid Build Coastguard Worker #include <sys/time.h>
44*663afb9bSAndroid Build Coastguard Worker #endif
45*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_STDINT_H
46*663afb9bSAndroid Build Coastguard Worker #include <stdint.h>
47*663afb9bSAndroid Build Coastguard Worker #elif defined(EVENT__HAVE_INTTYPES_H)
48*663afb9bSAndroid Build Coastguard Worker #include <inttypes.h>
49*663afb9bSAndroid Build Coastguard Worker #endif
50*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_SYS_TYPES_H
51*663afb9bSAndroid Build Coastguard Worker #include <sys/types.h>
52*663afb9bSAndroid Build Coastguard Worker #endif
53*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_STDDEF_H
54*663afb9bSAndroid Build Coastguard Worker #include <stddef.h>
55*663afb9bSAndroid Build Coastguard Worker #endif
56*663afb9bSAndroid Build Coastguard Worker #ifdef _MSC_VER
57*663afb9bSAndroid Build Coastguard Worker #include <BaseTsd.h>
58*663afb9bSAndroid Build Coastguard Worker #endif
59*663afb9bSAndroid Build Coastguard Worker #include <stdarg.h>
60*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_NETDB_H
61*663afb9bSAndroid Build Coastguard Worker #include <netdb.h>
62*663afb9bSAndroid Build Coastguard Worker #endif
63*663afb9bSAndroid Build Coastguard Worker 
64*663afb9bSAndroid Build Coastguard Worker #ifdef _WIN32
65*663afb9bSAndroid Build Coastguard Worker #include <winsock2.h>
66*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_GETADDRINFO
67*663afb9bSAndroid Build Coastguard Worker /* for EAI_* definitions. */
68*663afb9bSAndroid Build Coastguard Worker #include <ws2tcpip.h>
69*663afb9bSAndroid Build Coastguard Worker #endif
70*663afb9bSAndroid Build Coastguard Worker #else
71*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_ERRNO_H
72*663afb9bSAndroid Build Coastguard Worker #include <errno.h>
73*663afb9bSAndroid Build Coastguard Worker #endif
74*663afb9bSAndroid Build Coastguard Worker #include <sys/socket.h>
75*663afb9bSAndroid Build Coastguard Worker #endif
76*663afb9bSAndroid Build Coastguard Worker 
77*663afb9bSAndroid Build Coastguard Worker #include <time.h>
78*663afb9bSAndroid Build Coastguard Worker 
79*663afb9bSAndroid Build Coastguard Worker /* Some openbsd autoconf versions get the name of this macro wrong. */
80*663afb9bSAndroid Build Coastguard Worker #if defined(EVENT__SIZEOF_VOID__) && !defined(EVENT__SIZEOF_VOID_P)
81*663afb9bSAndroid Build Coastguard Worker #define EVENT__SIZEOF_VOID_P EVENT__SIZEOF_VOID__
82*663afb9bSAndroid Build Coastguard Worker #endif
83*663afb9bSAndroid Build Coastguard Worker 
84*663afb9bSAndroid Build Coastguard Worker /**
85*663afb9bSAndroid Build Coastguard Worker  * @name Standard integer types.
86*663afb9bSAndroid Build Coastguard Worker  *
87*663afb9bSAndroid Build Coastguard Worker  * Integer type definitions for types that are supposed to be defined in the
88*663afb9bSAndroid Build Coastguard Worker  * C99-specified stdint.h.  Shamefully, some platforms do not include
89*663afb9bSAndroid Build Coastguard Worker  * stdint.h, so we need to replace it.  (If you are on a platform like this,
90*663afb9bSAndroid Build Coastguard Worker  * your C headers are now over 10 years out of date.  You should bug them to
91*663afb9bSAndroid Build Coastguard Worker  * do something about this.)
92*663afb9bSAndroid Build Coastguard Worker  *
93*663afb9bSAndroid Build Coastguard Worker  * We define:
94*663afb9bSAndroid Build Coastguard Worker  *
95*663afb9bSAndroid Build Coastguard Worker  * <dl>
96*663afb9bSAndroid Build Coastguard Worker  *   <dt>ev_uint64_t, ev_uint32_t, ev_uint16_t, ev_uint8_t</dt>
97*663afb9bSAndroid Build Coastguard Worker  *      <dd>unsigned integer types of exactly 64, 32, 16, and 8 bits
98*663afb9bSAndroid Build Coastguard Worker  *          respectively.</dd>
99*663afb9bSAndroid Build Coastguard Worker  *    <dt>ev_int64_t, ev_int32_t, ev_int16_t, ev_int8_t</dt>
100*663afb9bSAndroid Build Coastguard Worker  *      <dd>signed integer types of exactly 64, 32, 16, and 8 bits
101*663afb9bSAndroid Build Coastguard Worker  *          respectively.</dd>
102*663afb9bSAndroid Build Coastguard Worker  *    <dt>ev_uintptr_t, ev_intptr_t</dt>
103*663afb9bSAndroid Build Coastguard Worker  *      <dd>unsigned/signed integers large enough
104*663afb9bSAndroid Build Coastguard Worker  *      to hold a pointer without loss of bits.</dd>
105*663afb9bSAndroid Build Coastguard Worker  *    <dt>ev_ssize_t</dt>
106*663afb9bSAndroid Build Coastguard Worker  *      <dd>A signed type of the same size as size_t</dd>
107*663afb9bSAndroid Build Coastguard Worker  *    <dt>ev_off_t</dt>
108*663afb9bSAndroid Build Coastguard Worker  *      <dd>A signed type typically used to represent offsets within a
109*663afb9bSAndroid Build Coastguard Worker  *      (potentially large) file</dd>
110*663afb9bSAndroid Build Coastguard Worker  *
111*663afb9bSAndroid Build Coastguard Worker  * @{
112*663afb9bSAndroid Build Coastguard Worker  */
113*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_UINT64_T
114*663afb9bSAndroid Build Coastguard Worker #define ev_uint64_t uint64_t
115*663afb9bSAndroid Build Coastguard Worker #define ev_int64_t int64_t
116*663afb9bSAndroid Build Coastguard Worker #elif defined(_WIN32)
117*663afb9bSAndroid Build Coastguard Worker #define ev_uint64_t unsigned __int64
118*663afb9bSAndroid Build Coastguard Worker #define ev_int64_t signed __int64
119*663afb9bSAndroid Build Coastguard Worker #elif EVENT__SIZEOF_LONG_LONG == 8
120*663afb9bSAndroid Build Coastguard Worker #define ev_uint64_t unsigned long long
121*663afb9bSAndroid Build Coastguard Worker #define ev_int64_t long long
122*663afb9bSAndroid Build Coastguard Worker #elif EVENT__SIZEOF_LONG == 8
123*663afb9bSAndroid Build Coastguard Worker #define ev_uint64_t unsigned long
124*663afb9bSAndroid Build Coastguard Worker #define ev_int64_t long
125*663afb9bSAndroid Build Coastguard Worker #elif defined(EVENT_IN_DOXYGEN_)
126*663afb9bSAndroid Build Coastguard Worker #define ev_uint64_t ...
127*663afb9bSAndroid Build Coastguard Worker #define ev_int64_t ...
128*663afb9bSAndroid Build Coastguard Worker #else
129*663afb9bSAndroid Build Coastguard Worker #error "No way to define ev_uint64_t"
130*663afb9bSAndroid Build Coastguard Worker #endif
131*663afb9bSAndroid Build Coastguard Worker 
132*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_UINT32_T
133*663afb9bSAndroid Build Coastguard Worker #define ev_uint32_t uint32_t
134*663afb9bSAndroid Build Coastguard Worker #define ev_int32_t int32_t
135*663afb9bSAndroid Build Coastguard Worker #elif defined(_WIN32)
136*663afb9bSAndroid Build Coastguard Worker #define ev_uint32_t unsigned int
137*663afb9bSAndroid Build Coastguard Worker #define ev_int32_t signed int
138*663afb9bSAndroid Build Coastguard Worker #elif EVENT__SIZEOF_LONG == 4
139*663afb9bSAndroid Build Coastguard Worker #define ev_uint32_t unsigned long
140*663afb9bSAndroid Build Coastguard Worker #define ev_int32_t signed long
141*663afb9bSAndroid Build Coastguard Worker #elif EVENT__SIZEOF_INT == 4
142*663afb9bSAndroid Build Coastguard Worker #define ev_uint32_t unsigned int
143*663afb9bSAndroid Build Coastguard Worker #define ev_int32_t signed int
144*663afb9bSAndroid Build Coastguard Worker #elif defined(EVENT_IN_DOXYGEN_)
145*663afb9bSAndroid Build Coastguard Worker #define ev_uint32_t ...
146*663afb9bSAndroid Build Coastguard Worker #define ev_int32_t ...
147*663afb9bSAndroid Build Coastguard Worker #else
148*663afb9bSAndroid Build Coastguard Worker #error "No way to define ev_uint32_t"
149*663afb9bSAndroid Build Coastguard Worker #endif
150*663afb9bSAndroid Build Coastguard Worker 
151*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_UINT16_T
152*663afb9bSAndroid Build Coastguard Worker #define ev_uint16_t uint16_t
153*663afb9bSAndroid Build Coastguard Worker #define ev_int16_t  int16_t
154*663afb9bSAndroid Build Coastguard Worker #elif defined(_WIN32)
155*663afb9bSAndroid Build Coastguard Worker #define ev_uint16_t unsigned short
156*663afb9bSAndroid Build Coastguard Worker #define ev_int16_t  signed short
157*663afb9bSAndroid Build Coastguard Worker #elif EVENT__SIZEOF_INT == 2
158*663afb9bSAndroid Build Coastguard Worker #define ev_uint16_t unsigned int
159*663afb9bSAndroid Build Coastguard Worker #define ev_int16_t  signed int
160*663afb9bSAndroid Build Coastguard Worker #elif EVENT__SIZEOF_SHORT == 2
161*663afb9bSAndroid Build Coastguard Worker #define ev_uint16_t unsigned short
162*663afb9bSAndroid Build Coastguard Worker #define ev_int16_t  signed short
163*663afb9bSAndroid Build Coastguard Worker #elif defined(EVENT_IN_DOXYGEN_)
164*663afb9bSAndroid Build Coastguard Worker #define ev_uint16_t ...
165*663afb9bSAndroid Build Coastguard Worker #define ev_int16_t ...
166*663afb9bSAndroid Build Coastguard Worker #else
167*663afb9bSAndroid Build Coastguard Worker #error "No way to define ev_uint16_t"
168*663afb9bSAndroid Build Coastguard Worker #endif
169*663afb9bSAndroid Build Coastguard Worker 
170*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_UINT8_T
171*663afb9bSAndroid Build Coastguard Worker #define ev_uint8_t uint8_t
172*663afb9bSAndroid Build Coastguard Worker #define ev_int8_t int8_t
173*663afb9bSAndroid Build Coastguard Worker #elif defined(EVENT_IN_DOXYGEN_)
174*663afb9bSAndroid Build Coastguard Worker #define ev_uint8_t ...
175*663afb9bSAndroid Build Coastguard Worker #define ev_int8_t ...
176*663afb9bSAndroid Build Coastguard Worker #else
177*663afb9bSAndroid Build Coastguard Worker #define ev_uint8_t unsigned char
178*663afb9bSAndroid Build Coastguard Worker #define ev_int8_t signed char
179*663afb9bSAndroid Build Coastguard Worker #endif
180*663afb9bSAndroid Build Coastguard Worker 
181*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_UINTPTR_T
182*663afb9bSAndroid Build Coastguard Worker #define ev_uintptr_t uintptr_t
183*663afb9bSAndroid Build Coastguard Worker #define ev_intptr_t intptr_t
184*663afb9bSAndroid Build Coastguard Worker #elif EVENT__SIZEOF_VOID_P <= 4
185*663afb9bSAndroid Build Coastguard Worker #define ev_uintptr_t ev_uint32_t
186*663afb9bSAndroid Build Coastguard Worker #define ev_intptr_t ev_int32_t
187*663afb9bSAndroid Build Coastguard Worker #elif EVENT__SIZEOF_VOID_P <= 8
188*663afb9bSAndroid Build Coastguard Worker #define ev_uintptr_t ev_uint64_t
189*663afb9bSAndroid Build Coastguard Worker #define ev_intptr_t ev_int64_t
190*663afb9bSAndroid Build Coastguard Worker #elif defined(EVENT_IN_DOXYGEN_)
191*663afb9bSAndroid Build Coastguard Worker #define ev_uintptr_t ...
192*663afb9bSAndroid Build Coastguard Worker #define ev_intptr_t ...
193*663afb9bSAndroid Build Coastguard Worker #else
194*663afb9bSAndroid Build Coastguard Worker #error "No way to define ev_uintptr_t"
195*663afb9bSAndroid Build Coastguard Worker #endif
196*663afb9bSAndroid Build Coastguard Worker 
197*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__ssize_t
198*663afb9bSAndroid Build Coastguard Worker #define ev_ssize_t EVENT__ssize_t
199*663afb9bSAndroid Build Coastguard Worker #else
200*663afb9bSAndroid Build Coastguard Worker #define ev_ssize_t ssize_t
201*663afb9bSAndroid Build Coastguard Worker #endif
202*663afb9bSAndroid Build Coastguard Worker 
203*663afb9bSAndroid Build Coastguard Worker /* Note that we define ev_off_t based on the compile-time size of off_t that
204*663afb9bSAndroid Build Coastguard Worker  * we used to build Libevent, and not based on the current size of off_t.
205*663afb9bSAndroid Build Coastguard Worker  * (For example, we don't define ev_off_t to off_t.).  We do this because
206*663afb9bSAndroid Build Coastguard Worker  * some systems let you build your software with different off_t sizes
207*663afb9bSAndroid Build Coastguard Worker  * at runtime, and so putting in any dependency on off_t would risk API
208*663afb9bSAndroid Build Coastguard Worker  * mismatch.
209*663afb9bSAndroid Build Coastguard Worker  */
210*663afb9bSAndroid Build Coastguard Worker #ifdef _WIN32
211*663afb9bSAndroid Build Coastguard Worker #define ev_off_t ev_int64_t
212*663afb9bSAndroid Build Coastguard Worker #elif EVENT__SIZEOF_OFF_T == 8
213*663afb9bSAndroid Build Coastguard Worker #define ev_off_t ev_int64_t
214*663afb9bSAndroid Build Coastguard Worker #elif EVENT__SIZEOF_OFF_T == 4
215*663afb9bSAndroid Build Coastguard Worker #define ev_off_t ev_int32_t
216*663afb9bSAndroid Build Coastguard Worker #elif defined(EVENT_IN_DOXYGEN_)
217*663afb9bSAndroid Build Coastguard Worker #define ev_off_t ...
218*663afb9bSAndroid Build Coastguard Worker #else
219*663afb9bSAndroid Build Coastguard Worker #define ev_off_t off_t
220*663afb9bSAndroid Build Coastguard Worker #endif
221*663afb9bSAndroid Build Coastguard Worker /**@}*/
222*663afb9bSAndroid Build Coastguard Worker 
223*663afb9bSAndroid Build Coastguard Worker /* Limits for integer types.
224*663afb9bSAndroid Build Coastguard Worker 
225*663afb9bSAndroid Build Coastguard Worker    We're making two assumptions here:
226*663afb9bSAndroid Build Coastguard Worker      - The compiler does constant folding properly.
227*663afb9bSAndroid Build Coastguard Worker      - The platform does signed arithmetic in two's complement.
228*663afb9bSAndroid Build Coastguard Worker */
229*663afb9bSAndroid Build Coastguard Worker 
230*663afb9bSAndroid Build Coastguard Worker /**
231*663afb9bSAndroid Build Coastguard Worker    @name Limits for integer types
232*663afb9bSAndroid Build Coastguard Worker 
233*663afb9bSAndroid Build Coastguard Worker    These macros hold the largest or smallest values possible for the
234*663afb9bSAndroid Build Coastguard Worker    ev_[u]int*_t types.
235*663afb9bSAndroid Build Coastguard Worker 
236*663afb9bSAndroid Build Coastguard Worker    @{
237*663afb9bSAndroid Build Coastguard Worker */
238*663afb9bSAndroid Build Coastguard Worker #ifndef EVENT__HAVE_STDINT_H
239*663afb9bSAndroid Build Coastguard Worker #define EV_UINT64_MAX ((((ev_uint64_t)0xffffffffUL) << 32) | 0xffffffffUL)
240*663afb9bSAndroid Build Coastguard Worker #define EV_INT64_MAX  ((((ev_int64_t) 0x7fffffffL) << 32) | 0xffffffffL)
241*663afb9bSAndroid Build Coastguard Worker #define EV_INT64_MIN  ((-EV_INT64_MAX) - 1)
242*663afb9bSAndroid Build Coastguard Worker #define EV_UINT32_MAX ((ev_uint32_t)0xffffffffUL)
243*663afb9bSAndroid Build Coastguard Worker #define EV_INT32_MAX  ((ev_int32_t) 0x7fffffffL)
244*663afb9bSAndroid Build Coastguard Worker #define EV_INT32_MIN  ((-EV_INT32_MAX) - 1)
245*663afb9bSAndroid Build Coastguard Worker #define EV_UINT16_MAX ((ev_uint16_t)0xffffUL)
246*663afb9bSAndroid Build Coastguard Worker #define EV_INT16_MAX  ((ev_int16_t) 0x7fffL)
247*663afb9bSAndroid Build Coastguard Worker #define EV_INT16_MIN  ((-EV_INT16_MAX) - 1)
248*663afb9bSAndroid Build Coastguard Worker #define EV_UINT8_MAX  255
249*663afb9bSAndroid Build Coastguard Worker #define EV_INT8_MAX   127
250*663afb9bSAndroid Build Coastguard Worker #define EV_INT8_MIN   ((-EV_INT8_MAX) - 1)
251*663afb9bSAndroid Build Coastguard Worker #else
252*663afb9bSAndroid Build Coastguard Worker #define EV_UINT64_MAX UINT64_MAX
253*663afb9bSAndroid Build Coastguard Worker #define EV_INT64_MAX  INT64_MAX
254*663afb9bSAndroid Build Coastguard Worker #define EV_INT64_MIN  INT64_MIN
255*663afb9bSAndroid Build Coastguard Worker #define EV_UINT32_MAX UINT32_MAX
256*663afb9bSAndroid Build Coastguard Worker #define EV_INT32_MAX  INT32_MAX
257*663afb9bSAndroid Build Coastguard Worker #define EV_INT32_MIN  INT32_MIN
258*663afb9bSAndroid Build Coastguard Worker #define EV_UINT16_MAX UINT16_MAX
259*663afb9bSAndroid Build Coastguard Worker #define EV_INT16_MIN  INT16_MIN
260*663afb9bSAndroid Build Coastguard Worker #define EV_INT16_MAX  INT16_MAX
261*663afb9bSAndroid Build Coastguard Worker #define EV_UINT8_MAX  UINT8_MAX
262*663afb9bSAndroid Build Coastguard Worker #define EV_INT8_MAX   INT8_MAX
263*663afb9bSAndroid Build Coastguard Worker #define EV_INT8_MIN   INT8_MIN
264*663afb9bSAndroid Build Coastguard Worker /** @} */
265*663afb9bSAndroid Build Coastguard Worker #endif
266*663afb9bSAndroid Build Coastguard Worker 
267*663afb9bSAndroid Build Coastguard Worker 
268*663afb9bSAndroid Build Coastguard Worker /**
269*663afb9bSAndroid Build Coastguard Worker    @name Limits for SIZE_T and SSIZE_T
270*663afb9bSAndroid Build Coastguard Worker 
271*663afb9bSAndroid Build Coastguard Worker    @{
272*663afb9bSAndroid Build Coastguard Worker */
273*663afb9bSAndroid Build Coastguard Worker #if EVENT__SIZEOF_SIZE_T == 8
274*663afb9bSAndroid Build Coastguard Worker #define EV_SIZE_MAX EV_UINT64_MAX
275*663afb9bSAndroid Build Coastguard Worker #define EV_SSIZE_MAX EV_INT64_MAX
276*663afb9bSAndroid Build Coastguard Worker #elif EVENT__SIZEOF_SIZE_T == 4
277*663afb9bSAndroid Build Coastguard Worker #define EV_SIZE_MAX EV_UINT32_MAX
278*663afb9bSAndroid Build Coastguard Worker #define EV_SSIZE_MAX EV_INT32_MAX
279*663afb9bSAndroid Build Coastguard Worker #elif defined(EVENT_IN_DOXYGEN_)
280*663afb9bSAndroid Build Coastguard Worker #define EV_SIZE_MAX ...
281*663afb9bSAndroid Build Coastguard Worker #define EV_SSIZE_MAX ...
282*663afb9bSAndroid Build Coastguard Worker #else
283*663afb9bSAndroid Build Coastguard Worker #error "No way to define SIZE_MAX"
284*663afb9bSAndroid Build Coastguard Worker #endif
285*663afb9bSAndroid Build Coastguard Worker 
286*663afb9bSAndroid Build Coastguard Worker #define EV_SSIZE_MIN ((-EV_SSIZE_MAX) - 1)
287*663afb9bSAndroid Build Coastguard Worker /**@}*/
288*663afb9bSAndroid Build Coastguard Worker 
289*663afb9bSAndroid Build Coastguard Worker #ifdef _WIN32
290*663afb9bSAndroid Build Coastguard Worker #define ev_socklen_t int
291*663afb9bSAndroid Build Coastguard Worker #elif defined(EVENT__socklen_t)
292*663afb9bSAndroid Build Coastguard Worker #define ev_socklen_t EVENT__socklen_t
293*663afb9bSAndroid Build Coastguard Worker #else
294*663afb9bSAndroid Build Coastguard Worker #define ev_socklen_t socklen_t
295*663afb9bSAndroid Build Coastguard Worker #endif
296*663afb9bSAndroid Build Coastguard Worker 
297*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY
298*663afb9bSAndroid Build Coastguard Worker #if !defined(EVENT__HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY) \
299*663afb9bSAndroid Build Coastguard Worker  && !defined(ss_family)
300*663afb9bSAndroid Build Coastguard Worker #define ss_family __ss_family
301*663afb9bSAndroid Build Coastguard Worker #endif
302*663afb9bSAndroid Build Coastguard Worker #endif
303*663afb9bSAndroid Build Coastguard Worker 
304*663afb9bSAndroid Build Coastguard Worker /**
305*663afb9bSAndroid Build Coastguard Worker  * A type wide enough to hold the output of "socket()" or "accept()".  On
306*663afb9bSAndroid Build Coastguard Worker  * Windows, this is an intptr_t; elsewhere, it is an int. */
307*663afb9bSAndroid Build Coastguard Worker #ifdef _WIN32
308*663afb9bSAndroid Build Coastguard Worker #define evutil_socket_t intptr_t
309*663afb9bSAndroid Build Coastguard Worker #else
310*663afb9bSAndroid Build Coastguard Worker #define evutil_socket_t int
311*663afb9bSAndroid Build Coastguard Worker #endif
312*663afb9bSAndroid Build Coastguard Worker 
313*663afb9bSAndroid Build Coastguard Worker /**
314*663afb9bSAndroid Build Coastguard Worker  * Structure to hold information about a monotonic timer
315*663afb9bSAndroid Build Coastguard Worker  *
316*663afb9bSAndroid Build Coastguard Worker  * Use this with evutil_configure_monotonic_time() and
317*663afb9bSAndroid Build Coastguard Worker  * evutil_gettime_monotonic().
318*663afb9bSAndroid Build Coastguard Worker  *
319*663afb9bSAndroid Build Coastguard Worker  * This is an opaque structure; you can allocate one using
320*663afb9bSAndroid Build Coastguard Worker  * evutil_monotonic_timer_new().
321*663afb9bSAndroid Build Coastguard Worker  *
322*663afb9bSAndroid Build Coastguard Worker  * @see evutil_monotonic_timer_new(), evutil_monotonic_timer_free(),
323*663afb9bSAndroid Build Coastguard Worker  * evutil_configure_monotonic_time(), evutil_gettime_monotonic()
324*663afb9bSAndroid Build Coastguard Worker  */
325*663afb9bSAndroid Build Coastguard Worker struct evutil_monotonic_timer
326*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT_IN_DOXYGEN_
327*663afb9bSAndroid Build Coastguard Worker {/*Empty body so that doxygen will generate documentation here.*/}
328*663afb9bSAndroid Build Coastguard Worker #endif
329*663afb9bSAndroid Build Coastguard Worker ;
330*663afb9bSAndroid Build Coastguard Worker 
331*663afb9bSAndroid Build Coastguard Worker #define EV_MONOT_PRECISE  1
332*663afb9bSAndroid Build Coastguard Worker #define EV_MONOT_FALLBACK 2
333*663afb9bSAndroid Build Coastguard Worker 
334*663afb9bSAndroid Build Coastguard Worker /** Format a date string using RFC 1123 format (used in HTTP).
335*663afb9bSAndroid Build Coastguard Worker  * If `tm` is NULL, current system's time will be used.
336*663afb9bSAndroid Build Coastguard Worker  * The number of characters written will be returned.
337*663afb9bSAndroid Build Coastguard Worker  * One should check if the return value is smaller than `datelen` to check if
338*663afb9bSAndroid Build Coastguard Worker  * the result is truncated or not.
339*663afb9bSAndroid Build Coastguard Worker  */
340*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL int
341*663afb9bSAndroid Build Coastguard Worker evutil_date_rfc1123(char *date, const size_t datelen, const struct tm *tm);
342*663afb9bSAndroid Build Coastguard Worker 
343*663afb9bSAndroid Build Coastguard Worker /** Allocate a new struct evutil_monotonic_timer for use with the
344*663afb9bSAndroid Build Coastguard Worker  * evutil_configure_monotonic_time() and evutil_gettime_monotonic()
345*663afb9bSAndroid Build Coastguard Worker  * functions.  You must configure the timer with
346*663afb9bSAndroid Build Coastguard Worker  * evutil_configure_monotonic_time() before using it.
347*663afb9bSAndroid Build Coastguard Worker  */
348*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
349*663afb9bSAndroid Build Coastguard Worker struct evutil_monotonic_timer * evutil_monotonic_timer_new(void);
350*663afb9bSAndroid Build Coastguard Worker 
351*663afb9bSAndroid Build Coastguard Worker /** Free a struct evutil_monotonic_timer that was allocated using
352*663afb9bSAndroid Build Coastguard Worker  * evutil_monotonic_timer_new().
353*663afb9bSAndroid Build Coastguard Worker  */
354*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
355*663afb9bSAndroid Build Coastguard Worker void evutil_monotonic_timer_free(struct evutil_monotonic_timer *timer);
356*663afb9bSAndroid Build Coastguard Worker 
357*663afb9bSAndroid Build Coastguard Worker /** Set up a struct evutil_monotonic_timer; flags can include
358*663afb9bSAndroid Build Coastguard Worker  * EV_MONOT_PRECISE and EV_MONOT_FALLBACK.
359*663afb9bSAndroid Build Coastguard Worker  */
360*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
361*663afb9bSAndroid Build Coastguard Worker int evutil_configure_monotonic_time(struct evutil_monotonic_timer *timer,
362*663afb9bSAndroid Build Coastguard Worker                                     int flags);
363*663afb9bSAndroid Build Coastguard Worker 
364*663afb9bSAndroid Build Coastguard Worker /** Query the current monotonic time from a struct evutil_monotonic_timer
365*663afb9bSAndroid Build Coastguard Worker  * previously configured with evutil_configure_monotonic_time().  Monotonic
366*663afb9bSAndroid Build Coastguard Worker  * time is guaranteed never to run in reverse, but is not necessarily epoch-
367*663afb9bSAndroid Build Coastguard Worker  * based, or relative to any other definite point.  Use it to make reliable
368*663afb9bSAndroid Build Coastguard Worker  * measurements of elapsed time between events even when the system time
369*663afb9bSAndroid Build Coastguard Worker  * may be changed.
370*663afb9bSAndroid Build Coastguard Worker  *
371*663afb9bSAndroid Build Coastguard Worker  * It is not safe to use this funtion on the same timer from multiple
372*663afb9bSAndroid Build Coastguard Worker  * threads.
373*663afb9bSAndroid Build Coastguard Worker  */
374*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
375*663afb9bSAndroid Build Coastguard Worker int evutil_gettime_monotonic(struct evutil_monotonic_timer *timer,
376*663afb9bSAndroid Build Coastguard Worker                              struct timeval *tp);
377*663afb9bSAndroid Build Coastguard Worker 
378*663afb9bSAndroid Build Coastguard Worker /** Create two new sockets that are connected to each other.
379*663afb9bSAndroid Build Coastguard Worker 
380*663afb9bSAndroid Build Coastguard Worker     On Unix, this simply calls socketpair().  On Windows, it uses the
381*663afb9bSAndroid Build Coastguard Worker     loopback network interface on 127.0.0.1, and only
382*663afb9bSAndroid Build Coastguard Worker     AF_INET,SOCK_STREAM are supported.
383*663afb9bSAndroid Build Coastguard Worker 
384*663afb9bSAndroid Build Coastguard Worker     (This may fail on some Windows hosts where firewall software has cleverly
385*663afb9bSAndroid Build Coastguard Worker     decided to keep 127.0.0.1 from talking to itself.)
386*663afb9bSAndroid Build Coastguard Worker 
387*663afb9bSAndroid Build Coastguard Worker     Parameters and return values are as for socketpair()
388*663afb9bSAndroid Build Coastguard Worker */
389*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
390*663afb9bSAndroid Build Coastguard Worker int evutil_socketpair(int d, int type, int protocol, evutil_socket_t sv[2]);
391*663afb9bSAndroid Build Coastguard Worker /** Do platform-specific operations as needed to make a socket nonblocking.
392*663afb9bSAndroid Build Coastguard Worker 
393*663afb9bSAndroid Build Coastguard Worker     @param sock The socket to make nonblocking
394*663afb9bSAndroid Build Coastguard Worker     @return 0 on success, -1 on failure
395*663afb9bSAndroid Build Coastguard Worker  */
396*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
397*663afb9bSAndroid Build Coastguard Worker int evutil_make_socket_nonblocking(evutil_socket_t sock);
398*663afb9bSAndroid Build Coastguard Worker 
399*663afb9bSAndroid Build Coastguard Worker /** Do platform-specific operations to make a listener socket reusable.
400*663afb9bSAndroid Build Coastguard Worker 
401*663afb9bSAndroid Build Coastguard Worker     Specifically, we want to make sure that another program will be able
402*663afb9bSAndroid Build Coastguard Worker     to bind this address right after we've closed the listener.
403*663afb9bSAndroid Build Coastguard Worker 
404*663afb9bSAndroid Build Coastguard Worker     This differs from Windows's interpretation of "reusable", which
405*663afb9bSAndroid Build Coastguard Worker     allows multiple listeners to bind the same address at the same time.
406*663afb9bSAndroid Build Coastguard Worker 
407*663afb9bSAndroid Build Coastguard Worker     @param sock The socket to make reusable
408*663afb9bSAndroid Build Coastguard Worker     @return 0 on success, -1 on failure
409*663afb9bSAndroid Build Coastguard Worker  */
410*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
411*663afb9bSAndroid Build Coastguard Worker int evutil_make_listen_socket_reuseable(evutil_socket_t sock);
412*663afb9bSAndroid Build Coastguard Worker 
413*663afb9bSAndroid Build Coastguard Worker /** Do platform-specific operations to make a listener port reusable.
414*663afb9bSAndroid Build Coastguard Worker 
415*663afb9bSAndroid Build Coastguard Worker     Specifically, we want to make sure that multiple programs which also
416*663afb9bSAndroid Build Coastguard Worker     set the same socket option will be able to bind, listen at the same time.
417*663afb9bSAndroid Build Coastguard Worker 
418*663afb9bSAndroid Build Coastguard Worker     This is a feature available only to Linux 3.9+
419*663afb9bSAndroid Build Coastguard Worker 
420*663afb9bSAndroid Build Coastguard Worker     @param sock The socket to make reusable
421*663afb9bSAndroid Build Coastguard Worker     @return 0 on success, -1 on failure
422*663afb9bSAndroid Build Coastguard Worker  */
423*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
424*663afb9bSAndroid Build Coastguard Worker int evutil_make_listen_socket_reuseable_port(evutil_socket_t sock);
425*663afb9bSAndroid Build Coastguard Worker 
426*663afb9bSAndroid Build Coastguard Worker /** Set ipv6 only bind socket option to make listener work only in ipv6 sockets.
427*663afb9bSAndroid Build Coastguard Worker 
428*663afb9bSAndroid Build Coastguard Worker     According to RFC3493 and most Linux distributions, default value for the
429*663afb9bSAndroid Build Coastguard Worker     sockets is to work in IPv4-mapped mode. In IPv4-mapped mode, it is not possible
430*663afb9bSAndroid Build Coastguard Worker     to bind same port from different IPv4 and IPv6 handlers.
431*663afb9bSAndroid Build Coastguard Worker 
432*663afb9bSAndroid Build Coastguard Worker     @param sock The socket to make in ipv6only working mode
433*663afb9bSAndroid Build Coastguard Worker     @return 0 on success, -1 on failure
434*663afb9bSAndroid Build Coastguard Worker  */
435*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
436*663afb9bSAndroid Build Coastguard Worker int evutil_make_listen_socket_ipv6only(evutil_socket_t sock);
437*663afb9bSAndroid Build Coastguard Worker 
438*663afb9bSAndroid Build Coastguard Worker /** Do platform-specific operations as needed to close a socket upon a
439*663afb9bSAndroid Build Coastguard Worker     successful execution of one of the exec*() functions.
440*663afb9bSAndroid Build Coastguard Worker 
441*663afb9bSAndroid Build Coastguard Worker     @param sock The socket to be closed
442*663afb9bSAndroid Build Coastguard Worker     @return 0 on success, -1 on failure
443*663afb9bSAndroid Build Coastguard Worker  */
444*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
445*663afb9bSAndroid Build Coastguard Worker int evutil_make_socket_closeonexec(evutil_socket_t sock);
446*663afb9bSAndroid Build Coastguard Worker 
447*663afb9bSAndroid Build Coastguard Worker /** Do the platform-specific call needed to close a socket returned from
448*663afb9bSAndroid Build Coastguard Worker     socket() or accept().
449*663afb9bSAndroid Build Coastguard Worker 
450*663afb9bSAndroid Build Coastguard Worker     @param sock The socket to be closed
451*663afb9bSAndroid Build Coastguard Worker     @return 0 on success (whether the operation is supported or not),
452*663afb9bSAndroid Build Coastguard Worker             -1 on failure
453*663afb9bSAndroid Build Coastguard Worker  */
454*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
455*663afb9bSAndroid Build Coastguard Worker int evutil_closesocket(evutil_socket_t sock);
456*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_CLOSESOCKET(s) evutil_closesocket(s)
457*663afb9bSAndroid Build Coastguard Worker 
458*663afb9bSAndroid Build Coastguard Worker /** Do platform-specific operations, if possible, to make a tcp listener
459*663afb9bSAndroid Build Coastguard Worker  *  socket defer accept()s until there is data to read.
460*663afb9bSAndroid Build Coastguard Worker  *
461*663afb9bSAndroid Build Coastguard Worker  *  Not all platforms support this.  You don't want to do this for every
462*663afb9bSAndroid Build Coastguard Worker  *  listener socket: only the ones that implement a protocol where the
463*663afb9bSAndroid Build Coastguard Worker  *  client transmits before the server needs to respond.
464*663afb9bSAndroid Build Coastguard Worker  *
465*663afb9bSAndroid Build Coastguard Worker  *  @param sock The listening socket to to make deferred
466*663afb9bSAndroid Build Coastguard Worker  *  @return 0 on success (whether the operation is supported or not),
467*663afb9bSAndroid Build Coastguard Worker  *       -1 on failure
468*663afb9bSAndroid Build Coastguard Worker */
469*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
470*663afb9bSAndroid Build Coastguard Worker int evutil_make_tcp_listen_socket_deferred(evutil_socket_t sock);
471*663afb9bSAndroid Build Coastguard Worker 
472*663afb9bSAndroid Build Coastguard Worker #ifdef _WIN32
473*663afb9bSAndroid Build Coastguard Worker /** Return the most recent socket error.  Not idempotent on all platforms. */
474*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_SOCKET_ERROR() WSAGetLastError()
475*663afb9bSAndroid Build Coastguard Worker /** Replace the most recent socket error with errcode */
476*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_SET_SOCKET_ERROR(errcode)		\
477*663afb9bSAndroid Build Coastguard Worker 	do { WSASetLastError(errcode); } while (0)
478*663afb9bSAndroid Build Coastguard Worker /** Return the most recent socket error to occur on sock. */
479*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
480*663afb9bSAndroid Build Coastguard Worker int evutil_socket_geterror(evutil_socket_t sock);
481*663afb9bSAndroid Build Coastguard Worker /** Convert a socket error to a string. */
482*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
483*663afb9bSAndroid Build Coastguard Worker const char *evutil_socket_error_to_string(int errcode);
484*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_INVALID_SOCKET INVALID_SOCKET
485*663afb9bSAndroid Build Coastguard Worker #elif defined(EVENT_IN_DOXYGEN_)
486*663afb9bSAndroid Build Coastguard Worker /**
487*663afb9bSAndroid Build Coastguard Worker    @name Socket error functions
488*663afb9bSAndroid Build Coastguard Worker 
489*663afb9bSAndroid Build Coastguard Worker    These functions are needed for making programs compatible between
490*663afb9bSAndroid Build Coastguard Worker    Windows and Unix-like platforms.
491*663afb9bSAndroid Build Coastguard Worker 
492*663afb9bSAndroid Build Coastguard Worker    You see, Winsock handles socket errors differently from the rest of
493*663afb9bSAndroid Build Coastguard Worker    the world.  Elsewhere, a socket error is like any other error and is
494*663afb9bSAndroid Build Coastguard Worker    stored in errno.  But winsock functions require you to retrieve the
495*663afb9bSAndroid Build Coastguard Worker    error with a special function, and don't let you use strerror for
496*663afb9bSAndroid Build Coastguard Worker    the error codes.  And handling EWOULDBLOCK is ... different.
497*663afb9bSAndroid Build Coastguard Worker 
498*663afb9bSAndroid Build Coastguard Worker    @{
499*663afb9bSAndroid Build Coastguard Worker */
500*663afb9bSAndroid Build Coastguard Worker /** Return the most recent socket error.  Not idempotent on all platforms. */
501*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_SOCKET_ERROR() ...
502*663afb9bSAndroid Build Coastguard Worker /** Replace the most recent socket error with errcode */
503*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_SET_SOCKET_ERROR(errcode) ...
504*663afb9bSAndroid Build Coastguard Worker /** Return the most recent socket error to occur on sock. */
505*663afb9bSAndroid Build Coastguard Worker #define evutil_socket_geterror(sock) ...
506*663afb9bSAndroid Build Coastguard Worker /** Convert a socket error to a string. */
507*663afb9bSAndroid Build Coastguard Worker #define evutil_socket_error_to_string(errcode) ...
508*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_INVALID_SOCKET -1
509*663afb9bSAndroid Build Coastguard Worker /**@}*/
510*663afb9bSAndroid Build Coastguard Worker #else /** !EVENT_IN_DOXYGEN_ && !_WIN32 */
511*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_SOCKET_ERROR() (errno)
512*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_SET_SOCKET_ERROR(errcode)		\
513*663afb9bSAndroid Build Coastguard Worker 		do { errno = (errcode); } while (0)
514*663afb9bSAndroid Build Coastguard Worker #define evutil_socket_geterror(sock) (errno)
515*663afb9bSAndroid Build Coastguard Worker #define evutil_socket_error_to_string(errcode) (strerror(errcode))
516*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_INVALID_SOCKET -1
517*663afb9bSAndroid Build Coastguard Worker #endif /** !_WIN32 */
518*663afb9bSAndroid Build Coastguard Worker 
519*663afb9bSAndroid Build Coastguard Worker 
520*663afb9bSAndroid Build Coastguard Worker /**
521*663afb9bSAndroid Build Coastguard Worker  * @name Manipulation macros for struct timeval.
522*663afb9bSAndroid Build Coastguard Worker  *
523*663afb9bSAndroid Build Coastguard Worker  * We define replacements
524*663afb9bSAndroid Build Coastguard Worker  * for timeradd, timersub, timerclear, timercmp, and timerisset.
525*663afb9bSAndroid Build Coastguard Worker  *
526*663afb9bSAndroid Build Coastguard Worker  * @{
527*663afb9bSAndroid Build Coastguard Worker  */
528*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_TIMERADD
529*663afb9bSAndroid Build Coastguard Worker #define evutil_timeradd(tvp, uvp, vvp) timeradd((tvp), (uvp), (vvp))
530*663afb9bSAndroid Build Coastguard Worker #define evutil_timersub(tvp, uvp, vvp) timersub((tvp), (uvp), (vvp))
531*663afb9bSAndroid Build Coastguard Worker #else
532*663afb9bSAndroid Build Coastguard Worker #define evutil_timeradd(tvp, uvp, vvp)					\
533*663afb9bSAndroid Build Coastguard Worker 	do {								\
534*663afb9bSAndroid Build Coastguard Worker 		(vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec;		\
535*663afb9bSAndroid Build Coastguard Worker 		(vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec;       \
536*663afb9bSAndroid Build Coastguard Worker 		if ((vvp)->tv_usec >= 1000000) {			\
537*663afb9bSAndroid Build Coastguard Worker 			(vvp)->tv_sec++;				\
538*663afb9bSAndroid Build Coastguard Worker 			(vvp)->tv_usec -= 1000000;			\
539*663afb9bSAndroid Build Coastguard Worker 		}							\
540*663afb9bSAndroid Build Coastguard Worker 	} while (0)
541*663afb9bSAndroid Build Coastguard Worker #define	evutil_timersub(tvp, uvp, vvp)					\
542*663afb9bSAndroid Build Coastguard Worker 	do {								\
543*663afb9bSAndroid Build Coastguard Worker 		(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec;		\
544*663afb9bSAndroid Build Coastguard Worker 		(vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec;	\
545*663afb9bSAndroid Build Coastguard Worker 		if ((vvp)->tv_usec < 0) {				\
546*663afb9bSAndroid Build Coastguard Worker 			(vvp)->tv_sec--;				\
547*663afb9bSAndroid Build Coastguard Worker 			(vvp)->tv_usec += 1000000;			\
548*663afb9bSAndroid Build Coastguard Worker 		}							\
549*663afb9bSAndroid Build Coastguard Worker 	} while (0)
550*663afb9bSAndroid Build Coastguard Worker #endif /* !EVENT__HAVE_TIMERADD */
551*663afb9bSAndroid Build Coastguard Worker 
552*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_TIMERCLEAR
553*663afb9bSAndroid Build Coastguard Worker #define evutil_timerclear(tvp) timerclear(tvp)
554*663afb9bSAndroid Build Coastguard Worker #else
555*663afb9bSAndroid Build Coastguard Worker #define	evutil_timerclear(tvp)	(tvp)->tv_sec = (tvp)->tv_usec = 0
556*663afb9bSAndroid Build Coastguard Worker #endif
557*663afb9bSAndroid Build Coastguard Worker /**@}*/
558*663afb9bSAndroid Build Coastguard Worker 
559*663afb9bSAndroid Build Coastguard Worker /** Return true iff the tvp is related to uvp according to the relational
560*663afb9bSAndroid Build Coastguard Worker  * operator cmp.  Recognized values for cmp are ==, <=, <, >=, and >. */
561*663afb9bSAndroid Build Coastguard Worker #define	evutil_timercmp(tvp, uvp, cmp)					\
562*663afb9bSAndroid Build Coastguard Worker 	(((tvp)->tv_sec == (uvp)->tv_sec) ?				\
563*663afb9bSAndroid Build Coastguard Worker 	 ((tvp)->tv_usec cmp (uvp)->tv_usec) :				\
564*663afb9bSAndroid Build Coastguard Worker 	 ((tvp)->tv_sec cmp (uvp)->tv_sec))
565*663afb9bSAndroid Build Coastguard Worker 
566*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_TIMERISSET
567*663afb9bSAndroid Build Coastguard Worker #define evutil_timerisset(tvp) timerisset(tvp)
568*663afb9bSAndroid Build Coastguard Worker #else
569*663afb9bSAndroid Build Coastguard Worker #define	evutil_timerisset(tvp)	((tvp)->tv_sec || (tvp)->tv_usec)
570*663afb9bSAndroid Build Coastguard Worker #endif
571*663afb9bSAndroid Build Coastguard Worker 
572*663afb9bSAndroid Build Coastguard Worker /** Replacement for offsetof on platforms that don't define it. */
573*663afb9bSAndroid Build Coastguard Worker #ifdef offsetof
574*663afb9bSAndroid Build Coastguard Worker #define evutil_offsetof(type, field) offsetof(type, field)
575*663afb9bSAndroid Build Coastguard Worker #else
576*663afb9bSAndroid Build Coastguard Worker #define evutil_offsetof(type, field) ((off_t)(&((type *)0)->field))
577*663afb9bSAndroid Build Coastguard Worker #endif
578*663afb9bSAndroid Build Coastguard Worker 
579*663afb9bSAndroid Build Coastguard Worker /* big-int related functions */
580*663afb9bSAndroid Build Coastguard Worker /** Parse a 64-bit value from a string.  Arguments are as for strtol. */
581*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
582*663afb9bSAndroid Build Coastguard Worker ev_int64_t evutil_strtoll(const char *s, char **endptr, int base);
583*663afb9bSAndroid Build Coastguard Worker 
584*663afb9bSAndroid Build Coastguard Worker /** Replacement for gettimeofday on platforms that lack it. */
585*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_GETTIMEOFDAY
586*663afb9bSAndroid Build Coastguard Worker #define evutil_gettimeofday(tv, tz) gettimeofday((tv), (tz))
587*663afb9bSAndroid Build Coastguard Worker #else
588*663afb9bSAndroid Build Coastguard Worker struct timezone;
589*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
590*663afb9bSAndroid Build Coastguard Worker int evutil_gettimeofday(struct timeval *tv, struct timezone *tz);
591*663afb9bSAndroid Build Coastguard Worker #endif
592*663afb9bSAndroid Build Coastguard Worker 
593*663afb9bSAndroid Build Coastguard Worker /** Replacement for snprintf to get consistent behavior on platforms for
594*663afb9bSAndroid Build Coastguard Worker     which the return value of snprintf does not conform to C99.
595*663afb9bSAndroid Build Coastguard Worker  */
596*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
597*663afb9bSAndroid Build Coastguard Worker int evutil_snprintf(char *buf, size_t buflen, const char *format, ...)
598*663afb9bSAndroid Build Coastguard Worker #ifdef __GNUC__
599*663afb9bSAndroid Build Coastguard Worker 	__attribute__((format(printf, 3, 4)))
600*663afb9bSAndroid Build Coastguard Worker #endif
601*663afb9bSAndroid Build Coastguard Worker ;
602*663afb9bSAndroid Build Coastguard Worker /** Replacement for vsnprintf to get consistent behavior on platforms for
603*663afb9bSAndroid Build Coastguard Worker     which the return value of snprintf does not conform to C99.
604*663afb9bSAndroid Build Coastguard Worker  */
605*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
606*663afb9bSAndroid Build Coastguard Worker int evutil_vsnprintf(char *buf, size_t buflen, const char *format, va_list ap)
607*663afb9bSAndroid Build Coastguard Worker #ifdef __GNUC__
608*663afb9bSAndroid Build Coastguard Worker 	__attribute__((format(printf, 3, 0)))
609*663afb9bSAndroid Build Coastguard Worker #endif
610*663afb9bSAndroid Build Coastguard Worker ;
611*663afb9bSAndroid Build Coastguard Worker 
612*663afb9bSAndroid Build Coastguard Worker /** Replacement for inet_ntop for platforms which lack it. */
613*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
614*663afb9bSAndroid Build Coastguard Worker const char *evutil_inet_ntop(int af, const void *src, char *dst, size_t len);
615*663afb9bSAndroid Build Coastguard Worker /** Variation of inet_pton that also parses IPv6 scopes. Public for
616*663afb9bSAndroid Build Coastguard Worker     unit tests. No reason to call this directly.
617*663afb9bSAndroid Build Coastguard Worker  */
618*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
619*663afb9bSAndroid Build Coastguard Worker int evutil_inet_pton_scope(int af, const char *src, void *dst,
620*663afb9bSAndroid Build Coastguard Worker 	unsigned *indexp);
621*663afb9bSAndroid Build Coastguard Worker /** Replacement for inet_pton for platforms which lack it. */
622*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
623*663afb9bSAndroid Build Coastguard Worker int evutil_inet_pton(int af, const char *src, void *dst);
624*663afb9bSAndroid Build Coastguard Worker struct sockaddr;
625*663afb9bSAndroid Build Coastguard Worker 
626*663afb9bSAndroid Build Coastguard Worker /** Parse an IPv4 or IPv6 address, with optional port, from a string.
627*663afb9bSAndroid Build Coastguard Worker 
628*663afb9bSAndroid Build Coastguard Worker     Recognized formats are:
629*663afb9bSAndroid Build Coastguard Worker     - [IPv6Address]:port
630*663afb9bSAndroid Build Coastguard Worker     - [IPv6Address]
631*663afb9bSAndroid Build Coastguard Worker     - IPv6Address
632*663afb9bSAndroid Build Coastguard Worker     - IPv4Address:port
633*663afb9bSAndroid Build Coastguard Worker     - IPv4Address
634*663afb9bSAndroid Build Coastguard Worker 
635*663afb9bSAndroid Build Coastguard Worker     If no port is specified, the port in the output is set to 0.
636*663afb9bSAndroid Build Coastguard Worker 
637*663afb9bSAndroid Build Coastguard Worker     @param str The string to parse.
638*663afb9bSAndroid Build Coastguard Worker     @param out A struct sockaddr to hold the result.  This should probably be
639*663afb9bSAndroid Build Coastguard Worker        a struct sockaddr_storage.
640*663afb9bSAndroid Build Coastguard Worker     @param outlen A pointer to the number of bytes that that 'out' can safely
641*663afb9bSAndroid Build Coastguard Worker        hold.  Set to the number of bytes used in 'out' on success.
642*663afb9bSAndroid Build Coastguard Worker     @return -1 if the address is not well-formed, if the port is out of range,
643*663afb9bSAndroid Build Coastguard Worker        or if out is not large enough to hold the result.  Otherwise returns
644*663afb9bSAndroid Build Coastguard Worker        0 on success.
645*663afb9bSAndroid Build Coastguard Worker */
646*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
647*663afb9bSAndroid Build Coastguard Worker int evutil_parse_sockaddr_port(const char *str, struct sockaddr *out, int *outlen);
648*663afb9bSAndroid Build Coastguard Worker 
649*663afb9bSAndroid Build Coastguard Worker /** Compare two sockaddrs; return 0 if they are equal, or less than 0 if sa1
650*663afb9bSAndroid Build Coastguard Worker  * preceeds sa2, or greater than 0 if sa1 follows sa2.  If include_port is
651*663afb9bSAndroid Build Coastguard Worker  * true, consider the port as well as the address.  Only implemented for
652*663afb9bSAndroid Build Coastguard Worker  * AF_INET and AF_INET6 addresses. The ordering is not guaranteed to remain
653*663afb9bSAndroid Build Coastguard Worker  * the same between Libevent versions. */
654*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
655*663afb9bSAndroid Build Coastguard Worker int evutil_sockaddr_cmp(const struct sockaddr *sa1, const struct sockaddr *sa2,
656*663afb9bSAndroid Build Coastguard Worker     int include_port);
657*663afb9bSAndroid Build Coastguard Worker 
658*663afb9bSAndroid Build Coastguard Worker /** As strcasecmp, but always compares the characters in locale-independent
659*663afb9bSAndroid Build Coastguard Worker     ASCII.  That's useful if you're handling data in ASCII-based protocols.
660*663afb9bSAndroid Build Coastguard Worker  */
661*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
662*663afb9bSAndroid Build Coastguard Worker int evutil_ascii_strcasecmp(const char *str1, const char *str2);
663*663afb9bSAndroid Build Coastguard Worker /** As strncasecmp, but always compares the characters in locale-independent
664*663afb9bSAndroid Build Coastguard Worker     ASCII.  That's useful if you're handling data in ASCII-based protocols.
665*663afb9bSAndroid Build Coastguard Worker  */
666*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
667*663afb9bSAndroid Build Coastguard Worker int evutil_ascii_strncasecmp(const char *str1, const char *str2, size_t n);
668*663afb9bSAndroid Build Coastguard Worker 
669*663afb9bSAndroid Build Coastguard Worker /* Here we define evutil_addrinfo to the native addrinfo type, or redefine it
670*663afb9bSAndroid Build Coastguard Worker  * if this system has no getaddrinfo(). */
671*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_STRUCT_ADDRINFO
672*663afb9bSAndroid Build Coastguard Worker #define evutil_addrinfo addrinfo
673*663afb9bSAndroid Build Coastguard Worker #else
674*663afb9bSAndroid Build Coastguard Worker /** A definition of struct addrinfo for systems that lack it.
675*663afb9bSAndroid Build Coastguard Worker 
676*663afb9bSAndroid Build Coastguard Worker     (This is just an alias for struct addrinfo if the system defines
677*663afb9bSAndroid Build Coastguard Worker     struct addrinfo.)
678*663afb9bSAndroid Build Coastguard Worker */
679*663afb9bSAndroid Build Coastguard Worker struct evutil_addrinfo {
680*663afb9bSAndroid Build Coastguard Worker 	int     ai_flags;     /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */
681*663afb9bSAndroid Build Coastguard Worker 	int     ai_family;    /* PF_xxx */
682*663afb9bSAndroid Build Coastguard Worker 	int     ai_socktype;  /* SOCK_xxx */
683*663afb9bSAndroid Build Coastguard Worker 	int     ai_protocol;  /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
684*663afb9bSAndroid Build Coastguard Worker 	size_t  ai_addrlen;   /* length of ai_addr */
685*663afb9bSAndroid Build Coastguard Worker 	char   *ai_canonname; /* canonical name for nodename */
686*663afb9bSAndroid Build Coastguard Worker 	struct sockaddr  *ai_addr; /* binary address */
687*663afb9bSAndroid Build Coastguard Worker 	struct evutil_addrinfo  *ai_next; /* next structure in linked list */
688*663afb9bSAndroid Build Coastguard Worker };
689*663afb9bSAndroid Build Coastguard Worker #endif
690*663afb9bSAndroid Build Coastguard Worker /** @name evutil_getaddrinfo() error codes
691*663afb9bSAndroid Build Coastguard Worker 
692*663afb9bSAndroid Build Coastguard Worker     These values are possible error codes for evutil_getaddrinfo() and
693*663afb9bSAndroid Build Coastguard Worker     related functions.
694*663afb9bSAndroid Build Coastguard Worker 
695*663afb9bSAndroid Build Coastguard Worker     @{
696*663afb9bSAndroid Build Coastguard Worker */
697*663afb9bSAndroid Build Coastguard Worker #if defined(EAI_ADDRFAMILY) && defined(EVENT__HAVE_GETADDRINFO)
698*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_ADDRFAMILY EAI_ADDRFAMILY
699*663afb9bSAndroid Build Coastguard Worker #else
700*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_ADDRFAMILY -901
701*663afb9bSAndroid Build Coastguard Worker #endif
702*663afb9bSAndroid Build Coastguard Worker #if defined(EAI_AGAIN) && defined(EVENT__HAVE_GETADDRINFO)
703*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_AGAIN EAI_AGAIN
704*663afb9bSAndroid Build Coastguard Worker #else
705*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_AGAIN -902
706*663afb9bSAndroid Build Coastguard Worker #endif
707*663afb9bSAndroid Build Coastguard Worker #if defined(EAI_BADFLAGS) && defined(EVENT__HAVE_GETADDRINFO)
708*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_BADFLAGS EAI_BADFLAGS
709*663afb9bSAndroid Build Coastguard Worker #else
710*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_BADFLAGS -903
711*663afb9bSAndroid Build Coastguard Worker #endif
712*663afb9bSAndroid Build Coastguard Worker #if defined(EAI_FAIL) && defined(EVENT__HAVE_GETADDRINFO)
713*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_FAIL EAI_FAIL
714*663afb9bSAndroid Build Coastguard Worker #else
715*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_FAIL -904
716*663afb9bSAndroid Build Coastguard Worker #endif
717*663afb9bSAndroid Build Coastguard Worker #if defined(EAI_FAMILY) && defined(EVENT__HAVE_GETADDRINFO)
718*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_FAMILY EAI_FAMILY
719*663afb9bSAndroid Build Coastguard Worker #else
720*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_FAMILY -905
721*663afb9bSAndroid Build Coastguard Worker #endif
722*663afb9bSAndroid Build Coastguard Worker #if defined(EAI_MEMORY) && defined(EVENT__HAVE_GETADDRINFO)
723*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_MEMORY EAI_MEMORY
724*663afb9bSAndroid Build Coastguard Worker #else
725*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_MEMORY -906
726*663afb9bSAndroid Build Coastguard Worker #endif
727*663afb9bSAndroid Build Coastguard Worker /* This test is a bit complicated, since some MS SDKs decide to
728*663afb9bSAndroid Build Coastguard Worker  * remove NODATA or redefine it to be the same as NONAME, in a
729*663afb9bSAndroid Build Coastguard Worker  * fun interpretation of RFC 2553 and RFC 3493. */
730*663afb9bSAndroid Build Coastguard Worker #if defined(EAI_NODATA) && defined(EVENT__HAVE_GETADDRINFO) && (!defined(EAI_NONAME) || EAI_NODATA != EAI_NONAME)
731*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_NODATA EAI_NODATA
732*663afb9bSAndroid Build Coastguard Worker #else
733*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_NODATA -907
734*663afb9bSAndroid Build Coastguard Worker #endif
735*663afb9bSAndroid Build Coastguard Worker #if defined(EAI_NONAME) && defined(EVENT__HAVE_GETADDRINFO)
736*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_NONAME EAI_NONAME
737*663afb9bSAndroid Build Coastguard Worker #else
738*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_NONAME -908
739*663afb9bSAndroid Build Coastguard Worker #endif
740*663afb9bSAndroid Build Coastguard Worker #if defined(EAI_SERVICE) && defined(EVENT__HAVE_GETADDRINFO)
741*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_SERVICE EAI_SERVICE
742*663afb9bSAndroid Build Coastguard Worker #else
743*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_SERVICE -909
744*663afb9bSAndroid Build Coastguard Worker #endif
745*663afb9bSAndroid Build Coastguard Worker #if defined(EAI_SOCKTYPE) && defined(EVENT__HAVE_GETADDRINFO)
746*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_SOCKTYPE EAI_SOCKTYPE
747*663afb9bSAndroid Build Coastguard Worker #else
748*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_SOCKTYPE -910
749*663afb9bSAndroid Build Coastguard Worker #endif
750*663afb9bSAndroid Build Coastguard Worker #if defined(EAI_SYSTEM) && defined(EVENT__HAVE_GETADDRINFO)
751*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_SYSTEM EAI_SYSTEM
752*663afb9bSAndroid Build Coastguard Worker #else
753*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_SYSTEM -911
754*663afb9bSAndroid Build Coastguard Worker #endif
755*663afb9bSAndroid Build Coastguard Worker 
756*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_CANCEL -90001
757*663afb9bSAndroid Build Coastguard Worker 
758*663afb9bSAndroid Build Coastguard Worker #if defined(AI_PASSIVE) && defined(EVENT__HAVE_GETADDRINFO)
759*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_AI_PASSIVE AI_PASSIVE
760*663afb9bSAndroid Build Coastguard Worker #else
761*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_AI_PASSIVE 0x1000
762*663afb9bSAndroid Build Coastguard Worker #endif
763*663afb9bSAndroid Build Coastguard Worker #if defined(AI_CANONNAME) && defined(EVENT__HAVE_GETADDRINFO)
764*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_AI_CANONNAME AI_CANONNAME
765*663afb9bSAndroid Build Coastguard Worker #else
766*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_AI_CANONNAME 0x2000
767*663afb9bSAndroid Build Coastguard Worker #endif
768*663afb9bSAndroid Build Coastguard Worker #if defined(AI_NUMERICHOST) && defined(EVENT__HAVE_GETADDRINFO)
769*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_AI_NUMERICHOST AI_NUMERICHOST
770*663afb9bSAndroid Build Coastguard Worker #else
771*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_AI_NUMERICHOST 0x4000
772*663afb9bSAndroid Build Coastguard Worker #endif
773*663afb9bSAndroid Build Coastguard Worker #if defined(AI_NUMERICSERV) && defined(EVENT__HAVE_GETADDRINFO)
774*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_AI_NUMERICSERV AI_NUMERICSERV
775*663afb9bSAndroid Build Coastguard Worker #else
776*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_AI_NUMERICSERV 0x8000
777*663afb9bSAndroid Build Coastguard Worker #endif
778*663afb9bSAndroid Build Coastguard Worker #if defined(AI_V4MAPPED) && defined(EVENT__HAVE_GETADDRINFO)
779*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_AI_V4MAPPED AI_V4MAPPED
780*663afb9bSAndroid Build Coastguard Worker #else
781*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_AI_V4MAPPED 0x10000
782*663afb9bSAndroid Build Coastguard Worker #endif
783*663afb9bSAndroid Build Coastguard Worker #if defined(AI_ALL) && defined(EVENT__HAVE_GETADDRINFO)
784*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_AI_ALL AI_ALL
785*663afb9bSAndroid Build Coastguard Worker #else
786*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_AI_ALL 0x20000
787*663afb9bSAndroid Build Coastguard Worker #endif
788*663afb9bSAndroid Build Coastguard Worker #if defined(AI_ADDRCONFIG) && defined(EVENT__HAVE_GETADDRINFO)
789*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_AI_ADDRCONFIG AI_ADDRCONFIG
790*663afb9bSAndroid Build Coastguard Worker #else
791*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_AI_ADDRCONFIG 0x40000
792*663afb9bSAndroid Build Coastguard Worker #endif
793*663afb9bSAndroid Build Coastguard Worker /**@}*/
794*663afb9bSAndroid Build Coastguard Worker 
795*663afb9bSAndroid Build Coastguard Worker struct evutil_addrinfo;
796*663afb9bSAndroid Build Coastguard Worker /**
797*663afb9bSAndroid Build Coastguard Worker  * This function clones getaddrinfo for systems that don't have it.  For full
798*663afb9bSAndroid Build Coastguard Worker  * details, see RFC 3493, section 6.1.
799*663afb9bSAndroid Build Coastguard Worker  *
800*663afb9bSAndroid Build Coastguard Worker  * Limitations:
801*663afb9bSAndroid Build Coastguard Worker  * - When the system has no getaddrinfo, we fall back to gethostbyname_r or
802*663afb9bSAndroid Build Coastguard Worker  *   gethostbyname, with their attendant issues.
803*663afb9bSAndroid Build Coastguard Worker  * - The AI_V4MAPPED and AI_ALL flags are not currently implemented.
804*663afb9bSAndroid Build Coastguard Worker  *
805*663afb9bSAndroid Build Coastguard Worker  * For a nonblocking variant, see evdns_getaddrinfo.
806*663afb9bSAndroid Build Coastguard Worker  */
807*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
808*663afb9bSAndroid Build Coastguard Worker int evutil_getaddrinfo(const char *nodename, const char *servname,
809*663afb9bSAndroid Build Coastguard Worker     const struct evutil_addrinfo *hints_in, struct evutil_addrinfo **res);
810*663afb9bSAndroid Build Coastguard Worker 
811*663afb9bSAndroid Build Coastguard Worker /** Release storage allocated by evutil_getaddrinfo or evdns_getaddrinfo. */
812*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
813*663afb9bSAndroid Build Coastguard Worker void evutil_freeaddrinfo(struct evutil_addrinfo *ai);
814*663afb9bSAndroid Build Coastguard Worker 
815*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
816*663afb9bSAndroid Build Coastguard Worker const char *evutil_gai_strerror(int err);
817*663afb9bSAndroid Build Coastguard Worker 
818*663afb9bSAndroid Build Coastguard Worker /** Generate n bytes of secure pseudorandom data, and store them in buf.
819*663afb9bSAndroid Build Coastguard Worker  *
820*663afb9bSAndroid Build Coastguard Worker  * Current versions of Libevent use an ARC4-based random number generator,
821*663afb9bSAndroid Build Coastguard Worker  * seeded using the platform's entropy source (/dev/urandom on Unix-like
822*663afb9bSAndroid Build Coastguard Worker  * systems; CryptGenRandom on Windows).  This is not actually as secure as it
823*663afb9bSAndroid Build Coastguard Worker  * should be: ARC4 is a pretty lousy cipher, and the current implementation
824*663afb9bSAndroid Build Coastguard Worker  * provides only rudimentary prediction- and backtracking-resistance.  Don't
825*663afb9bSAndroid Build Coastguard Worker  * use this for serious cryptographic applications.
826*663afb9bSAndroid Build Coastguard Worker  */
827*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
828*663afb9bSAndroid Build Coastguard Worker void evutil_secure_rng_get_bytes(void *buf, size_t n);
829*663afb9bSAndroid Build Coastguard Worker 
830*663afb9bSAndroid Build Coastguard Worker /**
831*663afb9bSAndroid Build Coastguard Worker  * Seed the secure random number generator if needed, and return 0 on
832*663afb9bSAndroid Build Coastguard Worker  * success or -1 on failure.
833*663afb9bSAndroid Build Coastguard Worker  *
834*663afb9bSAndroid Build Coastguard Worker  * It is okay to call this function more than once; it will still return
835*663afb9bSAndroid Build Coastguard Worker  * 0 if the RNG has been successfully seeded and -1 if it can't be
836*663afb9bSAndroid Build Coastguard Worker  * seeded.
837*663afb9bSAndroid Build Coastguard Worker  *
838*663afb9bSAndroid Build Coastguard Worker  * Ordinarily you don't need to call this function from your own code;
839*663afb9bSAndroid Build Coastguard Worker  * Libevent will seed the RNG itself the first time it needs good random
840*663afb9bSAndroid Build Coastguard Worker  * numbers.  You only need to call it if (a) you want to double-check
841*663afb9bSAndroid Build Coastguard Worker  * that one of the seeding methods did succeed, or (b) you plan to drop
842*663afb9bSAndroid Build Coastguard Worker  * the capability to seed (by chrooting, or dropping capabilities, or
843*663afb9bSAndroid Build Coastguard Worker  * whatever), and you want to make sure that seeding happens before your
844*663afb9bSAndroid Build Coastguard Worker  * program loses the ability to do it.
845*663afb9bSAndroid Build Coastguard Worker  */
846*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
847*663afb9bSAndroid Build Coastguard Worker int evutil_secure_rng_init(void);
848*663afb9bSAndroid Build Coastguard Worker 
849*663afb9bSAndroid Build Coastguard Worker /**
850*663afb9bSAndroid Build Coastguard Worker  * Set a filename to use in place of /dev/urandom for seeding the secure
851*663afb9bSAndroid Build Coastguard Worker  * PRNG. Return 0 on success, -1 on failure.
852*663afb9bSAndroid Build Coastguard Worker  *
853*663afb9bSAndroid Build Coastguard Worker  * Call this function BEFORE calling any other initialization or RNG
854*663afb9bSAndroid Build Coastguard Worker  * functions.
855*663afb9bSAndroid Build Coastguard Worker  *
856*663afb9bSAndroid Build Coastguard Worker  * (This string will _NOT_ be copied internally. Do not free it while any
857*663afb9bSAndroid Build Coastguard Worker  * user of the secure RNG might be running. Don't pass anything other than a
858*663afb9bSAndroid Build Coastguard Worker  * real /dev/...random device file here, or you might lose security.)
859*663afb9bSAndroid Build Coastguard Worker  *
860*663afb9bSAndroid Build Coastguard Worker  * This API is unstable, and might change in a future libevent version.
861*663afb9bSAndroid Build Coastguard Worker  */
862*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
863*663afb9bSAndroid Build Coastguard Worker int evutil_secure_rng_set_urandom_device_file(char *fname);
864*663afb9bSAndroid Build Coastguard Worker 
865*663afb9bSAndroid Build Coastguard Worker #if !defined(EVENT__HAVE_ARC4RANDOM) || defined(EVENT__HAVE_ARC4RANDOM_ADDRANDOM)
866*663afb9bSAndroid Build Coastguard Worker /** Seed the random number generator with extra random bytes.
867*663afb9bSAndroid Build Coastguard Worker 
868*663afb9bSAndroid Build Coastguard Worker     You should almost never need to call this function; it should be
869*663afb9bSAndroid Build Coastguard Worker     sufficient to invoke evutil_secure_rng_init(), or let Libevent take
870*663afb9bSAndroid Build Coastguard Worker     care of calling evutil_secure_rng_init() on its own.
871*663afb9bSAndroid Build Coastguard Worker 
872*663afb9bSAndroid Build Coastguard Worker     If you call this function as a _replacement_ for the regular
873*663afb9bSAndroid Build Coastguard Worker     entropy sources, then you need to be sure that your input
874*663afb9bSAndroid Build Coastguard Worker     contains a fairly large amount of strong entropy.  Doing so is
875*663afb9bSAndroid Build Coastguard Worker     notoriously hard: most people who try get it wrong.  Watch out!
876*663afb9bSAndroid Build Coastguard Worker 
877*663afb9bSAndroid Build Coastguard Worker     @param dat a buffer full of a strong source of random numbers
878*663afb9bSAndroid Build Coastguard Worker     @param datlen the number of bytes to read from datlen
879*663afb9bSAndroid Build Coastguard Worker  */
880*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL
881*663afb9bSAndroid Build Coastguard Worker void evutil_secure_rng_add_bytes(const char *dat, size_t datlen);
882*663afb9bSAndroid Build Coastguard Worker #endif
883*663afb9bSAndroid Build Coastguard Worker 
884*663afb9bSAndroid Build Coastguard Worker #ifdef __cplusplus
885*663afb9bSAndroid Build Coastguard Worker }
886*663afb9bSAndroid Build Coastguard Worker #endif
887*663afb9bSAndroid Build Coastguard Worker 
888*663afb9bSAndroid Build Coastguard Worker #endif /* EVENT1_EVUTIL_H_INCLUDED_ */
889