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 UTIL_INTERNAL_H_INCLUDED_ 27*663afb9bSAndroid Build Coastguard Worker #define UTIL_INTERNAL_H_INCLUDED_ 28*663afb9bSAndroid Build Coastguard Worker 29*663afb9bSAndroid Build Coastguard Worker #include "event2/event-config.h" 30*663afb9bSAndroid Build Coastguard Worker #include "evconfig-private.h" 31*663afb9bSAndroid Build Coastguard Worker 32*663afb9bSAndroid Build Coastguard Worker #include <errno.h> 33*663afb9bSAndroid Build Coastguard Worker 34*663afb9bSAndroid Build Coastguard Worker /* For EVUTIL_ASSERT */ 35*663afb9bSAndroid Build Coastguard Worker #include "log-internal.h" 36*663afb9bSAndroid Build Coastguard Worker #include <stdio.h> 37*663afb9bSAndroid Build Coastguard Worker #include <stdlib.h> 38*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_SYS_SOCKET_H 39*663afb9bSAndroid Build Coastguard Worker #include <sys/socket.h> 40*663afb9bSAndroid Build Coastguard Worker #endif 41*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_SYS_EVENTFD_H 42*663afb9bSAndroid Build Coastguard Worker #include <sys/eventfd.h> 43*663afb9bSAndroid Build Coastguard Worker #endif 44*663afb9bSAndroid Build Coastguard Worker #include "event2/util.h" 45*663afb9bSAndroid Build Coastguard Worker 46*663afb9bSAndroid Build Coastguard Worker #include "time-internal.h" 47*663afb9bSAndroid Build Coastguard Worker #include "ipv6-internal.h" 48*663afb9bSAndroid Build Coastguard Worker 49*663afb9bSAndroid Build Coastguard Worker #ifdef __cplusplus 50*663afb9bSAndroid Build Coastguard Worker extern "C" { 51*663afb9bSAndroid Build Coastguard Worker #endif 52*663afb9bSAndroid Build Coastguard Worker 53*663afb9bSAndroid Build Coastguard Worker /* __has_attribute() wrapper */ 54*663afb9bSAndroid Build Coastguard Worker #ifdef __has_attribute 55*663afb9bSAndroid Build Coastguard Worker # define EVUTIL_HAS_ATTRIBUTE __has_attribute 56*663afb9bSAndroid Build Coastguard Worker #endif 57*663afb9bSAndroid Build Coastguard Worker /** clang 3 __has_attribute misbehaves in some versions */ 58*663afb9bSAndroid Build Coastguard Worker #if defined(__clang__) && __clang__ == 1 59*663afb9bSAndroid Build Coastguard Worker # if defined(__apple_build_version__) 60*663afb9bSAndroid Build Coastguard Worker # if __clang_major__ <= 6 61*663afb9bSAndroid Build Coastguard Worker # undef EVUTIL_HAS_ATTRIBUTE 62*663afb9bSAndroid Build Coastguard Worker # endif 63*663afb9bSAndroid Build Coastguard Worker # else /* !__apple_build_version__ */ 64*663afb9bSAndroid Build Coastguard Worker # if __clang_major__ == 3 && __clang_minor__ >= 2 && __clang_minor__ <= 5 65*663afb9bSAndroid Build Coastguard Worker # undef EVUTIL_HAS_ATTRIBUTE 66*663afb9bSAndroid Build Coastguard Worker # endif 67*663afb9bSAndroid Build Coastguard Worker # endif /* __apple_build_version__ */ 68*663afb9bSAndroid Build Coastguard Worker #endif /*\ defined(__clang__) && __clang__ == 1 */ 69*663afb9bSAndroid Build Coastguard Worker #ifndef EVUTIL_HAS_ATTRIBUTE 70*663afb9bSAndroid Build Coastguard Worker # define EVUTIL_HAS_ATTRIBUTE(x) 0 71*663afb9bSAndroid Build Coastguard Worker #endif 72*663afb9bSAndroid Build Coastguard Worker 73*663afb9bSAndroid Build Coastguard Worker /* If we need magic to say "inline", get it for free internally. */ 74*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__inline 75*663afb9bSAndroid Build Coastguard Worker #define inline EVENT__inline 76*663afb9bSAndroid Build Coastguard Worker #endif 77*663afb9bSAndroid Build Coastguard Worker 78*663afb9bSAndroid Build Coastguard Worker /* Define to appropriate substitute if compiler doesnt have __func__ */ 79*663afb9bSAndroid Build Coastguard Worker #if defined(EVENT__HAVE___func__) 80*663afb9bSAndroid Build Coastguard Worker # ifndef __func__ 81*663afb9bSAndroid Build Coastguard Worker # define __func__ __func__ 82*663afb9bSAndroid Build Coastguard Worker # endif 83*663afb9bSAndroid Build Coastguard Worker #elif defined(EVENT__HAVE___FUNCTION__) 84*663afb9bSAndroid Build Coastguard Worker # define __func__ __FUNCTION__ 85*663afb9bSAndroid Build Coastguard Worker #else 86*663afb9bSAndroid Build Coastguard Worker # define __func__ __FILE__ 87*663afb9bSAndroid Build Coastguard Worker #endif 88*663afb9bSAndroid Build Coastguard Worker 89*663afb9bSAndroid Build Coastguard Worker /* A good no-op to use in macro definitions. */ 90*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_NIL_STMT_ ((void)0) 91*663afb9bSAndroid Build Coastguard Worker /* A no-op that tricks the compiler into thinking a condition is used while 92*663afb9bSAndroid Build Coastguard Worker * definitely not making any code for it. Used to compile out asserts while 93*663afb9bSAndroid Build Coastguard Worker * avoiding "unused variable" warnings. The "!" forces the compiler to 94*663afb9bSAndroid Build Coastguard Worker * do the sizeof() on an int, in case "condition" is a bitfield value. 95*663afb9bSAndroid Build Coastguard Worker */ 96*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_NIL_CONDITION_(condition) do { \ 97*663afb9bSAndroid Build Coastguard Worker (void)sizeof(!(condition)); \ 98*663afb9bSAndroid Build Coastguard Worker } while(0) 99*663afb9bSAndroid Build Coastguard Worker 100*663afb9bSAndroid Build Coastguard Worker /* Internal use only: macros to match patterns of error codes in a 101*663afb9bSAndroid Build Coastguard Worker cross-platform way. We need these macros because of two historical 102*663afb9bSAndroid Build Coastguard Worker reasons: first, nonblocking IO functions are generally written to give an 103*663afb9bSAndroid Build Coastguard Worker error on the "blocked now, try later" case, so sometimes an error from a 104*663afb9bSAndroid Build Coastguard Worker read, write, connect, or accept means "no error; just wait for more 105*663afb9bSAndroid Build Coastguard Worker data," and we need to look at the error code. Second, Windows defines 106*663afb9bSAndroid Build Coastguard Worker a different set of error codes for sockets. */ 107*663afb9bSAndroid Build Coastguard Worker 108*663afb9bSAndroid Build Coastguard Worker #ifndef _WIN32 109*663afb9bSAndroid Build Coastguard Worker 110*663afb9bSAndroid Build Coastguard Worker #if EAGAIN == EWOULDBLOCK 111*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_ERR_IS_EAGAIN(e) \ 112*663afb9bSAndroid Build Coastguard Worker ((e) == EAGAIN) 113*663afb9bSAndroid Build Coastguard Worker #else 114*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_ERR_IS_EAGAIN(e) \ 115*663afb9bSAndroid Build Coastguard Worker ((e) == EAGAIN || (e) == EWOULDBLOCK) 116*663afb9bSAndroid Build Coastguard Worker #endif 117*663afb9bSAndroid Build Coastguard Worker 118*663afb9bSAndroid Build Coastguard Worker /* True iff e is an error that means a read/write operation can be retried. */ 119*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_ERR_RW_RETRIABLE(e) \ 120*663afb9bSAndroid Build Coastguard Worker ((e) == EINTR || EVUTIL_ERR_IS_EAGAIN(e)) 121*663afb9bSAndroid Build Coastguard Worker /* True iff e is an error that means an connect can be retried. */ 122*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_ERR_CONNECT_RETRIABLE(e) \ 123*663afb9bSAndroid Build Coastguard Worker ((e) == EINTR || (e) == EINPROGRESS) 124*663afb9bSAndroid Build Coastguard Worker /* True iff e is an error that means a accept can be retried. */ 125*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_ERR_ACCEPT_RETRIABLE(e) \ 126*663afb9bSAndroid Build Coastguard Worker ((e) == EINTR || EVUTIL_ERR_IS_EAGAIN(e) || (e) == ECONNABORTED) 127*663afb9bSAndroid Build Coastguard Worker 128*663afb9bSAndroid Build Coastguard Worker /* True iff e is an error that means the connection was refused */ 129*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_ERR_CONNECT_REFUSED(e) \ 130*663afb9bSAndroid Build Coastguard Worker ((e) == ECONNREFUSED) 131*663afb9bSAndroid Build Coastguard Worker 132*663afb9bSAndroid Build Coastguard Worker #else 133*663afb9bSAndroid Build Coastguard Worker /* Win32 */ 134*663afb9bSAndroid Build Coastguard Worker 135*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_ERR_IS_EAGAIN(e) \ 136*663afb9bSAndroid Build Coastguard Worker ((e) == WSAEWOULDBLOCK || (e) == EAGAIN) 137*663afb9bSAndroid Build Coastguard Worker 138*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_ERR_RW_RETRIABLE(e) \ 139*663afb9bSAndroid Build Coastguard Worker ((e) == WSAEWOULDBLOCK || \ 140*663afb9bSAndroid Build Coastguard Worker (e) == WSAEINTR) 141*663afb9bSAndroid Build Coastguard Worker 142*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_ERR_CONNECT_RETRIABLE(e) \ 143*663afb9bSAndroid Build Coastguard Worker ((e) == WSAEWOULDBLOCK || \ 144*663afb9bSAndroid Build Coastguard Worker (e) == WSAEINTR || \ 145*663afb9bSAndroid Build Coastguard Worker (e) == WSAEINPROGRESS || \ 146*663afb9bSAndroid Build Coastguard Worker (e) == WSAEINVAL) 147*663afb9bSAndroid Build Coastguard Worker 148*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_ERR_ACCEPT_RETRIABLE(e) \ 149*663afb9bSAndroid Build Coastguard Worker EVUTIL_ERR_RW_RETRIABLE(e) 150*663afb9bSAndroid Build Coastguard Worker 151*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_ERR_CONNECT_REFUSED(e) \ 152*663afb9bSAndroid Build Coastguard Worker ((e) == WSAECONNREFUSED) 153*663afb9bSAndroid Build Coastguard Worker 154*663afb9bSAndroid Build Coastguard Worker #endif 155*663afb9bSAndroid Build Coastguard Worker 156*663afb9bSAndroid Build Coastguard Worker /* Arguments for shutdown() */ 157*663afb9bSAndroid Build Coastguard Worker #ifdef SHUT_RD 158*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_SHUT_RD SHUT_RD 159*663afb9bSAndroid Build Coastguard Worker #else 160*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_SHUT_RD 0 161*663afb9bSAndroid Build Coastguard Worker #endif 162*663afb9bSAndroid Build Coastguard Worker #ifdef SHUT_WR 163*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_SHUT_WR SHUT_WR 164*663afb9bSAndroid Build Coastguard Worker #else 165*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_SHUT_WR 1 /* SD_SEND */ 166*663afb9bSAndroid Build Coastguard Worker #endif 167*663afb9bSAndroid Build Coastguard Worker #ifdef SHUT_BOTH 168*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_SHUT_BOTH SHUT_BOTH 169*663afb9bSAndroid Build Coastguard Worker #else 170*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_SHUT_BOTH 2 171*663afb9bSAndroid Build Coastguard Worker #endif 172*663afb9bSAndroid Build Coastguard Worker 173*663afb9bSAndroid Build Coastguard Worker /* Helper: Verify that all the elements in 'dlist' are internally consistent. 174*663afb9bSAndroid Build Coastguard Worker * Checks for circular lists and bad prev/next pointers. 175*663afb9bSAndroid Build Coastguard Worker * 176*663afb9bSAndroid Build Coastguard Worker * Example usage: 177*663afb9bSAndroid Build Coastguard Worker * EVUTIL_ASSERT_LIST_OK(eventlist, event, ev_next); 178*663afb9bSAndroid Build Coastguard Worker */ 179*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_ASSERT_LIST_OK(dlist, type, field) do { \ 180*663afb9bSAndroid Build Coastguard Worker struct type *elm1, *elm2, **nextp; \ 181*663afb9bSAndroid Build Coastguard Worker if (LIST_EMPTY((dlist))) \ 182*663afb9bSAndroid Build Coastguard Worker break; \ 183*663afb9bSAndroid Build Coastguard Worker \ 184*663afb9bSAndroid Build Coastguard Worker /* Check list for circularity using Floyd's */ \ 185*663afb9bSAndroid Build Coastguard Worker /* 'Tortoise and Hare' algorithm */ \ 186*663afb9bSAndroid Build Coastguard Worker elm1 = LIST_FIRST((dlist)); \ 187*663afb9bSAndroid Build Coastguard Worker elm2 = LIST_NEXT(elm1, field); \ 188*663afb9bSAndroid Build Coastguard Worker while (elm1 && elm2) { \ 189*663afb9bSAndroid Build Coastguard Worker EVUTIL_ASSERT(elm1 != elm2); \ 190*663afb9bSAndroid Build Coastguard Worker elm1 = LIST_NEXT(elm1, field); \ 191*663afb9bSAndroid Build Coastguard Worker elm2 = LIST_NEXT(elm2, field); \ 192*663afb9bSAndroid Build Coastguard Worker if (!elm2) \ 193*663afb9bSAndroid Build Coastguard Worker break; \ 194*663afb9bSAndroid Build Coastguard Worker EVUTIL_ASSERT(elm1 != elm2); \ 195*663afb9bSAndroid Build Coastguard Worker elm2 = LIST_NEXT(elm2, field); \ 196*663afb9bSAndroid Build Coastguard Worker } \ 197*663afb9bSAndroid Build Coastguard Worker \ 198*663afb9bSAndroid Build Coastguard Worker /* Now check next and prev pointers for consistency. */ \ 199*663afb9bSAndroid Build Coastguard Worker nextp = &LIST_FIRST((dlist)); \ 200*663afb9bSAndroid Build Coastguard Worker elm1 = LIST_FIRST((dlist)); \ 201*663afb9bSAndroid Build Coastguard Worker while (elm1) { \ 202*663afb9bSAndroid Build Coastguard Worker EVUTIL_ASSERT(*nextp == elm1); \ 203*663afb9bSAndroid Build Coastguard Worker EVUTIL_ASSERT(nextp == elm1->field.le_prev); \ 204*663afb9bSAndroid Build Coastguard Worker nextp = &LIST_NEXT(elm1, field); \ 205*663afb9bSAndroid Build Coastguard Worker elm1 = *nextp; \ 206*663afb9bSAndroid Build Coastguard Worker } \ 207*663afb9bSAndroid Build Coastguard Worker } while (0) 208*663afb9bSAndroid Build Coastguard Worker 209*663afb9bSAndroid Build Coastguard Worker /* Helper: Verify that all the elements in a TAILQ are internally consistent. 210*663afb9bSAndroid Build Coastguard Worker * Checks for circular lists and bad prev/next pointers. 211*663afb9bSAndroid Build Coastguard Worker * 212*663afb9bSAndroid Build Coastguard Worker * Example usage: 213*663afb9bSAndroid Build Coastguard Worker * EVUTIL_ASSERT_TAILQ_OK(activelist, event, ev_active_next); 214*663afb9bSAndroid Build Coastguard Worker */ 215*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_ASSERT_TAILQ_OK(tailq, type, field) do { \ 216*663afb9bSAndroid Build Coastguard Worker struct type *elm1, *elm2, **nextp; \ 217*663afb9bSAndroid Build Coastguard Worker if (TAILQ_EMPTY((tailq))) \ 218*663afb9bSAndroid Build Coastguard Worker break; \ 219*663afb9bSAndroid Build Coastguard Worker \ 220*663afb9bSAndroid Build Coastguard Worker /* Check list for circularity using Floyd's */ \ 221*663afb9bSAndroid Build Coastguard Worker /* 'Tortoise and Hare' algorithm */ \ 222*663afb9bSAndroid Build Coastguard Worker elm1 = TAILQ_FIRST((tailq)); \ 223*663afb9bSAndroid Build Coastguard Worker elm2 = TAILQ_NEXT(elm1, field); \ 224*663afb9bSAndroid Build Coastguard Worker while (elm1 && elm2) { \ 225*663afb9bSAndroid Build Coastguard Worker EVUTIL_ASSERT(elm1 != elm2); \ 226*663afb9bSAndroid Build Coastguard Worker elm1 = TAILQ_NEXT(elm1, field); \ 227*663afb9bSAndroid Build Coastguard Worker elm2 = TAILQ_NEXT(elm2, field); \ 228*663afb9bSAndroid Build Coastguard Worker if (!elm2) \ 229*663afb9bSAndroid Build Coastguard Worker break; \ 230*663afb9bSAndroid Build Coastguard Worker EVUTIL_ASSERT(elm1 != elm2); \ 231*663afb9bSAndroid Build Coastguard Worker elm2 = TAILQ_NEXT(elm2, field); \ 232*663afb9bSAndroid Build Coastguard Worker } \ 233*663afb9bSAndroid Build Coastguard Worker \ 234*663afb9bSAndroid Build Coastguard Worker /* Now check next and prev pointers for consistency. */ \ 235*663afb9bSAndroid Build Coastguard Worker nextp = &TAILQ_FIRST((tailq)); \ 236*663afb9bSAndroid Build Coastguard Worker elm1 = TAILQ_FIRST((tailq)); \ 237*663afb9bSAndroid Build Coastguard Worker while (elm1) { \ 238*663afb9bSAndroid Build Coastguard Worker EVUTIL_ASSERT(*nextp == elm1); \ 239*663afb9bSAndroid Build Coastguard Worker EVUTIL_ASSERT(nextp == elm1->field.tqe_prev); \ 240*663afb9bSAndroid Build Coastguard Worker nextp = &TAILQ_NEXT(elm1, field); \ 241*663afb9bSAndroid Build Coastguard Worker elm1 = *nextp; \ 242*663afb9bSAndroid Build Coastguard Worker } \ 243*663afb9bSAndroid Build Coastguard Worker EVUTIL_ASSERT(nextp == (tailq)->tqh_last); \ 244*663afb9bSAndroid Build Coastguard Worker } while (0) 245*663afb9bSAndroid Build Coastguard Worker 246*663afb9bSAndroid Build Coastguard Worker /* Locale-independent replacements for some ctypes functions. Use these 247*663afb9bSAndroid Build Coastguard Worker * when you care about ASCII's notion of character types, because you are about 248*663afb9bSAndroid Build Coastguard Worker * to send those types onto the wire. 249*663afb9bSAndroid Build Coastguard Worker */ 250*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 251*663afb9bSAndroid Build Coastguard Worker int EVUTIL_ISALPHA_(char c); 252*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 253*663afb9bSAndroid Build Coastguard Worker int EVUTIL_ISALNUM_(char c); 254*663afb9bSAndroid Build Coastguard Worker int EVUTIL_ISSPACE_(char c); 255*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 256*663afb9bSAndroid Build Coastguard Worker int EVUTIL_ISDIGIT_(char c); 257*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 258*663afb9bSAndroid Build Coastguard Worker int EVUTIL_ISXDIGIT_(char c); 259*663afb9bSAndroid Build Coastguard Worker int EVUTIL_ISPRINT_(char c); 260*663afb9bSAndroid Build Coastguard Worker int EVUTIL_ISLOWER_(char c); 261*663afb9bSAndroid Build Coastguard Worker int EVUTIL_ISUPPER_(char c); 262*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 263*663afb9bSAndroid Build Coastguard Worker char EVUTIL_TOUPPER_(char c); 264*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 265*663afb9bSAndroid Build Coastguard Worker char EVUTIL_TOLOWER_(char c); 266*663afb9bSAndroid Build Coastguard Worker 267*663afb9bSAndroid Build Coastguard Worker /** Remove all trailing horizontal whitespace (space or tab) from the end of a 268*663afb9bSAndroid Build Coastguard Worker * string */ 269*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 270*663afb9bSAndroid Build Coastguard Worker void evutil_rtrim_lws_(char *); 271*663afb9bSAndroid Build Coastguard Worker 272*663afb9bSAndroid Build Coastguard Worker 273*663afb9bSAndroid Build Coastguard Worker /** Helper macro. If we know that a given pointer points to a field in a 274*663afb9bSAndroid Build Coastguard Worker structure, return a pointer to the structure itself. Used to implement 275*663afb9bSAndroid Build Coastguard Worker our half-baked C OO. Example: 276*663afb9bSAndroid Build Coastguard Worker 277*663afb9bSAndroid Build Coastguard Worker struct subtype { 278*663afb9bSAndroid Build Coastguard Worker int x; 279*663afb9bSAndroid Build Coastguard Worker struct supertype common; 280*663afb9bSAndroid Build Coastguard Worker int y; 281*663afb9bSAndroid Build Coastguard Worker }; 282*663afb9bSAndroid Build Coastguard Worker ... 283*663afb9bSAndroid Build Coastguard Worker void fn(struct supertype *super) { 284*663afb9bSAndroid Build Coastguard Worker struct subtype *sub = EVUTIL_UPCAST(super, struct subtype, common); 285*663afb9bSAndroid Build Coastguard Worker ... 286*663afb9bSAndroid Build Coastguard Worker } 287*663afb9bSAndroid Build Coastguard Worker */ 288*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_UPCAST(ptr, type, field) \ 289*663afb9bSAndroid Build Coastguard Worker ((type *)(((char*)(ptr)) - evutil_offsetof(type, field))) 290*663afb9bSAndroid Build Coastguard Worker 291*663afb9bSAndroid Build Coastguard Worker /* As open(pathname, flags, mode), except that the file is always opened with 292*663afb9bSAndroid Build Coastguard Worker * the close-on-exec flag set. (And the mode argument is mandatory.) 293*663afb9bSAndroid Build Coastguard Worker */ 294*663afb9bSAndroid Build Coastguard Worker int evutil_open_closeonexec_(const char *pathname, int flags, unsigned mode); 295*663afb9bSAndroid Build Coastguard Worker 296*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 297*663afb9bSAndroid Build Coastguard Worker int evutil_read_file_(const char *filename, char **content_out, size_t *len_out, 298*663afb9bSAndroid Build Coastguard Worker int is_binary); 299*663afb9bSAndroid Build Coastguard Worker 300*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 301*663afb9bSAndroid Build Coastguard Worker int evutil_socket_connect_(evutil_socket_t *fd_ptr, const struct sockaddr *sa, int socklen); 302*663afb9bSAndroid Build Coastguard Worker 303*663afb9bSAndroid Build Coastguard Worker int evutil_socket_finished_connecting_(evutil_socket_t fd); 304*663afb9bSAndroid Build Coastguard Worker 305*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 306*663afb9bSAndroid Build Coastguard Worker int evutil_ersatz_socketpair_(int, int , int, evutil_socket_t[]); 307*663afb9bSAndroid Build Coastguard Worker 308*663afb9bSAndroid Build Coastguard Worker int evutil_resolve_(int family, const char *hostname, struct sockaddr *sa, 309*663afb9bSAndroid Build Coastguard Worker ev_socklen_t *socklen, int port); 310*663afb9bSAndroid Build Coastguard Worker 311*663afb9bSAndroid Build Coastguard Worker const char *evutil_getenv_(const char *name); 312*663afb9bSAndroid Build Coastguard Worker 313*663afb9bSAndroid Build Coastguard Worker /* Structure to hold the state of our weak random number generator. 314*663afb9bSAndroid Build Coastguard Worker */ 315*663afb9bSAndroid Build Coastguard Worker struct evutil_weakrand_state { 316*663afb9bSAndroid Build Coastguard Worker ev_uint32_t seed; 317*663afb9bSAndroid Build Coastguard Worker }; 318*663afb9bSAndroid Build Coastguard Worker 319*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_WEAKRAND_MAX EV_INT32_MAX 320*663afb9bSAndroid Build Coastguard Worker 321*663afb9bSAndroid Build Coastguard Worker /* Initialize the state of a week random number generator based on 'seed'. If 322*663afb9bSAndroid Build Coastguard Worker * the seed is 0, construct a new seed based on not-very-strong platform 323*663afb9bSAndroid Build Coastguard Worker * entropy, like the PID and the time of day. 324*663afb9bSAndroid Build Coastguard Worker * 325*663afb9bSAndroid Build Coastguard Worker * This function, and the other evutil_weakrand* functions, are meant for 326*663afb9bSAndroid Build Coastguard Worker * speed, not security or statistical strength. If you need a RNG which an 327*663afb9bSAndroid Build Coastguard Worker * attacker can't predict, or which passes strong statistical tests, use the 328*663afb9bSAndroid Build Coastguard Worker * evutil_secure_rng* functions instead. 329*663afb9bSAndroid Build Coastguard Worker */ 330*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 331*663afb9bSAndroid Build Coastguard Worker ev_uint32_t evutil_weakrand_seed_(struct evutil_weakrand_state *state, ev_uint32_t seed); 332*663afb9bSAndroid Build Coastguard Worker /* Return a pseudorandom value between 0 and EVUTIL_WEAKRAND_MAX inclusive. 333*663afb9bSAndroid Build Coastguard Worker * Updates the state in 'seed' as needed -- this value must be protected by a 334*663afb9bSAndroid Build Coastguard Worker * lock. 335*663afb9bSAndroid Build Coastguard Worker */ 336*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 337*663afb9bSAndroid Build Coastguard Worker ev_int32_t evutil_weakrand_(struct evutil_weakrand_state *seed); 338*663afb9bSAndroid Build Coastguard Worker /* Return a pseudorandom value x such that 0 <= x < top. top must be no more 339*663afb9bSAndroid Build Coastguard Worker * than EVUTIL_WEAKRAND_MAX. Updates the state in 'seed' as needed -- this 340*663afb9bSAndroid Build Coastguard Worker * value must be proteced by a lock */ 341*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 342*663afb9bSAndroid Build Coastguard Worker ev_int32_t evutil_weakrand_range_(struct evutil_weakrand_state *seed, ev_int32_t top); 343*663afb9bSAndroid Build Coastguard Worker 344*663afb9bSAndroid Build Coastguard Worker /* Evaluates to the same boolean value as 'p', and hints to the compiler that 345*663afb9bSAndroid Build Coastguard Worker * we expect this value to be false. */ 346*663afb9bSAndroid Build Coastguard Worker #if defined(__GNUC__) && __GNUC__ >= 3 /* gcc 3.0 or later */ 347*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_UNLIKELY(p) __builtin_expect(!!(p),0) 348*663afb9bSAndroid Build Coastguard Worker #else 349*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_UNLIKELY(p) (p) 350*663afb9bSAndroid Build Coastguard Worker #endif 351*663afb9bSAndroid Build Coastguard Worker 352*663afb9bSAndroid Build Coastguard Worker #if EVUTIL_HAS_ATTRIBUTE(fallthrough) 353*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_FALLTHROUGH __attribute__((fallthrough)) 354*663afb9bSAndroid Build Coastguard Worker #else 355*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_FALLTHROUGH /* fallthrough */ 356*663afb9bSAndroid Build Coastguard Worker #endif 357*663afb9bSAndroid Build Coastguard Worker 358*663afb9bSAndroid Build Coastguard Worker /* Replacement for assert() that calls event_errx on failure. */ 359*663afb9bSAndroid Build Coastguard Worker #ifdef NDEBUG 360*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_ASSERT(cond) EVUTIL_NIL_CONDITION_(cond) 361*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_FAILURE_CHECK(cond) 0 362*663afb9bSAndroid Build Coastguard Worker #else 363*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_ASSERT(cond) \ 364*663afb9bSAndroid Build Coastguard Worker do { \ 365*663afb9bSAndroid Build Coastguard Worker if (EVUTIL_UNLIKELY(!(cond))) { \ 366*663afb9bSAndroid Build Coastguard Worker event_errx(EVENT_ERR_ABORT_, \ 367*663afb9bSAndroid Build Coastguard Worker "%s:%d: Assertion %s failed in %s", \ 368*663afb9bSAndroid Build Coastguard Worker __FILE__,__LINE__,#cond,__func__); \ 369*663afb9bSAndroid Build Coastguard Worker /* In case a user-supplied handler tries to */ \ 370*663afb9bSAndroid Build Coastguard Worker /* return control to us, log and abort here. */ \ 371*663afb9bSAndroid Build Coastguard Worker (void)fprintf(stderr, \ 372*663afb9bSAndroid Build Coastguard Worker "%s:%d: Assertion %s failed in %s", \ 373*663afb9bSAndroid Build Coastguard Worker __FILE__,__LINE__,#cond,__func__); \ 374*663afb9bSAndroid Build Coastguard Worker abort(); \ 375*663afb9bSAndroid Build Coastguard Worker } \ 376*663afb9bSAndroid Build Coastguard Worker } while (0) 377*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_FAILURE_CHECK(cond) EVUTIL_UNLIKELY(cond) 378*663afb9bSAndroid Build Coastguard Worker #endif 379*663afb9bSAndroid Build Coastguard Worker 380*663afb9bSAndroid Build Coastguard Worker #ifndef EVENT__HAVE_STRUCT_SOCKADDR_STORAGE 381*663afb9bSAndroid Build Coastguard Worker /* Replacement for sockaddr storage that we can use internally on platforms 382*663afb9bSAndroid Build Coastguard Worker * that lack it. It is not space-efficient, but neither is sockaddr_storage. 383*663afb9bSAndroid Build Coastguard Worker */ 384*663afb9bSAndroid Build Coastguard Worker struct sockaddr_storage { 385*663afb9bSAndroid Build Coastguard Worker union { 386*663afb9bSAndroid Build Coastguard Worker struct sockaddr ss_sa; 387*663afb9bSAndroid Build Coastguard Worker struct sockaddr_in ss_sin; 388*663afb9bSAndroid Build Coastguard Worker struct sockaddr_in6 ss_sin6; 389*663afb9bSAndroid Build Coastguard Worker char ss_padding[128]; 390*663afb9bSAndroid Build Coastguard Worker } ss_union; 391*663afb9bSAndroid Build Coastguard Worker }; 392*663afb9bSAndroid Build Coastguard Worker #define ss_family ss_union.ss_sa.sa_family 393*663afb9bSAndroid Build Coastguard Worker #endif 394*663afb9bSAndroid Build Coastguard Worker 395*663afb9bSAndroid Build Coastguard Worker /* Internal addrinfo error code. This one is returned from only from 396*663afb9bSAndroid Build Coastguard Worker * evutil_getaddrinfo_common_, when we are sure that we'll have to hit a DNS 397*663afb9bSAndroid Build Coastguard Worker * server. */ 398*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EAI_NEED_RESOLVE -90002 399*663afb9bSAndroid Build Coastguard Worker 400*663afb9bSAndroid Build Coastguard Worker struct evdns_base; 401*663afb9bSAndroid Build Coastguard Worker struct evdns_getaddrinfo_request; 402*663afb9bSAndroid Build Coastguard Worker typedef struct evdns_getaddrinfo_request* (*evdns_getaddrinfo_fn)( 403*663afb9bSAndroid Build Coastguard Worker struct evdns_base *base, 404*663afb9bSAndroid Build Coastguard Worker const char *nodename, const char *servname, 405*663afb9bSAndroid Build Coastguard Worker const struct evutil_addrinfo *hints_in, 406*663afb9bSAndroid Build Coastguard Worker void (*cb)(int, struct evutil_addrinfo *, void *), void *arg); 407*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 408*663afb9bSAndroid Build Coastguard Worker void evutil_set_evdns_getaddrinfo_fn_(evdns_getaddrinfo_fn fn); 409*663afb9bSAndroid Build Coastguard Worker typedef void (*evdns_getaddrinfo_cancel_fn)( 410*663afb9bSAndroid Build Coastguard Worker struct evdns_getaddrinfo_request *req); 411*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 412*663afb9bSAndroid Build Coastguard Worker void evutil_set_evdns_getaddrinfo_cancel_fn_(evdns_getaddrinfo_cancel_fn fn); 413*663afb9bSAndroid Build Coastguard Worker 414*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 415*663afb9bSAndroid Build Coastguard Worker struct evutil_addrinfo *evutil_new_addrinfo_(struct sockaddr *sa, 416*663afb9bSAndroid Build Coastguard Worker ev_socklen_t socklen, const struct evutil_addrinfo *hints); 417*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 418*663afb9bSAndroid Build Coastguard Worker struct evutil_addrinfo *evutil_addrinfo_append_(struct evutil_addrinfo *first, 419*663afb9bSAndroid Build Coastguard Worker struct evutil_addrinfo *append); 420*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 421*663afb9bSAndroid Build Coastguard Worker void evutil_adjust_hints_for_addrconfig_(struct evutil_addrinfo *hints); 422*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 423*663afb9bSAndroid Build Coastguard Worker int evutil_getaddrinfo_common_(const char *nodename, const char *servname, 424*663afb9bSAndroid Build Coastguard Worker struct evutil_addrinfo *hints, struct evutil_addrinfo **res, int *portnum); 425*663afb9bSAndroid Build Coastguard Worker 426*663afb9bSAndroid Build Coastguard Worker struct evdns_getaddrinfo_request *evutil_getaddrinfo_async_( 427*663afb9bSAndroid Build Coastguard Worker struct evdns_base *dns_base, 428*663afb9bSAndroid Build Coastguard Worker const char *nodename, const char *servname, 429*663afb9bSAndroid Build Coastguard Worker const struct evutil_addrinfo *hints_in, 430*663afb9bSAndroid Build Coastguard Worker void (*cb)(int, struct evutil_addrinfo *, void *), void *arg); 431*663afb9bSAndroid Build Coastguard Worker void evutil_getaddrinfo_cancel_async_(struct evdns_getaddrinfo_request *data); 432*663afb9bSAndroid Build Coastguard Worker 433*663afb9bSAndroid Build Coastguard Worker /** Return true iff sa is a looback address. (That is, it is 127.0.0.1/8, or 434*663afb9bSAndroid Build Coastguard Worker * ::1). */ 435*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 436*663afb9bSAndroid Build Coastguard Worker int evutil_sockaddr_is_loopback_(const struct sockaddr *sa); 437*663afb9bSAndroid Build Coastguard Worker 438*663afb9bSAndroid Build Coastguard Worker 439*663afb9bSAndroid Build Coastguard Worker /** 440*663afb9bSAndroid Build Coastguard Worker Formats a sockaddr sa into a string buffer of size outlen stored in out. 441*663afb9bSAndroid Build Coastguard Worker Returns a pointer to out. Always writes something into out, so it's safe 442*663afb9bSAndroid Build Coastguard Worker to use the output of this function without checking it for NULL. 443*663afb9bSAndroid Build Coastguard Worker */ 444*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 445*663afb9bSAndroid Build Coastguard Worker const char *evutil_format_sockaddr_port_(const struct sockaddr *sa, char *out, size_t outlen); 446*663afb9bSAndroid Build Coastguard Worker 447*663afb9bSAndroid Build Coastguard Worker int evutil_hex_char_to_int_(char c); 448*663afb9bSAndroid Build Coastguard Worker 449*663afb9bSAndroid Build Coastguard Worker 450*663afb9bSAndroid Build Coastguard Worker void evutil_free_secure_rng_globals_(void); 451*663afb9bSAndroid Build Coastguard Worker void evutil_free_globals_(void); 452*663afb9bSAndroid Build Coastguard Worker 453*663afb9bSAndroid Build Coastguard Worker #ifdef _WIN32 454*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 455*663afb9bSAndroid Build Coastguard Worker HMODULE evutil_load_windows_system_library_(const TCHAR *library_name); 456*663afb9bSAndroid Build Coastguard Worker #endif 457*663afb9bSAndroid Build Coastguard Worker 458*663afb9bSAndroid Build Coastguard Worker #ifndef EV_SIZE_FMT 459*663afb9bSAndroid Build Coastguard Worker #if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__) 460*663afb9bSAndroid Build Coastguard Worker #define EV_U64_FMT "%I64u" 461*663afb9bSAndroid Build Coastguard Worker #define EV_I64_FMT "%I64d" 462*663afb9bSAndroid Build Coastguard Worker #define EV_I64_ARG(x) ((__int64)(x)) 463*663afb9bSAndroid Build Coastguard Worker #define EV_U64_ARG(x) ((unsigned __int64)(x)) 464*663afb9bSAndroid Build Coastguard Worker #else 465*663afb9bSAndroid Build Coastguard Worker #define EV_U64_FMT "%llu" 466*663afb9bSAndroid Build Coastguard Worker #define EV_I64_FMT "%lld" 467*663afb9bSAndroid Build Coastguard Worker #define EV_I64_ARG(x) ((long long)(x)) 468*663afb9bSAndroid Build Coastguard Worker #define EV_U64_ARG(x) ((unsigned long long)(x)) 469*663afb9bSAndroid Build Coastguard Worker #endif 470*663afb9bSAndroid Build Coastguard Worker #endif 471*663afb9bSAndroid Build Coastguard Worker 472*663afb9bSAndroid Build Coastguard Worker #ifdef _WIN32 473*663afb9bSAndroid Build Coastguard Worker #define EV_SOCK_FMT EV_I64_FMT 474*663afb9bSAndroid Build Coastguard Worker #define EV_SOCK_ARG(x) EV_I64_ARG((x)) 475*663afb9bSAndroid Build Coastguard Worker #else 476*663afb9bSAndroid Build Coastguard Worker #define EV_SOCK_FMT "%d" 477*663afb9bSAndroid Build Coastguard Worker #define EV_SOCK_ARG(x) (x) 478*663afb9bSAndroid Build Coastguard Worker #endif 479*663afb9bSAndroid Build Coastguard Worker 480*663afb9bSAndroid Build Coastguard Worker #if defined(__STDC__) && defined(__STDC_VERSION__) && !defined(__MINGW64_VERSION_MAJOR) 481*663afb9bSAndroid Build Coastguard Worker #if (__STDC_VERSION__ >= 199901L) 482*663afb9bSAndroid Build Coastguard Worker #define EV_SIZE_FMT "%zu" 483*663afb9bSAndroid Build Coastguard Worker #define EV_SSIZE_FMT "%zd" 484*663afb9bSAndroid Build Coastguard Worker #define EV_SIZE_ARG(x) (x) 485*663afb9bSAndroid Build Coastguard Worker #define EV_SSIZE_ARG(x) (x) 486*663afb9bSAndroid Build Coastguard Worker #endif 487*663afb9bSAndroid Build Coastguard Worker #endif 488*663afb9bSAndroid Build Coastguard Worker 489*663afb9bSAndroid Build Coastguard Worker #ifndef EV_SIZE_FMT 490*663afb9bSAndroid Build Coastguard Worker #if (EVENT__SIZEOF_SIZE_T <= EVENT__SIZEOF_LONG) 491*663afb9bSAndroid Build Coastguard Worker #define EV_SIZE_FMT "%lu" 492*663afb9bSAndroid Build Coastguard Worker #define EV_SSIZE_FMT "%ld" 493*663afb9bSAndroid Build Coastguard Worker #define EV_SIZE_ARG(x) ((unsigned long)(x)) 494*663afb9bSAndroid Build Coastguard Worker #define EV_SSIZE_ARG(x) ((long)(x)) 495*663afb9bSAndroid Build Coastguard Worker #else 496*663afb9bSAndroid Build Coastguard Worker #define EV_SIZE_FMT EV_U64_FMT 497*663afb9bSAndroid Build Coastguard Worker #define EV_SSIZE_FMT EV_I64_FMT 498*663afb9bSAndroid Build Coastguard Worker #define EV_SIZE_ARG(x) EV_U64_ARG(x) 499*663afb9bSAndroid Build Coastguard Worker #define EV_SSIZE_ARG(x) EV_I64_ARG(x) 500*663afb9bSAndroid Build Coastguard Worker #endif 501*663afb9bSAndroid Build Coastguard Worker #endif 502*663afb9bSAndroid Build Coastguard Worker 503*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 504*663afb9bSAndroid Build Coastguard Worker evutil_socket_t evutil_socket_(int domain, int type, int protocol); 505*663afb9bSAndroid Build Coastguard Worker evutil_socket_t evutil_accept4_(evutil_socket_t sockfd, struct sockaddr *addr, 506*663afb9bSAndroid Build Coastguard Worker ev_socklen_t *addrlen, int flags); 507*663afb9bSAndroid Build Coastguard Worker 508*663afb9bSAndroid Build Coastguard Worker /* used by one of the test programs.. */ 509*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 510*663afb9bSAndroid Build Coastguard Worker int evutil_make_internal_pipe_(evutil_socket_t fd[2]); 511*663afb9bSAndroid Build Coastguard Worker evutil_socket_t evutil_eventfd_(unsigned initval, int flags); 512*663afb9bSAndroid Build Coastguard Worker 513*663afb9bSAndroid Build Coastguard Worker #ifdef SOCK_NONBLOCK 514*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_SOCK_NONBLOCK SOCK_NONBLOCK 515*663afb9bSAndroid Build Coastguard Worker #else 516*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_SOCK_NONBLOCK 0x4000000 517*663afb9bSAndroid Build Coastguard Worker #endif 518*663afb9bSAndroid Build Coastguard Worker #ifdef SOCK_CLOEXEC 519*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_SOCK_CLOEXEC SOCK_CLOEXEC 520*663afb9bSAndroid Build Coastguard Worker #else 521*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_SOCK_CLOEXEC 0x80000000 522*663afb9bSAndroid Build Coastguard Worker #endif 523*663afb9bSAndroid Build Coastguard Worker #ifdef EFD_NONBLOCK 524*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EFD_NONBLOCK EFD_NONBLOCK 525*663afb9bSAndroid Build Coastguard Worker #else 526*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EFD_NONBLOCK 0x4000 527*663afb9bSAndroid Build Coastguard Worker #endif 528*663afb9bSAndroid Build Coastguard Worker #ifdef EFD_CLOEXEC 529*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EFD_CLOEXEC EFD_CLOEXEC 530*663afb9bSAndroid Build Coastguard Worker #else 531*663afb9bSAndroid Build Coastguard Worker #define EVUTIL_EFD_CLOEXEC 0x8000 532*663afb9bSAndroid Build Coastguard Worker #endif 533*663afb9bSAndroid Build Coastguard Worker 534*663afb9bSAndroid Build Coastguard Worker void evutil_memclear_(void *mem, size_t len); 535*663afb9bSAndroid Build Coastguard Worker 536*663afb9bSAndroid Build Coastguard Worker struct in_addr; 537*663afb9bSAndroid Build Coastguard Worker struct in6_addr; 538*663afb9bSAndroid Build Coastguard Worker 539*663afb9bSAndroid Build Coastguard Worker /* This is a any, loopback, link-local, multicast */ 540*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 541*663afb9bSAndroid Build Coastguard Worker int evutil_v4addr_is_local_(const struct in_addr *in); 542*663afb9bSAndroid Build Coastguard Worker /* This is a reserved, ipv4compat, ipv4map, loopback, 543*663afb9bSAndroid Build Coastguard Worker * link-local, multicast, or unspecified address. */ 544*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 545*663afb9bSAndroid Build Coastguard Worker int evutil_v6addr_is_local_(const struct in6_addr *in); 546*663afb9bSAndroid Build Coastguard Worker 547*663afb9bSAndroid Build Coastguard Worker #ifdef __cplusplus 548*663afb9bSAndroid Build Coastguard Worker } 549*663afb9bSAndroid Build Coastguard Worker #endif 550*663afb9bSAndroid Build Coastguard Worker 551*663afb9bSAndroid Build Coastguard Worker #endif 552