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