1e2d15004SDag-Erling Smørgrav /* 2e2d15004SDag-Erling Smørgrav * util/ub_event.c - directly call libevent (compatability) functions 3e2d15004SDag-Erling Smørgrav * 4e2d15004SDag-Erling Smørgrav * Copyright (c) 2007, NLnet Labs. All rights reserved. 5e2d15004SDag-Erling Smørgrav * 6e2d15004SDag-Erling Smørgrav * This software is open source. 7e2d15004SDag-Erling Smørgrav * 8e2d15004SDag-Erling Smørgrav * Redistribution and use in source and binary forms, with or without 9e2d15004SDag-Erling Smørgrav * modification, are permitted provided that the following conditions 10e2d15004SDag-Erling Smørgrav * are met: 11e2d15004SDag-Erling Smørgrav * 12e2d15004SDag-Erling Smørgrav * Redistributions of source code must retain the above copyright notice, 13e2d15004SDag-Erling Smørgrav * this list of conditions and the following disclaimer. 14e2d15004SDag-Erling Smørgrav * 15e2d15004SDag-Erling Smørgrav * Redistributions in binary form must reproduce the above copyright notice, 16e2d15004SDag-Erling Smørgrav * this list of conditions and the following disclaimer in the documentation 17e2d15004SDag-Erling Smørgrav * and/or other materials provided with the distribution. 18e2d15004SDag-Erling Smørgrav * 19e2d15004SDag-Erling Smørgrav * Neither the name of the NLNET LABS nor the names of its contributors may 20e2d15004SDag-Erling Smørgrav * be used to endorse or promote products derived from this software without 21e2d15004SDag-Erling Smørgrav * specific prior written permission. 22e2d15004SDag-Erling Smørgrav * 23e2d15004SDag-Erling Smørgrav * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 24e2d15004SDag-Erling Smørgrav * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 25e2d15004SDag-Erling Smørgrav * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 26e2d15004SDag-Erling Smørgrav * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 27e2d15004SDag-Erling Smørgrav * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 28e2d15004SDag-Erling Smørgrav * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 29e2d15004SDag-Erling Smørgrav * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 30e2d15004SDag-Erling Smørgrav * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 31e2d15004SDag-Erling Smørgrav * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 32e2d15004SDag-Erling Smørgrav * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 33e2d15004SDag-Erling Smørgrav * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34e2d15004SDag-Erling Smørgrav */ 35e2d15004SDag-Erling Smørgrav 36e2d15004SDag-Erling Smørgrav /** 37e2d15004SDag-Erling Smørgrav * \file 38e2d15004SDag-Erling Smørgrav * 39e2d15004SDag-Erling Smørgrav * This file contains and implementation for the indirection layer for pluggable 40e2d15004SDag-Erling Smørgrav * events that transparently passes it either directly to libevent, or calls 41e2d15004SDag-Erling Smørgrav * the libevent compatibility layer functions. 42e2d15004SDag-Erling Smørgrav */ 43e2d15004SDag-Erling Smørgrav #include "config.h" 44e2d15004SDag-Erling Smørgrav #include <sys/time.h> 45e2d15004SDag-Erling Smørgrav #include "util/ub_event.h" 46e2d15004SDag-Erling Smørgrav #include "util/log.h" 47e2d15004SDag-Erling Smørgrav #include "util/netevent.h" 48e2d15004SDag-Erling Smørgrav #include "util/tube.h" 49e2d15004SDag-Erling Smørgrav 50e2d15004SDag-Erling Smørgrav /* We define libevent structures here to hide the libevent stuff. */ 51e2d15004SDag-Erling Smørgrav 52e2d15004SDag-Erling Smørgrav #ifdef USE_MINI_EVENT 53e2d15004SDag-Erling Smørgrav # ifdef USE_WINSOCK 54e2d15004SDag-Erling Smørgrav # include "util/winsock_event.h" 55e2d15004SDag-Erling Smørgrav # else 56e2d15004SDag-Erling Smørgrav # include "util/mini_event.h" 57e2d15004SDag-Erling Smørgrav # endif /* USE_WINSOCK */ 58e2d15004SDag-Erling Smørgrav #else /* USE_MINI_EVENT */ 59e2d15004SDag-Erling Smørgrav /* we use libevent */ 60e2d15004SDag-Erling Smørgrav # ifdef HAVE_EVENT_H 61e2d15004SDag-Erling Smørgrav # include <event.h> 62e2d15004SDag-Erling Smørgrav # else 63e2d15004SDag-Erling Smørgrav # include "event2/event.h" 64e2d15004SDag-Erling Smørgrav # include "event2/event_struct.h" 65e2d15004SDag-Erling Smørgrav # include "event2/event_compat.h" 66e2d15004SDag-Erling Smørgrav # endif 67e2d15004SDag-Erling Smørgrav #endif /* USE_MINI_EVENT */ 68e2d15004SDag-Erling Smørgrav 69e2d15004SDag-Erling Smørgrav #if UB_EV_TIMEOUT != EV_TIMEOUT || UB_EV_READ != EV_READ || \ 70e2d15004SDag-Erling Smørgrav UB_EV_WRITE != EV_WRITE || UB_EV_SIGNAL != EV_SIGNAL || \ 71e2d15004SDag-Erling Smørgrav UB_EV_PERSIST != EV_PERSIST 72e2d15004SDag-Erling Smørgrav /* Only necessary for libev */ 73e2d15004SDag-Erling Smørgrav # define NATIVE_BITS(b) ( \ 74e2d15004SDag-Erling Smørgrav (((b) & UB_EV_TIMEOUT) ? EV_TIMEOUT : 0) \ 75e2d15004SDag-Erling Smørgrav | (((b) & UB_EV_READ ) ? EV_READ : 0) \ 76e2d15004SDag-Erling Smørgrav | (((b) & UB_EV_WRITE ) ? EV_WRITE : 0) \ 77e2d15004SDag-Erling Smørgrav | (((b) & UB_EV_SIGNAL ) ? EV_SIGNAL : 0) \ 78e2d15004SDag-Erling Smørgrav | (((b) & UB_EV_PERSIST) ? EV_PERSIST : 0)) 79e2d15004SDag-Erling Smørgrav 80e2d15004SDag-Erling Smørgrav # define UB_EV_BITS(b) ( \ 81e2d15004SDag-Erling Smørgrav (((b) & EV_TIMEOUT) ? UB_EV_TIMEOUT : 0) \ 82e2d15004SDag-Erling Smørgrav | (((b) & EV_READ ) ? UB_EV_READ : 0) \ 83e2d15004SDag-Erling Smørgrav | (((b) & EV_WRITE ) ? UB_EV_WRITE : 0) \ 84e2d15004SDag-Erling Smørgrav | (((b) & EV_SIGNAL ) ? UB_EV_SIGNAL : 0) \ 85e2d15004SDag-Erling Smørgrav | (((b) & EV_PERSIST) ? UB_EV_PERSIST : 0)) 86e2d15004SDag-Erling Smørgrav 87e2d15004SDag-Erling Smørgrav # define UB_EV_BITS_CB(C) void my_ ## C (int fd, short bits, void *arg) \ 88e2d15004SDag-Erling Smørgrav { (C)(fd, UB_EV_BITS(bits), arg); } 89e2d15004SDag-Erling Smørgrav 90e2d15004SDag-Erling Smørgrav UB_EV_BITS_CB(comm_point_udp_callback); 91e2d15004SDag-Erling Smørgrav UB_EV_BITS_CB(comm_point_udp_ancil_callback) 92e2d15004SDag-Erling Smørgrav UB_EV_BITS_CB(comm_point_tcp_accept_callback) 93e2d15004SDag-Erling Smørgrav UB_EV_BITS_CB(comm_point_tcp_handle_callback) 94e2d15004SDag-Erling Smørgrav UB_EV_BITS_CB(comm_timer_callback) 95e2d15004SDag-Erling Smørgrav UB_EV_BITS_CB(comm_signal_callback) 96e2d15004SDag-Erling Smørgrav UB_EV_BITS_CB(comm_point_local_handle_callback) 97e2d15004SDag-Erling Smørgrav UB_EV_BITS_CB(comm_point_raw_handle_callback) 980fb34990SDag-Erling Smørgrav UB_EV_BITS_CB(comm_point_http_handle_callback) 99e2d15004SDag-Erling Smørgrav UB_EV_BITS_CB(tube_handle_signal) 100e2d15004SDag-Erling Smørgrav UB_EV_BITS_CB(comm_base_handle_slow_accept) 101e2d15004SDag-Erling Smørgrav 102e2d15004SDag-Erling Smørgrav static void (*NATIVE_BITS_CB(void (*cb)(int, short, void*)))(int, short, void*) 103e2d15004SDag-Erling Smørgrav { 104e2d15004SDag-Erling Smørgrav if(cb == comm_point_udp_callback) 105e2d15004SDag-Erling Smørgrav return my_comm_point_udp_callback; 106e2d15004SDag-Erling Smørgrav else if(cb == comm_point_udp_ancil_callback) 107e2d15004SDag-Erling Smørgrav return my_comm_point_udp_ancil_callback; 108e2d15004SDag-Erling Smørgrav else if(cb == comm_point_tcp_accept_callback) 109e2d15004SDag-Erling Smørgrav return my_comm_point_tcp_accept_callback; 110e2d15004SDag-Erling Smørgrav else if(cb == comm_point_tcp_handle_callback) 111e2d15004SDag-Erling Smørgrav return my_comm_point_tcp_handle_callback; 112e2d15004SDag-Erling Smørgrav else if(cb == comm_timer_callback) 113e2d15004SDag-Erling Smørgrav return my_comm_timer_callback; 114e2d15004SDag-Erling Smørgrav else if(cb == comm_signal_callback) 115e2d15004SDag-Erling Smørgrav return my_comm_signal_callback; 116e2d15004SDag-Erling Smørgrav else if(cb == comm_point_local_handle_callback) 117e2d15004SDag-Erling Smørgrav return my_comm_point_local_handle_callback; 118e2d15004SDag-Erling Smørgrav else if(cb == comm_point_raw_handle_callback) 119e2d15004SDag-Erling Smørgrav return my_comm_point_raw_handle_callback; 1200fb34990SDag-Erling Smørgrav else if(cb == comm_point_http_handle_callback) 1210fb34990SDag-Erling Smørgrav return my_comm_point_http_handle_callback; 122e2d15004SDag-Erling Smørgrav else if(cb == tube_handle_signal) 123e2d15004SDag-Erling Smørgrav return my_tube_handle_signal; 124e2d15004SDag-Erling Smørgrav else if(cb == comm_base_handle_slow_accept) 125e2d15004SDag-Erling Smørgrav return my_comm_base_handle_slow_accept; 1260fb34990SDag-Erling Smørgrav else { 1270fb34990SDag-Erling Smørgrav log_assert(0); /* this NULL callback pointer should not happen, 1280fb34990SDag-Erling Smørgrav we should have the necessary routine listed above */ 129e2d15004SDag-Erling Smørgrav return NULL; 130e2d15004SDag-Erling Smørgrav } 1310fb34990SDag-Erling Smørgrav } 132e2d15004SDag-Erling Smørgrav #else 133e2d15004SDag-Erling Smørgrav # define NATIVE_BITS(b) (b) 134e2d15004SDag-Erling Smørgrav # define NATIVE_BITS_CB(c) (c) 135e2d15004SDag-Erling Smørgrav #endif 136e2d15004SDag-Erling Smørgrav 137e2d15004SDag-Erling Smørgrav #ifndef EVFLAG_AUTO 138e2d15004SDag-Erling Smørgrav #define EVFLAG_AUTO 0 139e2d15004SDag-Erling Smørgrav #endif 140e2d15004SDag-Erling Smørgrav 141b5663de9SDag-Erling Smørgrav #define AS_EVENT_BASE(x) ((struct event_base*)x) 142b5663de9SDag-Erling Smørgrav #define AS_UB_EVENT_BASE(x) ((struct ub_event_base*)x) 143b5663de9SDag-Erling Smørgrav #define AS_EVENT(x) ((struct event*)x) 144b5663de9SDag-Erling Smørgrav #define AS_UB_EVENT(x) ((struct ub_event*)x) 145e2d15004SDag-Erling Smørgrav 146b5663de9SDag-Erling Smørgrav const char* ub_event_get_version(void) 147e2d15004SDag-Erling Smørgrav { 148e2d15004SDag-Erling Smørgrav return event_get_version(); 149e2d15004SDag-Erling Smørgrav } 150e2d15004SDag-Erling Smørgrav 151*25039b37SCy Schubert #if (defined(HAVE_EV_LOOP) || defined(HAVE_EV_DEFAULT_LOOP)) && defined(EV_FEATURE_BACKENDS) 152e2d15004SDag-Erling Smørgrav static const char* ub_ev_backend2str(int b) 153e2d15004SDag-Erling Smørgrav { 154e2d15004SDag-Erling Smørgrav switch(b) { 155e2d15004SDag-Erling Smørgrav case EVBACKEND_SELECT: return "select"; 156e2d15004SDag-Erling Smørgrav case EVBACKEND_POLL: return "poll"; 157e2d15004SDag-Erling Smørgrav case EVBACKEND_EPOLL: return "epoll"; 158e2d15004SDag-Erling Smørgrav case EVBACKEND_KQUEUE: return "kqueue"; 159e2d15004SDag-Erling Smørgrav case EVBACKEND_DEVPOLL: return "devpoll"; 160e2d15004SDag-Erling Smørgrav case EVBACKEND_PORT: return "evport"; 161e2d15004SDag-Erling Smørgrav } 162e2d15004SDag-Erling Smørgrav return "unknown"; 163e2d15004SDag-Erling Smørgrav } 164e2d15004SDag-Erling Smørgrav #endif 165e2d15004SDag-Erling Smørgrav 166e2d15004SDag-Erling Smørgrav void 167e2d15004SDag-Erling Smørgrav ub_get_event_sys(struct ub_event_base* base, const char** n, const char** s, 168e2d15004SDag-Erling Smørgrav const char** m) 169e2d15004SDag-Erling Smørgrav { 170e2d15004SDag-Erling Smørgrav #ifdef USE_WINSOCK 171e2d15004SDag-Erling Smørgrav (void)base; 172e2d15004SDag-Erling Smørgrav *n = "event"; 173e2d15004SDag-Erling Smørgrav *s = "winsock"; 174e2d15004SDag-Erling Smørgrav *m = "WSAWaitForMultipleEvents"; 175e2d15004SDag-Erling Smørgrav #elif defined(USE_MINI_EVENT) 176e2d15004SDag-Erling Smørgrav (void)base; 177e2d15004SDag-Erling Smørgrav *n = "mini-event"; 178e2d15004SDag-Erling Smørgrav *s = "internal"; 179e2d15004SDag-Erling Smørgrav *m = "select"; 180e2d15004SDag-Erling Smørgrav #else 181e2d15004SDag-Erling Smørgrav struct event_base* b = AS_EVENT_BASE(base); 182e2d15004SDag-Erling Smørgrav *s = event_get_version(); 183e2d15004SDag-Erling Smørgrav # if defined(HAVE_EV_LOOP) || defined(HAVE_EV_DEFAULT_LOOP) 184e2d15004SDag-Erling Smørgrav *n = "libev"; 185e2d15004SDag-Erling Smørgrav if (!b) 186e2d15004SDag-Erling Smørgrav b = (struct event_base*)ev_default_loop(EVFLAG_AUTO); 187*25039b37SCy Schubert # ifdef EV_FEATURE_BACKENDS 188e2d15004SDag-Erling Smørgrav *m = ub_ev_backend2str(ev_backend((struct ev_loop*)b)); 189e2d15004SDag-Erling Smørgrav # else 190e2d15004SDag-Erling Smørgrav *m = "not obtainable"; 191e2d15004SDag-Erling Smørgrav # endif 192e2d15004SDag-Erling Smørgrav # elif defined(HAVE_EVENT_BASE_GET_METHOD) 193e2d15004SDag-Erling Smørgrav *n = "libevent"; 194e2d15004SDag-Erling Smørgrav if (!b) 195e2d15004SDag-Erling Smørgrav b = event_base_new(); 196e2d15004SDag-Erling Smørgrav *m = event_base_get_method(b); 197e2d15004SDag-Erling Smørgrav # else 198e2d15004SDag-Erling Smørgrav *n = "unknown"; 199e2d15004SDag-Erling Smørgrav *m = "not obtainable"; 200e2d15004SDag-Erling Smørgrav (void)b; 201e2d15004SDag-Erling Smørgrav # endif 202e2d15004SDag-Erling Smørgrav # ifdef HAVE_EVENT_BASE_FREE 203e2d15004SDag-Erling Smørgrav if (b && b != AS_EVENT_BASE(base)) 204e2d15004SDag-Erling Smørgrav event_base_free(b); 205e2d15004SDag-Erling Smørgrav # endif 206e2d15004SDag-Erling Smørgrav #endif 207e2d15004SDag-Erling Smørgrav } 208e2d15004SDag-Erling Smørgrav 209e2d15004SDag-Erling Smørgrav struct ub_event_base* 210e2d15004SDag-Erling Smørgrav ub_default_event_base(int sigs, time_t* time_secs, struct timeval* time_tv) 211e2d15004SDag-Erling Smørgrav { 212e2d15004SDag-Erling Smørgrav void* base; 213e2d15004SDag-Erling Smørgrav 214e2d15004SDag-Erling Smørgrav (void)base; 215e2d15004SDag-Erling Smørgrav #ifdef USE_MINI_EVENT 216e2d15004SDag-Erling Smørgrav (void)sigs; 217e2d15004SDag-Erling Smørgrav /* use mini event time-sharing feature */ 218e2d15004SDag-Erling Smørgrav base = event_init(time_secs, time_tv); 219e2d15004SDag-Erling Smørgrav #else 220e2d15004SDag-Erling Smørgrav (void)time_secs; 221e2d15004SDag-Erling Smørgrav (void)time_tv; 222e2d15004SDag-Erling Smørgrav # if defined(HAVE_EV_LOOP) || defined(HAVE_EV_DEFAULT_LOOP) 223e2d15004SDag-Erling Smørgrav /* libev */ 224e2d15004SDag-Erling Smørgrav if(sigs) 225e2d15004SDag-Erling Smørgrav base = ev_default_loop(EVFLAG_AUTO); 226e2d15004SDag-Erling Smørgrav else 227e2d15004SDag-Erling Smørgrav base = ev_loop_new(EVFLAG_AUTO); 228e2d15004SDag-Erling Smørgrav # else 229e2d15004SDag-Erling Smørgrav (void)sigs; 230e2d15004SDag-Erling Smørgrav # ifdef HAVE_EVENT_BASE_NEW 231e2d15004SDag-Erling Smørgrav base = event_base_new(); 232e2d15004SDag-Erling Smørgrav # else 233e2d15004SDag-Erling Smørgrav base = event_init(); 234e2d15004SDag-Erling Smørgrav # endif 235e2d15004SDag-Erling Smørgrav # endif 236e2d15004SDag-Erling Smørgrav #endif 237e2d15004SDag-Erling Smørgrav return (struct ub_event_base*)base; 238e2d15004SDag-Erling Smørgrav } 239e2d15004SDag-Erling Smørgrav 240e2d15004SDag-Erling Smørgrav struct ub_event_base * 241e2d15004SDag-Erling Smørgrav ub_libevent_event_base(struct event_base* libevent_base) 242e2d15004SDag-Erling Smørgrav { 243e2d15004SDag-Erling Smørgrav #ifdef USE_MINI_EVENT 244e2d15004SDag-Erling Smørgrav (void)libevent_base; 245e2d15004SDag-Erling Smørgrav return NULL; 246e2d15004SDag-Erling Smørgrav #else 247e2d15004SDag-Erling Smørgrav return AS_UB_EVENT_BASE(libevent_base); 248e2d15004SDag-Erling Smørgrav #endif 249e2d15004SDag-Erling Smørgrav } 250e2d15004SDag-Erling Smørgrav 251e2d15004SDag-Erling Smørgrav struct event_base * 252e2d15004SDag-Erling Smørgrav ub_libevent_get_event_base(struct ub_event_base* base) 253e2d15004SDag-Erling Smørgrav { 254e2d15004SDag-Erling Smørgrav #ifdef USE_MINI_EVENT 255e2d15004SDag-Erling Smørgrav (void)base; 256e2d15004SDag-Erling Smørgrav return NULL; 257e2d15004SDag-Erling Smørgrav #else 258e2d15004SDag-Erling Smørgrav return AS_EVENT_BASE(base); 259e2d15004SDag-Erling Smørgrav #endif 260e2d15004SDag-Erling Smørgrav } 261e2d15004SDag-Erling Smørgrav 262e2d15004SDag-Erling Smørgrav void 263e2d15004SDag-Erling Smørgrav ub_event_base_free(struct ub_event_base* base) 264e2d15004SDag-Erling Smørgrav { 265e2d15004SDag-Erling Smørgrav #ifdef USE_MINI_EVENT 266e2d15004SDag-Erling Smørgrav event_base_free(AS_EVENT_BASE(base)); 267e2d15004SDag-Erling Smørgrav #elif defined(HAVE_EVENT_BASE_FREE) && defined(HAVE_EVENT_BASE_ONCE) 268e2d15004SDag-Erling Smørgrav /* only libevent 1.2+ has it, but in 1.2 it is broken - 269e2d15004SDag-Erling Smørgrav assertion fails on signal handling ev that is not deleted 270e2d15004SDag-Erling Smørgrav in libevent 1.3c (event_base_once appears) this is fixed. */ 271e2d15004SDag-Erling Smørgrav event_base_free(AS_EVENT_BASE(base)); 272e2d15004SDag-Erling Smørgrav #else 273e2d15004SDag-Erling Smørgrav (void)base; 274e2d15004SDag-Erling Smørgrav #endif /* HAVE_EVENT_BASE_FREE and HAVE_EVENT_BASE_ONCE */ 275e2d15004SDag-Erling Smørgrav } 276e2d15004SDag-Erling Smørgrav 277e2d15004SDag-Erling Smørgrav int 278e2d15004SDag-Erling Smørgrav ub_event_base_dispatch(struct ub_event_base* base) 279e2d15004SDag-Erling Smørgrav { 280e2d15004SDag-Erling Smørgrav return event_base_dispatch(AS_EVENT_BASE(base)); 281e2d15004SDag-Erling Smørgrav } 282e2d15004SDag-Erling Smørgrav 283e2d15004SDag-Erling Smørgrav int 284e2d15004SDag-Erling Smørgrav ub_event_base_loopexit(struct ub_event_base* base) 285e2d15004SDag-Erling Smørgrav { 286e2d15004SDag-Erling Smørgrav return event_base_loopexit(AS_EVENT_BASE(base), NULL); 287e2d15004SDag-Erling Smørgrav } 288e2d15004SDag-Erling Smørgrav 289e2d15004SDag-Erling Smørgrav struct ub_event* 290e2d15004SDag-Erling Smørgrav ub_event_new(struct ub_event_base* base, int fd, short bits, 291e2d15004SDag-Erling Smørgrav void (*cb)(int, short, void*), void* arg) 292e2d15004SDag-Erling Smørgrav { 293e2d15004SDag-Erling Smørgrav struct event *ev = (struct event*)calloc(1, sizeof(struct event)); 294e2d15004SDag-Erling Smørgrav 295e2d15004SDag-Erling Smørgrav if (!ev) 296e2d15004SDag-Erling Smørgrav return NULL; 297e2d15004SDag-Erling Smørgrav 298e86b9096SDag-Erling Smørgrav #ifndef HAVE_EVENT_ASSIGN 299e2d15004SDag-Erling Smørgrav event_set(ev, fd, NATIVE_BITS(bits), NATIVE_BITS_CB(cb), arg); 300e2d15004SDag-Erling Smørgrav if (event_base_set(AS_EVENT_BASE(base), ev) != 0) { 301e2d15004SDag-Erling Smørgrav free(ev); 302e2d15004SDag-Erling Smørgrav return NULL; 303e2d15004SDag-Erling Smørgrav } 304e86b9096SDag-Erling Smørgrav #else 305e86b9096SDag-Erling Smørgrav if (event_assign(ev, AS_EVENT_BASE(base), fd, bits, cb, arg) != 0) { 306e86b9096SDag-Erling Smørgrav free(ev); 307e86b9096SDag-Erling Smørgrav return NULL; 308e86b9096SDag-Erling Smørgrav } 309e86b9096SDag-Erling Smørgrav #endif 310e2d15004SDag-Erling Smørgrav return AS_UB_EVENT(ev); 311e2d15004SDag-Erling Smørgrav } 312e2d15004SDag-Erling Smørgrav 313e2d15004SDag-Erling Smørgrav struct ub_event* 314e2d15004SDag-Erling Smørgrav ub_signal_new(struct ub_event_base* base, int fd, 315e2d15004SDag-Erling Smørgrav void (*cb)(int, short, void*), void* arg) 316e2d15004SDag-Erling Smørgrav { 317e2d15004SDag-Erling Smørgrav struct event *ev = (struct event*)calloc(1, sizeof(struct event)); 318e2d15004SDag-Erling Smørgrav 319e2d15004SDag-Erling Smørgrav if (!ev) 320e2d15004SDag-Erling Smørgrav return NULL; 321e2d15004SDag-Erling Smørgrav 322e86b9096SDag-Erling Smørgrav #if !HAVE_DECL_EVSIGNAL_ASSIGN 323e2d15004SDag-Erling Smørgrav signal_set(ev, fd, NATIVE_BITS_CB(cb), arg); 324e2d15004SDag-Erling Smørgrav if (event_base_set(AS_EVENT_BASE(base), ev) != 0) { 325e2d15004SDag-Erling Smørgrav free(ev); 326e2d15004SDag-Erling Smørgrav return NULL; 327e2d15004SDag-Erling Smørgrav } 328e86b9096SDag-Erling Smørgrav #else 329e86b9096SDag-Erling Smørgrav if (evsignal_assign(ev, AS_EVENT_BASE(base), fd, cb, arg) != 0) { 330e86b9096SDag-Erling Smørgrav free(ev); 331e86b9096SDag-Erling Smørgrav return NULL; 332e86b9096SDag-Erling Smørgrav } 333e86b9096SDag-Erling Smørgrav #endif 334e2d15004SDag-Erling Smørgrav return AS_UB_EVENT(ev); 335e2d15004SDag-Erling Smørgrav } 336e2d15004SDag-Erling Smørgrav 337e2d15004SDag-Erling Smørgrav struct ub_event* 338e2d15004SDag-Erling Smørgrav ub_winsock_register_wsaevent(struct ub_event_base* base, void* wsaevent, 339e2d15004SDag-Erling Smørgrav void (*cb)(int, short, void*), void* arg) 340e2d15004SDag-Erling Smørgrav { 341e2d15004SDag-Erling Smørgrav #if defined(USE_MINI_EVENT) && defined(USE_WINSOCK) 342e2d15004SDag-Erling Smørgrav struct event *ev = (struct event*)calloc(1, sizeof(struct event)); 343e2d15004SDag-Erling Smørgrav 344e2d15004SDag-Erling Smørgrav if (!ev) 345e2d15004SDag-Erling Smørgrav return NULL; 346e2d15004SDag-Erling Smørgrav 347e2d15004SDag-Erling Smørgrav if (winsock_register_wsaevent(AS_EVENT_BASE(base), ev, wsaevent, cb, 348e2d15004SDag-Erling Smørgrav arg)) 349e2d15004SDag-Erling Smørgrav return AS_UB_EVENT(ev); 350e2d15004SDag-Erling Smørgrav free(ev); 351e2d15004SDag-Erling Smørgrav return NULL; 352e2d15004SDag-Erling Smørgrav #else 353e2d15004SDag-Erling Smørgrav (void)base; 354e2d15004SDag-Erling Smørgrav (void)wsaevent; 355e2d15004SDag-Erling Smørgrav (void)cb; 356e2d15004SDag-Erling Smørgrav (void)arg; 357e2d15004SDag-Erling Smørgrav return NULL; 358e2d15004SDag-Erling Smørgrav #endif 359e2d15004SDag-Erling Smørgrav } 360e2d15004SDag-Erling Smørgrav 361e2d15004SDag-Erling Smørgrav void 362e2d15004SDag-Erling Smørgrav ub_event_add_bits(struct ub_event* ev, short bits) 363e2d15004SDag-Erling Smørgrav { 364e2d15004SDag-Erling Smørgrav AS_EVENT(ev)->ev_events |= NATIVE_BITS(bits); 365e2d15004SDag-Erling Smørgrav } 366e2d15004SDag-Erling Smørgrav 367e2d15004SDag-Erling Smørgrav void 368e2d15004SDag-Erling Smørgrav ub_event_del_bits(struct ub_event* ev, short bits) 369e2d15004SDag-Erling Smørgrav { 370e2d15004SDag-Erling Smørgrav AS_EVENT(ev)->ev_events &= ~NATIVE_BITS(bits); 371e2d15004SDag-Erling Smørgrav } 372e2d15004SDag-Erling Smørgrav 373e2d15004SDag-Erling Smørgrav void 374e2d15004SDag-Erling Smørgrav ub_event_set_fd(struct ub_event* ev, int fd) 375e2d15004SDag-Erling Smørgrav { 376e2d15004SDag-Erling Smørgrav AS_EVENT(ev)->ev_fd = fd; 377e2d15004SDag-Erling Smørgrav } 378e2d15004SDag-Erling Smørgrav 379e2d15004SDag-Erling Smørgrav void 380e2d15004SDag-Erling Smørgrav ub_event_free(struct ub_event* ev) 381e2d15004SDag-Erling Smørgrav { 382e2d15004SDag-Erling Smørgrav if (ev) 383e2d15004SDag-Erling Smørgrav free(AS_EVENT(ev)); 384e2d15004SDag-Erling Smørgrav } 385e2d15004SDag-Erling Smørgrav 386e2d15004SDag-Erling Smørgrav int 387e2d15004SDag-Erling Smørgrav ub_event_add(struct ub_event* ev, struct timeval* tv) 388e2d15004SDag-Erling Smørgrav { 389e2d15004SDag-Erling Smørgrav return event_add(AS_EVENT(ev), tv); 390e2d15004SDag-Erling Smørgrav } 391e2d15004SDag-Erling Smørgrav 392e2d15004SDag-Erling Smørgrav int 393e2d15004SDag-Erling Smørgrav ub_event_del(struct ub_event* ev) 394e2d15004SDag-Erling Smørgrav { 395e2d15004SDag-Erling Smørgrav return event_del(AS_EVENT(ev)); 396e2d15004SDag-Erling Smørgrav } 397e2d15004SDag-Erling Smørgrav 398e2d15004SDag-Erling Smørgrav int 399e2d15004SDag-Erling Smørgrav ub_timer_add(struct ub_event* ev, struct ub_event_base* base, 400e2d15004SDag-Erling Smørgrav void (*cb)(int, short, void*), void* arg, struct timeval* tv) 401e2d15004SDag-Erling Smørgrav { 402e2d15004SDag-Erling Smørgrav event_set(AS_EVENT(ev), -1, EV_TIMEOUT, NATIVE_BITS_CB(cb), arg); 403e2d15004SDag-Erling Smørgrav if (event_base_set(AS_EVENT_BASE(base), AS_EVENT(ev)) != 0) 404e2d15004SDag-Erling Smørgrav return -1; 405e2d15004SDag-Erling Smørgrav return evtimer_add(AS_EVENT(ev), tv); 406e2d15004SDag-Erling Smørgrav } 407e2d15004SDag-Erling Smørgrav 408e2d15004SDag-Erling Smørgrav int 409e2d15004SDag-Erling Smørgrav ub_timer_del(struct ub_event* ev) 410e2d15004SDag-Erling Smørgrav { 411e2d15004SDag-Erling Smørgrav return evtimer_del(AS_EVENT(ev)); 412e2d15004SDag-Erling Smørgrav } 413e2d15004SDag-Erling Smørgrav 414e2d15004SDag-Erling Smørgrav int 415e2d15004SDag-Erling Smørgrav ub_signal_add(struct ub_event* ev, struct timeval* tv) 416e2d15004SDag-Erling Smørgrav { 417e2d15004SDag-Erling Smørgrav return signal_add(AS_EVENT(ev), tv); 418e2d15004SDag-Erling Smørgrav } 419e2d15004SDag-Erling Smørgrav 420e2d15004SDag-Erling Smørgrav int 421e2d15004SDag-Erling Smørgrav ub_signal_del(struct ub_event* ev) 422e2d15004SDag-Erling Smørgrav { 423e2d15004SDag-Erling Smørgrav return signal_del(AS_EVENT(ev)); 424e2d15004SDag-Erling Smørgrav } 425e2d15004SDag-Erling Smørgrav 426e2d15004SDag-Erling Smørgrav void 427e2d15004SDag-Erling Smørgrav ub_winsock_unregister_wsaevent(struct ub_event* ev) 428e2d15004SDag-Erling Smørgrav { 429e2d15004SDag-Erling Smørgrav #if defined(USE_MINI_EVENT) && defined(USE_WINSOCK) 430e2d15004SDag-Erling Smørgrav winsock_unregister_wsaevent(AS_EVENT(ev)); 431e2d15004SDag-Erling Smørgrav free(AS_EVENT(ev)); 432e2d15004SDag-Erling Smørgrav #else 433e2d15004SDag-Erling Smørgrav (void)ev; 434e2d15004SDag-Erling Smørgrav #endif 435e2d15004SDag-Erling Smørgrav } 436e2d15004SDag-Erling Smørgrav 437e2d15004SDag-Erling Smørgrav void 438e2d15004SDag-Erling Smørgrav ub_winsock_tcp_wouldblock(struct ub_event* ev, int eventbits) 439e2d15004SDag-Erling Smørgrav { 440e2d15004SDag-Erling Smørgrav #if defined(USE_MINI_EVENT) && defined(USE_WINSOCK) 441e2d15004SDag-Erling Smørgrav winsock_tcp_wouldblock(AS_EVENT(ev), NATIVE_BITS(eventbits)); 442e2d15004SDag-Erling Smørgrav #else 443e2d15004SDag-Erling Smørgrav (void)ev; 444e2d15004SDag-Erling Smørgrav (void)eventbits; 445e2d15004SDag-Erling Smørgrav #endif 446e2d15004SDag-Erling Smørgrav } 447e2d15004SDag-Erling Smørgrav 448e2d15004SDag-Erling Smørgrav void ub_comm_base_now(struct comm_base* cb) 449e2d15004SDag-Erling Smørgrav { 450e2d15004SDag-Erling Smørgrav #ifdef USE_MINI_EVENT 451e2d15004SDag-Erling Smørgrav /** minievent updates the time when it blocks. */ 452e2d15004SDag-Erling Smørgrav (void)cb; /* nothing to do */ 453e2d15004SDag-Erling Smørgrav #else /* !USE_MINI_EVENT */ 454e2d15004SDag-Erling Smørgrav /** fillup the time values in the event base */ 455e2d15004SDag-Erling Smørgrav time_t *tt; 456e2d15004SDag-Erling Smørgrav struct timeval *tv; 457e2d15004SDag-Erling Smørgrav comm_base_timept(cb, &tt, &tv); 458e2d15004SDag-Erling Smørgrav if(gettimeofday(tv, NULL) < 0) { 459e2d15004SDag-Erling Smørgrav log_err("gettimeofday: %s", strerror(errno)); 460e2d15004SDag-Erling Smørgrav } 4610eefd307SCy Schubert #ifndef S_SPLINT_S 462e2d15004SDag-Erling Smørgrav *tt = tv->tv_sec; 4630eefd307SCy Schubert #endif 464e2d15004SDag-Erling Smørgrav #endif /* USE_MINI_EVENT */ 465e2d15004SDag-Erling Smørgrav } 466e2d15004SDag-Erling Smørgrav 467