26 #ifndef UTIL_INTERNAL_H_INCLUDED_
27 #define UTIL_INTERNAL_H_INCLUDED_
29 #include "event2/event-config.h"
30 #include "evconfig-private.h"
35 #include "log-internal.h"
38 #ifdef EVENT__HAVE_SYS_SOCKET_H
39 #include <sys/socket.h>
41 #ifdef EVENT__HAVE_SYS_EVENTFD_H
42 #include <sys/eventfd.h>
46 #include "time-internal.h"
54 #ifdef __has_attribute
55 # define EVUTIL_HAS_ATTRIBUTE __has_attribute
58 #if defined(__clang__) && __clang__ == 1
59 # if defined(__apple_build_version__)
60 # if __clang_major__ <= 6
61 # undef EVUTIL_HAS_ATTRIBUTE
64 # if __clang_major__ == 3 && __clang_minor__ >= 2 && __clang_minor__ <= 5
65 # undef EVUTIL_HAS_ATTRIBUTE
69 #ifndef EVUTIL_HAS_ATTRIBUTE
70 # define EVUTIL_HAS_ATTRIBUTE(x) 0
75 #define inline EVENT__inline
79 #if defined(EVENT__HAVE___func__)
81 # define __func__ __func__
83 #elif defined(EVENT__HAVE___FUNCTION__)
84 # define __func__ __FUNCTION__
86 # define __func__ __FILE__
90 #define EVUTIL_NIL_STMT_ ((void)0)
96 #define EVUTIL_NIL_CONDITION_(condition) do { \
97 (void)sizeof(!(condition)); \
110 #if EAGAIN == EWOULDBLOCK
111 #define EVUTIL_ERR_IS_EAGAIN(e) \
114 #define EVUTIL_ERR_IS_EAGAIN(e) \
115 ((e) == EAGAIN || (e) == EWOULDBLOCK)
119 #define EVUTIL_ERR_RW_RETRIABLE(e) \
120 ((e) == EINTR || EVUTIL_ERR_IS_EAGAIN(e))
122 #define EVUTIL_ERR_CONNECT_RETRIABLE(e) \
123 ((e) == EINTR || (e) == EINPROGRESS)
125 #define EVUTIL_ERR_ACCEPT_RETRIABLE(e) \
126 ((e) == EINTR || EVUTIL_ERR_IS_EAGAIN(e) || (e) == ECONNABORTED)
129 #define EVUTIL_ERR_CONNECT_REFUSED(e) \
130 ((e) == ECONNREFUSED)
135 #define EVUTIL_ERR_IS_EAGAIN(e) \
136 ((e) == WSAEWOULDBLOCK || (e) == EAGAIN)
138 #define EVUTIL_ERR_RW_RETRIABLE(e) \
139 ((e) == WSAEWOULDBLOCK || \
142 #define EVUTIL_ERR_CONNECT_RETRIABLE(e) \
143 ((e) == WSAEWOULDBLOCK || \
145 (e) == WSAEINPROGRESS || \
148 #define EVUTIL_ERR_ACCEPT_RETRIABLE(e) \
149 EVUTIL_ERR_RW_RETRIABLE(e)
151 #define EVUTIL_ERR_CONNECT_REFUSED(e) \
152 ((e) == WSAECONNREFUSED)
158 #define EVUTIL_SHUT_RD SHUT_RD
160 #define EVUTIL_SHUT_RD 0
163 #define EVUTIL_SHUT_WR SHUT_WR
165 #define EVUTIL_SHUT_WR 1
168 #define EVUTIL_SHUT_BOTH SHUT_BOTH
170 #define EVUTIL_SHUT_BOTH 2
179 #define EVUTIL_ASSERT_LIST_OK(dlist, type, field) do { \
180 struct type *elm1, *elm2, **nextp; \
181 if (LIST_EMPTY((dlist))) \
186 elm1 = LIST_FIRST((dlist)); \
187 elm2 = LIST_NEXT(elm1, field); \
188 while (elm1 && elm2) { \
189 EVUTIL_ASSERT(elm1 != elm2); \
190 elm1 = LIST_NEXT(elm1, field); \
191 elm2 = LIST_NEXT(elm2, field); \
194 EVUTIL_ASSERT(elm1 != elm2); \
195 elm2 = LIST_NEXT(elm2, field); \
199 nextp = &LIST_FIRST((dlist)); \
200 elm1 = LIST_FIRST((dlist)); \
202 EVUTIL_ASSERT(*nextp == elm1); \
203 EVUTIL_ASSERT(nextp == elm1->field.le_prev); \
204 nextp = &LIST_NEXT(elm1, field); \
215 #define EVUTIL_ASSERT_TAILQ_OK(tailq, type, field) do { \
216 struct type *elm1, *elm2, **nextp; \
217 if (TAILQ_EMPTY((tailq))) \
222 elm1 = TAILQ_FIRST((tailq)); \
223 elm2 = TAILQ_NEXT(elm1, field); \
224 while (elm1 && elm2) { \
225 EVUTIL_ASSERT(elm1 != elm2); \
226 elm1 = TAILQ_NEXT(elm1, field); \
227 elm2 = TAILQ_NEXT(elm2, field); \
230 EVUTIL_ASSERT(elm1 != elm2); \
231 elm2 = TAILQ_NEXT(elm2, field); \
235 nextp = &TAILQ_FIRST((tailq)); \
236 elm1 = TAILQ_FIRST((tailq)); \
238 EVUTIL_ASSERT(*nextp == elm1); \
239 EVUTIL_ASSERT(nextp == elm1->field.tqe_prev); \
240 nextp = &TAILQ_NEXT(elm1, field); \
243 EVUTIL_ASSERT(nextp == (tailq)->tqh_last); \
251 int EVUTIL_ISALPHA_(
char c);
253 int EVUTIL_ISALNUM_(
char c);
254 int EVUTIL_ISSPACE_(
char c);
256 int EVUTIL_ISDIGIT_(
char c);
258 int EVUTIL_ISXDIGIT_(
char c);
259 int EVUTIL_ISPRINT_(
char c);
260 int EVUTIL_ISLOWER_(
char c);
261 int EVUTIL_ISUPPER_(
char c);
263 char EVUTIL_TOUPPER_(
char c);
265 char EVUTIL_TOLOWER_(
char c);
270 void evutil_rtrim_lws_(
char *);
288 #define EVUTIL_UPCAST(ptr, type, field) \
289 ((type *)(((char*)(ptr)) - evutil_offsetof(type, field)))
294 int evutil_open_closeonexec_(
const char *pathname,
int flags,
unsigned mode);
297 int evutil_read_file_(
const char *filename,
char **content_out,
size_t *len_out,
301 int evutil_socket_connect_(
evutil_socket_t *fd_ptr,
const struct sockaddr *sa,
int socklen);
308 int evutil_resolve_(
int family,
const char *hostname,
struct sockaddr *sa,
309 ev_socklen_t *socklen,
int port);
311 const char *evutil_getenv_(
const char *name);
319 #define EVUTIL_WEAKRAND_MAX EV_INT32_MAX
346 #if defined(__GNUC__) && __GNUC__ >= 3
347 #define EVUTIL_UNLIKELY(p) __builtin_expect(!!(p),0)
349 #define EVUTIL_UNLIKELY(p) (p)
352 #if EVUTIL_HAS_ATTRIBUTE(fallthrough)
353 #define EVUTIL_FALLTHROUGH __attribute__((fallthrough))
355 #define EVUTIL_FALLTHROUGH
360 #define EVUTIL_ASSERT(cond) EVUTIL_NIL_CONDITION_(cond)
361 #define EVUTIL_FAILURE_CHECK(cond) 0
363 #define EVUTIL_ASSERT(cond) \
365 if (EVUTIL_UNLIKELY(!(cond))) { \
366 event_errx(EVENT_ERR_ABORT_, \
367 "%s:%d: Assertion %s failed in %s", \
368 __FILE__,__LINE__,#cond,__func__); \
371 (void)fprintf(stderr, \
372 "%s:%d: Assertion %s failed in %s", \
373 __FILE__,__LINE__,#cond,__func__); \
377 #define EVUTIL_FAILURE_CHECK(cond) EVUTIL_UNLIKELY(cond)
380 #ifndef EVENT__HAVE_STRUCT_SOCKADDR_STORAGE
386 struct sockaddr ss_sa;
387 struct sockaddr_in ss_sin;
389 char ss_padding[128];
392 #define ss_family ss_union.ss_sa.sa_family
398 #define EVUTIL_EAI_NEED_RESOLVE -90002
404 const char *nodename,
const char *servname,
408 void evutil_set_evdns_getaddrinfo_fn_(evdns_getaddrinfo_fn fn);
409 typedef void (*evdns_getaddrinfo_cancel_fn)(
412 void evutil_set_evdns_getaddrinfo_cancel_fn_(evdns_getaddrinfo_cancel_fn fn);
421 void evutil_adjust_hints_for_addrconfig_(
struct evutil_addrinfo *hints);
423 int evutil_getaddrinfo_common_(
const char *nodename,
const char *servname,
428 const char *nodename,
const char *servname,
436 int evutil_sockaddr_is_loopback_(
const struct sockaddr *sa);
445 const char *evutil_format_sockaddr_port_(
const struct sockaddr *sa,
char *out,
size_t outlen);
447 int evutil_hex_char_to_int_(
char c);
450 void evutil_free_secure_rng_globals_(
void);
451 void evutil_free_globals_(
void);
455 HMODULE evutil_load_windows_system_library_(
const TCHAR *library_name);
459 #if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__)
460 #define EV_U64_FMT "%I64u"
461 #define EV_I64_FMT "%I64d"
462 #define EV_I64_ARG(x) ((__int64)(x))
463 #define EV_U64_ARG(x) ((unsigned __int64)(x))
465 #define EV_U64_FMT "%llu"
466 #define EV_I64_FMT "%lld"
467 #define EV_I64_ARG(x) ((long long)(x))
468 #define EV_U64_ARG(x) ((unsigned long long)(x))
473 #define EV_SOCK_FMT EV_I64_FMT
474 #define EV_SOCK_ARG(x) EV_I64_ARG((x))
476 #define EV_SOCK_FMT "%d"
477 #define EV_SOCK_ARG(x) (x)
480 #if defined(__STDC__) && defined(__STDC_VERSION__) && !defined(__MINGW64_VERSION_MAJOR)
481 #if (__STDC_VERSION__ >= 199901L)
482 #define EV_SIZE_FMT "%zu"
483 #define EV_SSIZE_FMT "%zd"
484 #define EV_SIZE_ARG(x) (x)
485 #define EV_SSIZE_ARG(x) (x)
490 #if (EVENT__SIZEOF_SIZE_T <= EVENT__SIZEOF_LONG)
491 #define EV_SIZE_FMT "%lu"
492 #define EV_SSIZE_FMT "%ld"
493 #define EV_SIZE_ARG(x) ((unsigned long)(x))
494 #define EV_SSIZE_ARG(x) ((long)(x))
496 #define EV_SIZE_FMT EV_U64_FMT
497 #define EV_SSIZE_FMT EV_I64_FMT
498 #define EV_SIZE_ARG(x) EV_U64_ARG(x)
499 #define EV_SSIZE_ARG(x) EV_I64_ARG(x)
506 ev_socklen_t *addrlen,
int flags);
514 #define EVUTIL_SOCK_NONBLOCK SOCK_NONBLOCK
516 #define EVUTIL_SOCK_NONBLOCK 0x4000000
519 #define EVUTIL_SOCK_CLOEXEC SOCK_CLOEXEC
521 #define EVUTIL_SOCK_CLOEXEC 0x80000000
524 #define EVUTIL_EFD_NONBLOCK EFD_NONBLOCK
526 #define EVUTIL_EFD_NONBLOCK 0x4000
529 #define EVUTIL_EFD_CLOEXEC EFD_CLOEXEC
531 #define EVUTIL_EFD_CLOEXEC 0x8000
534 void evutil_memclear_(
void *mem,
size_t len);
541 int evutil_v4addr_is_local_(
const struct in_addr *in);
545 int evutil_v6addr_is_local_(
const struct in6_addr *in);
Definition: util-internal.h:315
Definition: ipv6-internal.h:53
Definition: ipv6-internal.h:63
Definition: util-internal.h:384
#define evutil_socket_t
Definition: util.h:310