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) 98e2d15004SDag-Erling Smørgrav UB_EV_BITS_CB(tube_handle_signal) 99e2d15004SDag-Erling Smørgrav UB_EV_BITS_CB(comm_base_handle_slow_accept) 100e2d15004SDag-Erling Smørgrav 101e2d15004SDag-Erling Smørgrav static void (*NATIVE_BITS_CB(void (*cb)(int, short, void*)))(int, short, void*) 102e2d15004SDag-Erling Smørgrav { 103e2d15004SDag-Erling Smørgrav if(cb == comm_point_udp_callback) 104e2d15004SDag-Erling Smørgrav return my_comm_point_udp_callback; 105e2d15004SDag-Erling Smørgrav else if(cb == comm_point_udp_ancil_callback) 106e2d15004SDag-Erling Smørgrav return my_comm_point_udp_ancil_callback; 107e2d15004SDag-Erling Smørgrav else if(cb == comm_point_tcp_accept_callback) 108e2d15004SDag-Erling Smørgrav return my_comm_point_tcp_accept_callback; 109e2d15004SDag-Erling Smørgrav else if(cb == comm_point_tcp_handle_callback) 110e2d15004SDag-Erling Smørgrav return my_comm_point_tcp_handle_callback; 111e2d15004SDag-Erling Smørgrav else if(cb == comm_timer_callback) 112e2d15004SDag-Erling Smørgrav return my_comm_timer_callback; 113e2d15004SDag-Erling Smørgrav else if(cb == comm_signal_callback) 114e2d15004SDag-Erling Smørgrav return my_comm_signal_callback; 115e2d15004SDag-Erling Smørgrav else if(cb == comm_point_local_handle_callback) 116e2d15004SDag-Erling Smørgrav return my_comm_point_local_handle_callback; 117e2d15004SDag-Erling Smørgrav else if(cb == comm_point_raw_handle_callback) 118e2d15004SDag-Erling Smørgrav return my_comm_point_raw_handle_callback; 119e2d15004SDag-Erling Smørgrav else if(cb == tube_handle_signal) 120e2d15004SDag-Erling Smørgrav return my_tube_handle_signal; 121e2d15004SDag-Erling Smørgrav else if(cb == comm_base_handle_slow_accept) 122e2d15004SDag-Erling Smørgrav return my_comm_base_handle_slow_accept; 123e2d15004SDag-Erling Smørgrav else 124e2d15004SDag-Erling Smørgrav return NULL; 125e2d15004SDag-Erling Smørgrav } 126e2d15004SDag-Erling Smørgrav #else 127e2d15004SDag-Erling Smørgrav # define NATIVE_BITS(b) (b) 128e2d15004SDag-Erling Smørgrav # define NATIVE_BITS_CB(c) (c) 129e2d15004SDag-Erling Smørgrav #endif 130e2d15004SDag-Erling Smørgrav 131e2d15004SDag-Erling Smørgrav #ifndef EVFLAG_AUTO 132e2d15004SDag-Erling Smørgrav #define EVFLAG_AUTO 0 133e2d15004SDag-Erling Smørgrav #endif 134e2d15004SDag-Erling Smørgrav 135*b5663de9SDag-Erling Smørgrav #define AS_EVENT_BASE(x) ((struct event_base*)x) 136*b5663de9SDag-Erling Smørgrav #define AS_UB_EVENT_BASE(x) ((struct ub_event_base*)x) 137*b5663de9SDag-Erling Smørgrav #define AS_EVENT(x) ((struct event*)x) 138*b5663de9SDag-Erling Smørgrav #define AS_UB_EVENT(x) ((struct ub_event*)x) 139e2d15004SDag-Erling Smørgrav 140*b5663de9SDag-Erling Smørgrav const char* ub_event_get_version(void) 141e2d15004SDag-Erling Smørgrav { 142e2d15004SDag-Erling Smørgrav return event_get_version(); 143e2d15004SDag-Erling Smørgrav } 144e2d15004SDag-Erling Smørgrav 145e2d15004SDag-Erling Smørgrav #if (defined(HAVE_EV_LOOP) || defined(HAVE_EV_DEFAULT_LOOP)) && defined(EVBACKEND_SELECT) 146e2d15004SDag-Erling Smørgrav static const char* ub_ev_backend2str(int b) 147e2d15004SDag-Erling Smørgrav { 148e2d15004SDag-Erling Smørgrav switch(b) { 149e2d15004SDag-Erling Smørgrav case EVBACKEND_SELECT: return "select"; 150e2d15004SDag-Erling Smørgrav case EVBACKEND_POLL: return "poll"; 151e2d15004SDag-Erling Smørgrav case EVBACKEND_EPOLL: return "epoll"; 152e2d15004SDag-Erling Smørgrav case EVBACKEND_KQUEUE: return "kqueue"; 153e2d15004SDag-Erling Smørgrav case EVBACKEND_DEVPOLL: return "devpoll"; 154e2d15004SDag-Erling Smørgrav case EVBACKEND_PORT: return "evport"; 155e2d15004SDag-Erling Smørgrav } 156e2d15004SDag-Erling Smørgrav return "unknown"; 157e2d15004SDag-Erling Smørgrav } 158e2d15004SDag-Erling Smørgrav #endif 159e2d15004SDag-Erling Smørgrav 160e2d15004SDag-Erling Smørgrav void 161e2d15004SDag-Erling Smørgrav ub_get_event_sys(struct ub_event_base* base, const char** n, const char** s, 162e2d15004SDag-Erling Smørgrav const char** m) 163e2d15004SDag-Erling Smørgrav { 164e2d15004SDag-Erling Smørgrav #ifdef USE_WINSOCK 165e2d15004SDag-Erling Smørgrav (void)base; 166e2d15004SDag-Erling Smørgrav *n = "event"; 167e2d15004SDag-Erling Smørgrav *s = "winsock"; 168e2d15004SDag-Erling Smørgrav *m = "WSAWaitForMultipleEvents"; 169e2d15004SDag-Erling Smørgrav #elif defined(USE_MINI_EVENT) 170e2d15004SDag-Erling Smørgrav (void)base; 171e2d15004SDag-Erling Smørgrav *n = "mini-event"; 172e2d15004SDag-Erling Smørgrav *s = "internal"; 173e2d15004SDag-Erling Smørgrav *m = "select"; 174e2d15004SDag-Erling Smørgrav #else 175e2d15004SDag-Erling Smørgrav struct event_base* b = AS_EVENT_BASE(base); 176e2d15004SDag-Erling Smørgrav *s = event_get_version(); 177e2d15004SDag-Erling Smørgrav # if defined(HAVE_EV_LOOP) || defined(HAVE_EV_DEFAULT_LOOP) 178e2d15004SDag-Erling Smørgrav *n = "libev"; 179e2d15004SDag-Erling Smørgrav if (!b) 180e2d15004SDag-Erling Smørgrav b = (struct event_base*)ev_default_loop(EVFLAG_AUTO); 181e2d15004SDag-Erling Smørgrav # ifdef EVBACKEND_SELECT 182e2d15004SDag-Erling Smørgrav *m = ub_ev_backend2str(ev_backend((struct ev_loop*)b)); 183e2d15004SDag-Erling Smørgrav # else 184e2d15004SDag-Erling Smørgrav *m = "not obtainable"; 185e2d15004SDag-Erling Smørgrav # endif 186e2d15004SDag-Erling Smørgrav # elif defined(HAVE_EVENT_BASE_GET_METHOD) 187e2d15004SDag-Erling Smørgrav *n = "libevent"; 188e2d15004SDag-Erling Smørgrav if (!b) 189e2d15004SDag-Erling Smørgrav b = event_base_new(); 190e2d15004SDag-Erling Smørgrav *m = event_base_get_method(b); 191e2d15004SDag-Erling Smørgrav # else 192e2d15004SDag-Erling Smørgrav *n = "unknown"; 193e2d15004SDag-Erling Smørgrav *m = "not obtainable"; 194e2d15004SDag-Erling Smørgrav (void)b; 195e2d15004SDag-Erling Smørgrav # endif 196e2d15004SDag-Erling Smørgrav # ifdef HAVE_EVENT_BASE_FREE 197e2d15004SDag-Erling Smørgrav if (b && b != AS_EVENT_BASE(base)) 198e2d15004SDag-Erling Smørgrav event_base_free(b); 199e2d15004SDag-Erling Smørgrav # endif 200e2d15004SDag-Erling Smørgrav #endif 201e2d15004SDag-Erling Smørgrav } 202e2d15004SDag-Erling Smørgrav 203e2d15004SDag-Erling Smørgrav struct ub_event_base* 204e2d15004SDag-Erling Smørgrav ub_default_event_base(int sigs, time_t* time_secs, struct timeval* time_tv) 205e2d15004SDag-Erling Smørgrav { 206e2d15004SDag-Erling Smørgrav void* base; 207e2d15004SDag-Erling Smørgrav 208e2d15004SDag-Erling Smørgrav (void)base; 209e2d15004SDag-Erling Smørgrav #ifdef USE_MINI_EVENT 210e2d15004SDag-Erling Smørgrav (void)sigs; 211e2d15004SDag-Erling Smørgrav /* use mini event time-sharing feature */ 212e2d15004SDag-Erling Smørgrav base = event_init(time_secs, time_tv); 213e2d15004SDag-Erling Smørgrav #else 214e2d15004SDag-Erling Smørgrav (void)time_secs; 215e2d15004SDag-Erling Smørgrav (void)time_tv; 216e2d15004SDag-Erling Smørgrav # if defined(HAVE_EV_LOOP) || defined(HAVE_EV_DEFAULT_LOOP) 217e2d15004SDag-Erling Smørgrav /* libev */ 218e2d15004SDag-Erling Smørgrav if(sigs) 219e2d15004SDag-Erling Smørgrav base = ev_default_loop(EVFLAG_AUTO); 220e2d15004SDag-Erling Smørgrav else 221e2d15004SDag-Erling Smørgrav base = ev_loop_new(EVFLAG_AUTO); 222e2d15004SDag-Erling Smørgrav # else 223e2d15004SDag-Erling Smørgrav (void)sigs; 224e2d15004SDag-Erling Smørgrav # ifdef HAVE_EVENT_BASE_NEW 225e2d15004SDag-Erling Smørgrav base = event_base_new(); 226e2d15004SDag-Erling Smørgrav # else 227e2d15004SDag-Erling Smørgrav base = event_init(); 228e2d15004SDag-Erling Smørgrav # endif 229e2d15004SDag-Erling Smørgrav # endif 230e2d15004SDag-Erling Smørgrav #endif 231e2d15004SDag-Erling Smørgrav return (struct ub_event_base*)base; 232e2d15004SDag-Erling Smørgrav } 233e2d15004SDag-Erling Smørgrav 234e2d15004SDag-Erling Smørgrav struct ub_event_base * 235e2d15004SDag-Erling Smørgrav ub_libevent_event_base(struct event_base* libevent_base) 236e2d15004SDag-Erling Smørgrav { 237e2d15004SDag-Erling Smørgrav #ifdef USE_MINI_EVENT 238e2d15004SDag-Erling Smørgrav (void)libevent_base; 239e2d15004SDag-Erling Smørgrav return NULL; 240e2d15004SDag-Erling Smørgrav #else 241e2d15004SDag-Erling Smørgrav return AS_UB_EVENT_BASE(libevent_base); 242e2d15004SDag-Erling Smørgrav #endif 243e2d15004SDag-Erling Smørgrav } 244e2d15004SDag-Erling Smørgrav 245e2d15004SDag-Erling Smørgrav struct event_base * 246e2d15004SDag-Erling Smørgrav ub_libevent_get_event_base(struct ub_event_base* base) 247e2d15004SDag-Erling Smørgrav { 248e2d15004SDag-Erling Smørgrav #ifdef USE_MINI_EVENT 249e2d15004SDag-Erling Smørgrav (void)base; 250e2d15004SDag-Erling Smørgrav return NULL; 251e2d15004SDag-Erling Smørgrav #else 252e2d15004SDag-Erling Smørgrav return AS_EVENT_BASE(base); 253e2d15004SDag-Erling Smørgrav #endif 254e2d15004SDag-Erling Smørgrav } 255e2d15004SDag-Erling Smørgrav 256e2d15004SDag-Erling Smørgrav void 257e2d15004SDag-Erling Smørgrav ub_event_base_free(struct ub_event_base* base) 258e2d15004SDag-Erling Smørgrav { 259e2d15004SDag-Erling Smørgrav #ifdef USE_MINI_EVENT 260e2d15004SDag-Erling Smørgrav event_base_free(AS_EVENT_BASE(base)); 261e2d15004SDag-Erling Smørgrav #elif defined(HAVE_EVENT_BASE_FREE) && defined(HAVE_EVENT_BASE_ONCE) 262e2d15004SDag-Erling Smørgrav /* only libevent 1.2+ has it, but in 1.2 it is broken - 263e2d15004SDag-Erling Smørgrav assertion fails on signal handling ev that is not deleted 264e2d15004SDag-Erling Smørgrav in libevent 1.3c (event_base_once appears) this is fixed. */ 265e2d15004SDag-Erling Smørgrav event_base_free(AS_EVENT_BASE(base)); 266e2d15004SDag-Erling Smørgrav #else 267e2d15004SDag-Erling Smørgrav (void)base; 268e2d15004SDag-Erling Smørgrav #endif /* HAVE_EVENT_BASE_FREE and HAVE_EVENT_BASE_ONCE */ 269e2d15004SDag-Erling Smørgrav } 270e2d15004SDag-Erling Smørgrav 271e2d15004SDag-Erling Smørgrav int 272e2d15004SDag-Erling Smørgrav ub_event_base_dispatch(struct ub_event_base* base) 273e2d15004SDag-Erling Smørgrav { 274e2d15004SDag-Erling Smørgrav return event_base_dispatch(AS_EVENT_BASE(base)); 275e2d15004SDag-Erling Smørgrav } 276e2d15004SDag-Erling Smørgrav 277e2d15004SDag-Erling Smørgrav int 278e2d15004SDag-Erling Smørgrav ub_event_base_loopexit(struct ub_event_base* base) 279e2d15004SDag-Erling Smørgrav { 280e2d15004SDag-Erling Smørgrav return event_base_loopexit(AS_EVENT_BASE(base), NULL); 281e2d15004SDag-Erling Smørgrav } 282e2d15004SDag-Erling Smørgrav 283e2d15004SDag-Erling Smørgrav struct ub_event* 284e2d15004SDag-Erling Smørgrav ub_event_new(struct ub_event_base* base, int fd, short bits, 285e2d15004SDag-Erling Smørgrav void (*cb)(int, short, void*), void* arg) 286e2d15004SDag-Erling Smørgrav { 287e2d15004SDag-Erling Smørgrav struct event *ev = (struct event*)calloc(1, sizeof(struct event)); 288e2d15004SDag-Erling Smørgrav 289e2d15004SDag-Erling Smørgrav if (!ev) 290e2d15004SDag-Erling Smørgrav return NULL; 291e2d15004SDag-Erling Smørgrav 292e2d15004SDag-Erling Smørgrav event_set(ev, fd, NATIVE_BITS(bits), NATIVE_BITS_CB(cb), arg); 293e2d15004SDag-Erling Smørgrav if (event_base_set(AS_EVENT_BASE(base), ev) != 0) { 294e2d15004SDag-Erling Smørgrav free(ev); 295e2d15004SDag-Erling Smørgrav return NULL; 296e2d15004SDag-Erling Smørgrav } 297e2d15004SDag-Erling Smørgrav return AS_UB_EVENT(ev); 298e2d15004SDag-Erling Smørgrav } 299e2d15004SDag-Erling Smørgrav 300e2d15004SDag-Erling Smørgrav struct ub_event* 301e2d15004SDag-Erling Smørgrav ub_signal_new(struct ub_event_base* base, int fd, 302e2d15004SDag-Erling Smørgrav void (*cb)(int, short, void*), void* arg) 303e2d15004SDag-Erling Smørgrav { 304e2d15004SDag-Erling Smørgrav struct event *ev = (struct event*)calloc(1, sizeof(struct event)); 305e2d15004SDag-Erling Smørgrav 306e2d15004SDag-Erling Smørgrav if (!ev) 307e2d15004SDag-Erling Smørgrav return NULL; 308e2d15004SDag-Erling Smørgrav 309e2d15004SDag-Erling Smørgrav signal_set(ev, fd, NATIVE_BITS_CB(cb), arg); 310e2d15004SDag-Erling Smørgrav if (event_base_set(AS_EVENT_BASE(base), ev) != 0) { 311e2d15004SDag-Erling Smørgrav free(ev); 312e2d15004SDag-Erling Smørgrav return NULL; 313e2d15004SDag-Erling Smørgrav } 314e2d15004SDag-Erling Smørgrav return AS_UB_EVENT(ev); 315e2d15004SDag-Erling Smørgrav } 316e2d15004SDag-Erling Smørgrav 317e2d15004SDag-Erling Smørgrav struct ub_event* 318e2d15004SDag-Erling Smørgrav ub_winsock_register_wsaevent(struct ub_event_base* base, void* wsaevent, 319e2d15004SDag-Erling Smørgrav void (*cb)(int, short, void*), void* arg) 320e2d15004SDag-Erling Smørgrav { 321e2d15004SDag-Erling Smørgrav #if defined(USE_MINI_EVENT) && defined(USE_WINSOCK) 322e2d15004SDag-Erling Smørgrav struct event *ev = (struct event*)calloc(1, sizeof(struct event)); 323e2d15004SDag-Erling Smørgrav 324e2d15004SDag-Erling Smørgrav if (!ev) 325e2d15004SDag-Erling Smørgrav return NULL; 326e2d15004SDag-Erling Smørgrav 327e2d15004SDag-Erling Smørgrav if (winsock_register_wsaevent(AS_EVENT_BASE(base), ev, wsaevent, cb, 328e2d15004SDag-Erling Smørgrav arg)) 329e2d15004SDag-Erling Smørgrav return AS_UB_EVENT(ev); 330e2d15004SDag-Erling Smørgrav free(ev); 331e2d15004SDag-Erling Smørgrav return NULL; 332e2d15004SDag-Erling Smørgrav #else 333e2d15004SDag-Erling Smørgrav (void)base; 334e2d15004SDag-Erling Smørgrav (void)wsaevent; 335e2d15004SDag-Erling Smørgrav (void)cb; 336e2d15004SDag-Erling Smørgrav (void)arg; 337e2d15004SDag-Erling Smørgrav return NULL; 338e2d15004SDag-Erling Smørgrav #endif 339e2d15004SDag-Erling Smørgrav } 340e2d15004SDag-Erling Smørgrav 341e2d15004SDag-Erling Smørgrav void 342e2d15004SDag-Erling Smørgrav ub_event_add_bits(struct ub_event* ev, short bits) 343e2d15004SDag-Erling Smørgrav { 344e2d15004SDag-Erling Smørgrav AS_EVENT(ev)->ev_events |= NATIVE_BITS(bits); 345e2d15004SDag-Erling Smørgrav } 346e2d15004SDag-Erling Smørgrav 347e2d15004SDag-Erling Smørgrav void 348e2d15004SDag-Erling Smørgrav ub_event_del_bits(struct ub_event* ev, short bits) 349e2d15004SDag-Erling Smørgrav { 350e2d15004SDag-Erling Smørgrav AS_EVENT(ev)->ev_events &= ~NATIVE_BITS(bits); 351e2d15004SDag-Erling Smørgrav } 352e2d15004SDag-Erling Smørgrav 353e2d15004SDag-Erling Smørgrav void 354e2d15004SDag-Erling Smørgrav ub_event_set_fd(struct ub_event* ev, int fd) 355e2d15004SDag-Erling Smørgrav { 356e2d15004SDag-Erling Smørgrav AS_EVENT(ev)->ev_fd = fd; 357e2d15004SDag-Erling Smørgrav } 358e2d15004SDag-Erling Smørgrav 359e2d15004SDag-Erling Smørgrav void 360e2d15004SDag-Erling Smørgrav ub_event_free(struct ub_event* ev) 361e2d15004SDag-Erling Smørgrav { 362e2d15004SDag-Erling Smørgrav if (ev) 363e2d15004SDag-Erling Smørgrav free(AS_EVENT(ev)); 364e2d15004SDag-Erling Smørgrav } 365e2d15004SDag-Erling Smørgrav 366e2d15004SDag-Erling Smørgrav int 367e2d15004SDag-Erling Smørgrav ub_event_add(struct ub_event* ev, struct timeval* tv) 368e2d15004SDag-Erling Smørgrav { 369e2d15004SDag-Erling Smørgrav return event_add(AS_EVENT(ev), tv); 370e2d15004SDag-Erling Smørgrav } 371e2d15004SDag-Erling Smørgrav 372e2d15004SDag-Erling Smørgrav int 373e2d15004SDag-Erling Smørgrav ub_event_del(struct ub_event* ev) 374e2d15004SDag-Erling Smørgrav { 375e2d15004SDag-Erling Smørgrav return event_del(AS_EVENT(ev)); 376e2d15004SDag-Erling Smørgrav } 377e2d15004SDag-Erling Smørgrav 378e2d15004SDag-Erling Smørgrav int 379e2d15004SDag-Erling Smørgrav ub_timer_add(struct ub_event* ev, struct ub_event_base* base, 380e2d15004SDag-Erling Smørgrav void (*cb)(int, short, void*), void* arg, struct timeval* tv) 381e2d15004SDag-Erling Smørgrav { 382e2d15004SDag-Erling Smørgrav event_set(AS_EVENT(ev), -1, EV_TIMEOUT, NATIVE_BITS_CB(cb), arg); 383e2d15004SDag-Erling Smørgrav if (event_base_set(AS_EVENT_BASE(base), AS_EVENT(ev)) != 0) 384e2d15004SDag-Erling Smørgrav return -1; 385e2d15004SDag-Erling Smørgrav return evtimer_add(AS_EVENT(ev), tv); 386e2d15004SDag-Erling Smørgrav } 387e2d15004SDag-Erling Smørgrav 388e2d15004SDag-Erling Smørgrav int 389e2d15004SDag-Erling Smørgrav ub_timer_del(struct ub_event* ev) 390e2d15004SDag-Erling Smørgrav { 391e2d15004SDag-Erling Smørgrav return evtimer_del(AS_EVENT(ev)); 392e2d15004SDag-Erling Smørgrav } 393e2d15004SDag-Erling Smørgrav 394e2d15004SDag-Erling Smørgrav int 395e2d15004SDag-Erling Smørgrav ub_signal_add(struct ub_event* ev, struct timeval* tv) 396e2d15004SDag-Erling Smørgrav { 397e2d15004SDag-Erling Smørgrav return signal_add(AS_EVENT(ev), tv); 398e2d15004SDag-Erling Smørgrav } 399e2d15004SDag-Erling Smørgrav 400e2d15004SDag-Erling Smørgrav int 401e2d15004SDag-Erling Smørgrav ub_signal_del(struct ub_event* ev) 402e2d15004SDag-Erling Smørgrav { 403e2d15004SDag-Erling Smørgrav return signal_del(AS_EVENT(ev)); 404e2d15004SDag-Erling Smørgrav } 405e2d15004SDag-Erling Smørgrav 406e2d15004SDag-Erling Smørgrav void 407e2d15004SDag-Erling Smørgrav ub_winsock_unregister_wsaevent(struct ub_event* ev) 408e2d15004SDag-Erling Smørgrav { 409e2d15004SDag-Erling Smørgrav #if defined(USE_MINI_EVENT) && defined(USE_WINSOCK) 410e2d15004SDag-Erling Smørgrav winsock_unregister_wsaevent(AS_EVENT(ev)); 411e2d15004SDag-Erling Smørgrav free(AS_EVENT(ev)); 412e2d15004SDag-Erling Smørgrav #else 413e2d15004SDag-Erling Smørgrav (void)ev; 414e2d15004SDag-Erling Smørgrav #endif 415e2d15004SDag-Erling Smørgrav } 416e2d15004SDag-Erling Smørgrav 417e2d15004SDag-Erling Smørgrav void 418e2d15004SDag-Erling Smørgrav ub_winsock_tcp_wouldblock(struct ub_event* ev, int eventbits) 419e2d15004SDag-Erling Smørgrav { 420e2d15004SDag-Erling Smørgrav #if defined(USE_MINI_EVENT) && defined(USE_WINSOCK) 421e2d15004SDag-Erling Smørgrav winsock_tcp_wouldblock(AS_EVENT(ev), NATIVE_BITS(eventbits)); 422e2d15004SDag-Erling Smørgrav #else 423e2d15004SDag-Erling Smørgrav (void)ev; 424e2d15004SDag-Erling Smørgrav (void)eventbits; 425e2d15004SDag-Erling Smørgrav #endif 426e2d15004SDag-Erling Smørgrav } 427e2d15004SDag-Erling Smørgrav 428e2d15004SDag-Erling Smørgrav void ub_comm_base_now(struct comm_base* cb) 429e2d15004SDag-Erling Smørgrav { 430e2d15004SDag-Erling Smørgrav #ifdef USE_MINI_EVENT 431e2d15004SDag-Erling Smørgrav /** minievent updates the time when it blocks. */ 432e2d15004SDag-Erling Smørgrav (void)cb; /* nothing to do */ 433e2d15004SDag-Erling Smørgrav #else /* !USE_MINI_EVENT */ 434e2d15004SDag-Erling Smørgrav /** fillup the time values in the event base */ 435e2d15004SDag-Erling Smørgrav time_t *tt; 436e2d15004SDag-Erling Smørgrav struct timeval *tv; 437e2d15004SDag-Erling Smørgrav comm_base_timept(cb, &tt, &tv); 438e2d15004SDag-Erling Smørgrav if(gettimeofday(tv, NULL) < 0) { 439e2d15004SDag-Erling Smørgrav log_err("gettimeofday: %s", strerror(errno)); 440e2d15004SDag-Erling Smørgrav } 441e2d15004SDag-Erling Smørgrav *tt = tv->tv_sec; 442e2d15004SDag-Erling Smørgrav #endif /* USE_MINI_EVENT */ 443e2d15004SDag-Erling Smørgrav } 444e2d15004SDag-Erling Smørgrav 445