1*b7579f77SDag-Erling Smørgrav /* 2*b7579f77SDag-Erling Smørgrav * util/netevent.h - event notification 3*b7579f77SDag-Erling Smørgrav * 4*b7579f77SDag-Erling Smørgrav * Copyright (c) 2007, NLnet Labs. All rights reserved. 5*b7579f77SDag-Erling Smørgrav * 6*b7579f77SDag-Erling Smørgrav * This software is open source. 7*b7579f77SDag-Erling Smørgrav * 8*b7579f77SDag-Erling Smørgrav * Redistribution and use in source and binary forms, with or without 9*b7579f77SDag-Erling Smørgrav * modification, are permitted provided that the following conditions 10*b7579f77SDag-Erling Smørgrav * are met: 11*b7579f77SDag-Erling Smørgrav * 12*b7579f77SDag-Erling Smørgrav * Redistributions of source code must retain the above copyright notice, 13*b7579f77SDag-Erling Smørgrav * this list of conditions and the following disclaimer. 14*b7579f77SDag-Erling Smørgrav * 15*b7579f77SDag-Erling Smørgrav * Redistributions in binary form must reproduce the above copyright notice, 16*b7579f77SDag-Erling Smørgrav * this list of conditions and the following disclaimer in the documentation 17*b7579f77SDag-Erling Smørgrav * and/or other materials provided with the distribution. 18*b7579f77SDag-Erling Smørgrav * 19*b7579f77SDag-Erling Smørgrav * Neither the name of the NLNET LABS nor the names of its contributors may 20*b7579f77SDag-Erling Smørgrav * be used to endorse or promote products derived from this software without 21*b7579f77SDag-Erling Smørgrav * specific prior written permission. 22*b7579f77SDag-Erling Smørgrav * 23*b7579f77SDag-Erling Smørgrav * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 24*b7579f77SDag-Erling Smørgrav * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 25*b7579f77SDag-Erling Smørgrav * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 26*b7579f77SDag-Erling Smørgrav * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE 27*b7579f77SDag-Erling Smørgrav * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 28*b7579f77SDag-Erling Smørgrav * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 29*b7579f77SDag-Erling Smørgrav * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 30*b7579f77SDag-Erling Smørgrav * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 31*b7579f77SDag-Erling Smørgrav * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 32*b7579f77SDag-Erling Smørgrav * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 33*b7579f77SDag-Erling Smørgrav * POSSIBILITY OF SUCH DAMAGE. 34*b7579f77SDag-Erling Smørgrav */ 35*b7579f77SDag-Erling Smørgrav 36*b7579f77SDag-Erling Smørgrav /** 37*b7579f77SDag-Erling Smørgrav * \file 38*b7579f77SDag-Erling Smørgrav * 39*b7579f77SDag-Erling Smørgrav * This file contains event notification functions. 40*b7579f77SDag-Erling Smørgrav * 41*b7579f77SDag-Erling Smørgrav * There are three types of communication points 42*b7579f77SDag-Erling Smørgrav * o UDP socket - perthread buffer. 43*b7579f77SDag-Erling Smørgrav * o TCP-accept socket - array of TCP-sockets, socketcount. 44*b7579f77SDag-Erling Smørgrav * o TCP socket - own buffer, parent-TCPaccept, read/write state, 45*b7579f77SDag-Erling Smørgrav * number of bytes read/written, timeout. 46*b7579f77SDag-Erling Smørgrav * 47*b7579f77SDag-Erling Smørgrav * There are sockets aimed towards our clients and towards the internet. 48*b7579f77SDag-Erling Smørgrav * o frontside - aimed towards our clients, queries come in, answers back. 49*b7579f77SDag-Erling Smørgrav * o behind - aimed towards internet, to the authoritative DNS servers. 50*b7579f77SDag-Erling Smørgrav * 51*b7579f77SDag-Erling Smørgrav * Several event types are available: 52*b7579f77SDag-Erling Smørgrav * o comm_base - for thread safety of the comm points, one per thread. 53*b7579f77SDag-Erling Smørgrav * o comm_point - udp and tcp networking, with callbacks. 54*b7579f77SDag-Erling Smørgrav * o comm_timer - a timeout with callback. 55*b7579f77SDag-Erling Smørgrav * o comm_signal - callbacks when signal is caught. 56*b7579f77SDag-Erling Smørgrav * o comm_reply - holds reply info during networking callback. 57*b7579f77SDag-Erling Smørgrav * 58*b7579f77SDag-Erling Smørgrav */ 59*b7579f77SDag-Erling Smørgrav 60*b7579f77SDag-Erling Smørgrav #ifndef NET_EVENT_H 61*b7579f77SDag-Erling Smørgrav #define NET_EVENT_H 62*b7579f77SDag-Erling Smørgrav 63*b7579f77SDag-Erling Smørgrav #include <ldns/buffer.h> 64*b7579f77SDag-Erling Smørgrav struct comm_point; 65*b7579f77SDag-Erling Smørgrav struct comm_reply; 66*b7579f77SDag-Erling Smørgrav struct event_base; 67*b7579f77SDag-Erling Smørgrav 68*b7579f77SDag-Erling Smørgrav /* internal event notification data storage structure. */ 69*b7579f77SDag-Erling Smørgrav struct internal_event; 70*b7579f77SDag-Erling Smørgrav struct internal_base; 71*b7579f77SDag-Erling Smørgrav struct internal_timer; 72*b7579f77SDag-Erling Smørgrav 73*b7579f77SDag-Erling Smørgrav /** callback from communication point function type */ 74*b7579f77SDag-Erling Smørgrav typedef int comm_point_callback_t(struct comm_point*, void*, int, 75*b7579f77SDag-Erling Smørgrav struct comm_reply*); 76*b7579f77SDag-Erling Smørgrav 77*b7579f77SDag-Erling Smørgrav /** to pass no_error to callback function */ 78*b7579f77SDag-Erling Smørgrav #define NETEVENT_NOERROR 0 79*b7579f77SDag-Erling Smørgrav /** to pass closed connection to callback function */ 80*b7579f77SDag-Erling Smørgrav #define NETEVENT_CLOSED -1 81*b7579f77SDag-Erling Smørgrav /** to pass timeout happened to callback function */ 82*b7579f77SDag-Erling Smørgrav #define NETEVENT_TIMEOUT -2 83*b7579f77SDag-Erling Smørgrav /** to pass fallback from capsforID to callback function; 0x20 failed */ 84*b7579f77SDag-Erling Smørgrav #define NETEVENT_CAPSFAIL -3 85*b7579f77SDag-Erling Smørgrav 86*b7579f77SDag-Erling Smørgrav /** timeout to slow accept calls when not possible, in msec. */ 87*b7579f77SDag-Erling Smørgrav #define NETEVENT_SLOW_ACCEPT_TIME 2000 88*b7579f77SDag-Erling Smørgrav 89*b7579f77SDag-Erling Smørgrav /** 90*b7579f77SDag-Erling Smørgrav * A communication point dispatcher. Thread specific. 91*b7579f77SDag-Erling Smørgrav */ 92*b7579f77SDag-Erling Smørgrav struct comm_base { 93*b7579f77SDag-Erling Smørgrav /** behind the scenes structure. with say libevent info. alloced */ 94*b7579f77SDag-Erling Smørgrav struct internal_base* eb; 95*b7579f77SDag-Erling Smørgrav /** callback to stop listening on accept sockets, 96*b7579f77SDag-Erling Smørgrav * performed when accept() will not function properly */ 97*b7579f77SDag-Erling Smørgrav void (*stop_accept)(void*); 98*b7579f77SDag-Erling Smørgrav /** callback to start listening on accept sockets, performed 99*b7579f77SDag-Erling Smørgrav * after stop_accept() then a timeout has passed. */ 100*b7579f77SDag-Erling Smørgrav void (*start_accept)(void*); 101*b7579f77SDag-Erling Smørgrav /** user argument for stop_accept and start_accept functions */ 102*b7579f77SDag-Erling Smørgrav void* cb_arg; 103*b7579f77SDag-Erling Smørgrav }; 104*b7579f77SDag-Erling Smørgrav 105*b7579f77SDag-Erling Smørgrav /** 106*b7579f77SDag-Erling Smørgrav * Reply information for a communication point. 107*b7579f77SDag-Erling Smørgrav */ 108*b7579f77SDag-Erling Smørgrav struct comm_reply { 109*b7579f77SDag-Erling Smørgrav /** the comm_point with fd to send reply on to. */ 110*b7579f77SDag-Erling Smørgrav struct comm_point* c; 111*b7579f77SDag-Erling Smørgrav /** the address (for UDP based communication) */ 112*b7579f77SDag-Erling Smørgrav struct sockaddr_storage addr; 113*b7579f77SDag-Erling Smørgrav /** length of address */ 114*b7579f77SDag-Erling Smørgrav socklen_t addrlen; 115*b7579f77SDag-Erling Smørgrav /** return type 0 (none), 4(IP4), 6(IP6) */ 116*b7579f77SDag-Erling Smørgrav int srctype; 117*b7579f77SDag-Erling Smørgrav /** the return source interface data */ 118*b7579f77SDag-Erling Smørgrav union { 119*b7579f77SDag-Erling Smørgrav #ifdef IPV6_PKTINFO 120*b7579f77SDag-Erling Smørgrav struct in6_pktinfo v6info; 121*b7579f77SDag-Erling Smørgrav #endif 122*b7579f77SDag-Erling Smørgrav #ifdef IP_PKTINFO 123*b7579f77SDag-Erling Smørgrav struct in_pktinfo v4info; 124*b7579f77SDag-Erling Smørgrav #elif defined(IP_RECVDSTADDR) 125*b7579f77SDag-Erling Smørgrav struct in_addr v4addr; 126*b7579f77SDag-Erling Smørgrav #endif 127*b7579f77SDag-Erling Smørgrav } 128*b7579f77SDag-Erling Smørgrav /** variable with return source data */ 129*b7579f77SDag-Erling Smørgrav pktinfo; 130*b7579f77SDag-Erling Smørgrav }; 131*b7579f77SDag-Erling Smørgrav 132*b7579f77SDag-Erling Smørgrav /** 133*b7579f77SDag-Erling Smørgrav * Communication point to the network 134*b7579f77SDag-Erling Smørgrav * These behaviours can be accomplished by setting the flags 135*b7579f77SDag-Erling Smørgrav * and passing return values from the callback. 136*b7579f77SDag-Erling Smørgrav * udp frontside: called after readdone. sendafter. 137*b7579f77SDag-Erling Smørgrav * tcp frontside: called readdone, sendafter. close. 138*b7579f77SDag-Erling Smørgrav * udp behind: called after readdone. No send after. 139*b7579f77SDag-Erling Smørgrav * tcp behind: write done, read done, then called. No send after. 140*b7579f77SDag-Erling Smørgrav */ 141*b7579f77SDag-Erling Smørgrav struct comm_point { 142*b7579f77SDag-Erling Smørgrav /** behind the scenes structure, with say libevent info. alloced. */ 143*b7579f77SDag-Erling Smørgrav struct internal_event* ev; 144*b7579f77SDag-Erling Smørgrav 145*b7579f77SDag-Erling Smørgrav /** file descriptor for communication point */ 146*b7579f77SDag-Erling Smørgrav int fd; 147*b7579f77SDag-Erling Smørgrav 148*b7579f77SDag-Erling Smørgrav /** timeout (NULL if it does not). Malloced. */ 149*b7579f77SDag-Erling Smørgrav struct timeval* timeout; 150*b7579f77SDag-Erling Smørgrav 151*b7579f77SDag-Erling Smørgrav /** buffer pointer. Either to perthread, or own buffer or NULL */ 152*b7579f77SDag-Erling Smørgrav ldns_buffer* buffer; 153*b7579f77SDag-Erling Smørgrav 154*b7579f77SDag-Erling Smørgrav /* -------- TCP Handler -------- */ 155*b7579f77SDag-Erling Smørgrav /** Read/Write state for TCP */ 156*b7579f77SDag-Erling Smørgrav int tcp_is_reading; 157*b7579f77SDag-Erling Smørgrav /** The current read/write count for TCP */ 158*b7579f77SDag-Erling Smørgrav size_t tcp_byte_count; 159*b7579f77SDag-Erling Smørgrav /** parent communication point (for TCP sockets) */ 160*b7579f77SDag-Erling Smørgrav struct comm_point* tcp_parent; 161*b7579f77SDag-Erling Smørgrav /** sockaddr from peer, for TCP handlers */ 162*b7579f77SDag-Erling Smørgrav struct comm_reply repinfo; 163*b7579f77SDag-Erling Smørgrav 164*b7579f77SDag-Erling Smørgrav /* -------- TCP Accept -------- */ 165*b7579f77SDag-Erling Smørgrav /** the number of TCP handlers for this tcp-accept socket */ 166*b7579f77SDag-Erling Smørgrav int max_tcp_count; 167*b7579f77SDag-Erling Smørgrav /** malloced array of tcp handlers for a tcp-accept, 168*b7579f77SDag-Erling Smørgrav of size max_tcp_count. */ 169*b7579f77SDag-Erling Smørgrav struct comm_point** tcp_handlers; 170*b7579f77SDag-Erling Smørgrav /** linked list of free tcp_handlers to use for new queries. 171*b7579f77SDag-Erling Smørgrav For tcp_accept the first entry, for tcp_handlers the next one. */ 172*b7579f77SDag-Erling Smørgrav struct comm_point* tcp_free; 173*b7579f77SDag-Erling Smørgrav 174*b7579f77SDag-Erling Smørgrav /* -------- SSL TCP DNS ------- */ 175*b7579f77SDag-Erling Smørgrav /** the SSL object with rw bio (owned) or for commaccept ctx ref */ 176*b7579f77SDag-Erling Smørgrav void* ssl; 177*b7579f77SDag-Erling Smørgrav /** handshake state for init and renegotiate */ 178*b7579f77SDag-Erling Smørgrav enum { 179*b7579f77SDag-Erling Smørgrav /** no handshake, it has been done */ 180*b7579f77SDag-Erling Smørgrav comm_ssl_shake_none = 0, 181*b7579f77SDag-Erling Smørgrav /** ssl initial handshake wants to read */ 182*b7579f77SDag-Erling Smørgrav comm_ssl_shake_read, 183*b7579f77SDag-Erling Smørgrav /** ssl initial handshake wants to write */ 184*b7579f77SDag-Erling Smørgrav comm_ssl_shake_write, 185*b7579f77SDag-Erling Smørgrav /** ssl_write wants to read */ 186*b7579f77SDag-Erling Smørgrav comm_ssl_shake_hs_read, 187*b7579f77SDag-Erling Smørgrav /** ssl_read wants to write */ 188*b7579f77SDag-Erling Smørgrav comm_ssl_shake_hs_write 189*b7579f77SDag-Erling Smørgrav } ssl_shake_state; 190*b7579f77SDag-Erling Smørgrav 191*b7579f77SDag-Erling Smørgrav /** is this a UDP, TCP-accept or TCP socket. */ 192*b7579f77SDag-Erling Smørgrav enum comm_point_type { 193*b7579f77SDag-Erling Smørgrav /** UDP socket - handle datagrams. */ 194*b7579f77SDag-Erling Smørgrav comm_udp, 195*b7579f77SDag-Erling Smørgrav /** TCP accept socket - only creates handlers if readable. */ 196*b7579f77SDag-Erling Smørgrav comm_tcp_accept, 197*b7579f77SDag-Erling Smørgrav /** TCP handler socket - handle byteperbyte readwrite. */ 198*b7579f77SDag-Erling Smørgrav comm_tcp, 199*b7579f77SDag-Erling Smørgrav /** AF_UNIX socket - for internal commands. */ 200*b7579f77SDag-Erling Smørgrav comm_local, 201*b7579f77SDag-Erling Smørgrav /** raw - not DNS format - for pipe readers and writers */ 202*b7579f77SDag-Erling Smørgrav comm_raw 203*b7579f77SDag-Erling Smørgrav } 204*b7579f77SDag-Erling Smørgrav /** variable with type of socket, UDP,TCP-accept,TCP,pipe */ 205*b7579f77SDag-Erling Smørgrav type; 206*b7579f77SDag-Erling Smørgrav 207*b7579f77SDag-Erling Smørgrav /* ---------- Behaviour ----------- */ 208*b7579f77SDag-Erling Smørgrav /** if set the connection is NOT closed on delete. */ 209*b7579f77SDag-Erling Smørgrav int do_not_close; 210*b7579f77SDag-Erling Smørgrav 211*b7579f77SDag-Erling Smørgrav /** if set, the connection is closed on error, on timeout, 212*b7579f77SDag-Erling Smørgrav and after read/write completes. No callback is done. */ 213*b7579f77SDag-Erling Smørgrav int tcp_do_close; 214*b7579f77SDag-Erling Smørgrav 215*b7579f77SDag-Erling Smørgrav /** if set, read/write completes: 216*b7579f77SDag-Erling Smørgrav read/write state of tcp is toggled. 217*b7579f77SDag-Erling Smørgrav buffer reset/bytecount reset. 218*b7579f77SDag-Erling Smørgrav this flag cleared. 219*b7579f77SDag-Erling Smørgrav So that when that is done the callback is called. */ 220*b7579f77SDag-Erling Smørgrav int tcp_do_toggle_rw; 221*b7579f77SDag-Erling Smørgrav 222*b7579f77SDag-Erling Smørgrav /** if set, checks for pending error from nonblocking connect() call.*/ 223*b7579f77SDag-Erling Smørgrav int tcp_check_nb_connect; 224*b7579f77SDag-Erling Smørgrav 225*b7579f77SDag-Erling Smørgrav /** number of queries outstanding on this socket, used by 226*b7579f77SDag-Erling Smørgrav * outside network for udp ports */ 227*b7579f77SDag-Erling Smørgrav int inuse; 228*b7579f77SDag-Erling Smørgrav 229*b7579f77SDag-Erling Smørgrav /** callback when done. 230*b7579f77SDag-Erling Smørgrav tcp_accept does not get called back, is NULL then. 231*b7579f77SDag-Erling Smørgrav If a timeout happens, callback with timeout=1 is called. 232*b7579f77SDag-Erling Smørgrav If an error happens, callback is called with error set 233*b7579f77SDag-Erling Smørgrav nonzero. If not NETEVENT_NOERROR, it is an errno value. 234*b7579f77SDag-Erling Smørgrav If the connection is closed (by remote end) then the 235*b7579f77SDag-Erling Smørgrav callback is called with error set to NETEVENT_CLOSED=-1. 236*b7579f77SDag-Erling Smørgrav If a timeout happens on the connection, the error is set to 237*b7579f77SDag-Erling Smørgrav NETEVENT_TIMEOUT=-2. 238*b7579f77SDag-Erling Smørgrav The reply_info can be copied if the reply needs to happen at a 239*b7579f77SDag-Erling Smørgrav later time. It consists of a struct with commpoint and address. 240*b7579f77SDag-Erling Smørgrav It can be passed to a msg send routine some time later. 241*b7579f77SDag-Erling Smørgrav Note the reply information is temporary and must be copied. 242*b7579f77SDag-Erling Smørgrav NULL is passed for_reply info, in cases where error happened. 243*b7579f77SDag-Erling Smørgrav 244*b7579f77SDag-Erling Smørgrav declare as: 245*b7579f77SDag-Erling Smørgrav int my_callback(struct comm_point* c, void* my_arg, int error, 246*b7579f77SDag-Erling Smørgrav struct comm_reply *reply_info); 247*b7579f77SDag-Erling Smørgrav 248*b7579f77SDag-Erling Smørgrav if the routine returns 0, nothing is done. 249*b7579f77SDag-Erling Smørgrav Notzero, the buffer will be sent back to client. 250*b7579f77SDag-Erling Smørgrav For UDP this is done without changing the commpoint. 251*b7579f77SDag-Erling Smørgrav In TCP it sets write state. 252*b7579f77SDag-Erling Smørgrav */ 253*b7579f77SDag-Erling Smørgrav comm_point_callback_t* callback; 254*b7579f77SDag-Erling Smørgrav /** argument to pass to callback. */ 255*b7579f77SDag-Erling Smørgrav void *cb_arg; 256*b7579f77SDag-Erling Smørgrav }; 257*b7579f77SDag-Erling Smørgrav 258*b7579f77SDag-Erling Smørgrav /** 259*b7579f77SDag-Erling Smørgrav * Structure only for making timeout events. 260*b7579f77SDag-Erling Smørgrav */ 261*b7579f77SDag-Erling Smørgrav struct comm_timer { 262*b7579f77SDag-Erling Smørgrav /** the internal event stuff */ 263*b7579f77SDag-Erling Smørgrav struct internal_timer* ev_timer; 264*b7579f77SDag-Erling Smørgrav 265*b7579f77SDag-Erling Smørgrav /** callback function, takes user arg only */ 266*b7579f77SDag-Erling Smørgrav void (*callback)(void*); 267*b7579f77SDag-Erling Smørgrav 268*b7579f77SDag-Erling Smørgrav /** callback user argument */ 269*b7579f77SDag-Erling Smørgrav void* cb_arg; 270*b7579f77SDag-Erling Smørgrav }; 271*b7579f77SDag-Erling Smørgrav 272*b7579f77SDag-Erling Smørgrav /** 273*b7579f77SDag-Erling Smørgrav * Structure only for signal events. 274*b7579f77SDag-Erling Smørgrav */ 275*b7579f77SDag-Erling Smørgrav struct comm_signal { 276*b7579f77SDag-Erling Smørgrav /** the communication base */ 277*b7579f77SDag-Erling Smørgrav struct comm_base* base; 278*b7579f77SDag-Erling Smørgrav 279*b7579f77SDag-Erling Smørgrav /** the internal event stuff */ 280*b7579f77SDag-Erling Smørgrav struct internal_signal* ev_signal; 281*b7579f77SDag-Erling Smørgrav 282*b7579f77SDag-Erling Smørgrav /** callback function, takes signal number and user arg */ 283*b7579f77SDag-Erling Smørgrav void (*callback)(int, void*); 284*b7579f77SDag-Erling Smørgrav 285*b7579f77SDag-Erling Smørgrav /** callback user argument */ 286*b7579f77SDag-Erling Smørgrav void* cb_arg; 287*b7579f77SDag-Erling Smørgrav }; 288*b7579f77SDag-Erling Smørgrav 289*b7579f77SDag-Erling Smørgrav /** 290*b7579f77SDag-Erling Smørgrav * Create a new comm base. 291*b7579f77SDag-Erling Smørgrav * @param sigs: if true it attempts to create a default loop for 292*b7579f77SDag-Erling Smørgrav * signal handling. 293*b7579f77SDag-Erling Smørgrav * @return: the new comm base. NULL on error. 294*b7579f77SDag-Erling Smørgrav */ 295*b7579f77SDag-Erling Smørgrav struct comm_base* comm_base_create(int sigs); 296*b7579f77SDag-Erling Smørgrav 297*b7579f77SDag-Erling Smørgrav /** 298*b7579f77SDag-Erling Smørgrav * Destroy a comm base. 299*b7579f77SDag-Erling Smørgrav * All comm points must have been deleted. 300*b7579f77SDag-Erling Smørgrav * @param b: the base to delete. 301*b7579f77SDag-Erling Smørgrav */ 302*b7579f77SDag-Erling Smørgrav void comm_base_delete(struct comm_base* b); 303*b7579f77SDag-Erling Smørgrav 304*b7579f77SDag-Erling Smørgrav /** 305*b7579f77SDag-Erling Smørgrav * Obtain two pointers. The pointers never change (until base_delete()). 306*b7579f77SDag-Erling Smørgrav * The pointers point to time values that are updated regularly. 307*b7579f77SDag-Erling Smørgrav * @param b: the communication base that will update the time values. 308*b7579f77SDag-Erling Smørgrav * @param tt: pointer to time in seconds is returned. 309*b7579f77SDag-Erling Smørgrav * @param tv: pointer to time in microseconds is returned. 310*b7579f77SDag-Erling Smørgrav */ 311*b7579f77SDag-Erling Smørgrav void comm_base_timept(struct comm_base* b, uint32_t** tt, struct timeval** tv); 312*b7579f77SDag-Erling Smørgrav 313*b7579f77SDag-Erling Smørgrav /** 314*b7579f77SDag-Erling Smørgrav * Dispatch the comm base events. 315*b7579f77SDag-Erling Smørgrav * @param b: the communication to perform. 316*b7579f77SDag-Erling Smørgrav */ 317*b7579f77SDag-Erling Smørgrav void comm_base_dispatch(struct comm_base* b); 318*b7579f77SDag-Erling Smørgrav 319*b7579f77SDag-Erling Smørgrav /** 320*b7579f77SDag-Erling Smørgrav * Exit from dispatch loop. 321*b7579f77SDag-Erling Smørgrav * @param b: the communication base that is in dispatch(). 322*b7579f77SDag-Erling Smørgrav */ 323*b7579f77SDag-Erling Smørgrav void comm_base_exit(struct comm_base* b); 324*b7579f77SDag-Erling Smørgrav 325*b7579f77SDag-Erling Smørgrav /** 326*b7579f77SDag-Erling Smørgrav * Set the slow_accept mode handlers. You can not provide these if you do 327*b7579f77SDag-Erling Smørgrav * not perform accept() calls. 328*b7579f77SDag-Erling Smørgrav * @param b: comm base 329*b7579f77SDag-Erling Smørgrav * @param stop_accept: function that stops listening to accept fds. 330*b7579f77SDag-Erling Smørgrav * @param start_accept: function that resumes listening to accept fds. 331*b7579f77SDag-Erling Smørgrav * @param arg: callback arg to pass to the functions. 332*b7579f77SDag-Erling Smørgrav */ 333*b7579f77SDag-Erling Smørgrav void comm_base_set_slow_accept_handlers(struct comm_base* b, 334*b7579f77SDag-Erling Smørgrav void (*stop_accept)(void*), void (*start_accept)(void*), void* arg); 335*b7579f77SDag-Erling Smørgrav 336*b7579f77SDag-Erling Smørgrav /** 337*b7579f77SDag-Erling Smørgrav * Access internal data structure (for util/tube.c on windows) 338*b7579f77SDag-Erling Smørgrav * @param b: comm base 339*b7579f77SDag-Erling Smørgrav * @return event_base. Could be libevent, or internal event handler. 340*b7579f77SDag-Erling Smørgrav */ 341*b7579f77SDag-Erling Smørgrav struct event_base* comm_base_internal(struct comm_base* b); 342*b7579f77SDag-Erling Smørgrav 343*b7579f77SDag-Erling Smørgrav /** 344*b7579f77SDag-Erling Smørgrav * Create an UDP comm point. Calls malloc. 345*b7579f77SDag-Erling Smørgrav * setups the structure with the parameters you provide. 346*b7579f77SDag-Erling Smørgrav * @param base: in which base to alloc the commpoint. 347*b7579f77SDag-Erling Smørgrav * @param fd : file descriptor of open UDP socket. 348*b7579f77SDag-Erling Smørgrav * @param buffer: shared buffer by UDP sockets from this thread. 349*b7579f77SDag-Erling Smørgrav * @param callback: callback function pointer. 350*b7579f77SDag-Erling Smørgrav * @param callback_arg: will be passed to your callback function. 351*b7579f77SDag-Erling Smørgrav * @return: returns the allocated communication point. NULL on error. 352*b7579f77SDag-Erling Smørgrav * Sets timeout to NULL. Turns off TCP options. 353*b7579f77SDag-Erling Smørgrav */ 354*b7579f77SDag-Erling Smørgrav struct comm_point* comm_point_create_udp(struct comm_base* base, 355*b7579f77SDag-Erling Smørgrav int fd, ldns_buffer* buffer, 356*b7579f77SDag-Erling Smørgrav comm_point_callback_t* callback, void* callback_arg); 357*b7579f77SDag-Erling Smørgrav 358*b7579f77SDag-Erling Smørgrav /** 359*b7579f77SDag-Erling Smørgrav * Create an UDP with ancillary data comm point. Calls malloc. 360*b7579f77SDag-Erling Smørgrav * Uses recvmsg instead of recv to get udp message. 361*b7579f77SDag-Erling Smørgrav * setups the structure with the parameters you provide. 362*b7579f77SDag-Erling Smørgrav * @param base: in which base to alloc the commpoint. 363*b7579f77SDag-Erling Smørgrav * @param fd : file descriptor of open UDP socket. 364*b7579f77SDag-Erling Smørgrav * @param buffer: shared buffer by UDP sockets from this thread. 365*b7579f77SDag-Erling Smørgrav * @param callback: callback function pointer. 366*b7579f77SDag-Erling Smørgrav * @param callback_arg: will be passed to your callback function. 367*b7579f77SDag-Erling Smørgrav * @return: returns the allocated communication point. NULL on error. 368*b7579f77SDag-Erling Smørgrav * Sets timeout to NULL. Turns off TCP options. 369*b7579f77SDag-Erling Smørgrav */ 370*b7579f77SDag-Erling Smørgrav struct comm_point* comm_point_create_udp_ancil(struct comm_base* base, 371*b7579f77SDag-Erling Smørgrav int fd, ldns_buffer* buffer, 372*b7579f77SDag-Erling Smørgrav comm_point_callback_t* callback, void* callback_arg); 373*b7579f77SDag-Erling Smørgrav 374*b7579f77SDag-Erling Smørgrav /** 375*b7579f77SDag-Erling Smørgrav * Create a TCP listener comm point. Calls malloc. 376*b7579f77SDag-Erling Smørgrav * Setups the structure with the parameters you provide. 377*b7579f77SDag-Erling Smørgrav * Also Creates TCP Handlers, pre allocated for you. 378*b7579f77SDag-Erling Smørgrav * Uses the parameters you provide. 379*b7579f77SDag-Erling Smørgrav * @param base: in which base to alloc the commpoint. 380*b7579f77SDag-Erling Smørgrav * @param fd: file descriptor of open TCP socket set to listen nonblocking. 381*b7579f77SDag-Erling Smørgrav * @param num: becomes max_tcp_count, the routine allocates that 382*b7579f77SDag-Erling Smørgrav * many tcp handler commpoints. 383*b7579f77SDag-Erling Smørgrav * @param bufsize: size of buffer to create for handlers. 384*b7579f77SDag-Erling Smørgrav * @param callback: callback function pointer for TCP handlers. 385*b7579f77SDag-Erling Smørgrav * @param callback_arg: will be passed to your callback function. 386*b7579f77SDag-Erling Smørgrav * @return: returns the TCP listener commpoint. You can find the 387*b7579f77SDag-Erling Smørgrav * TCP handlers in the array inside the listener commpoint. 388*b7579f77SDag-Erling Smørgrav * returns NULL on error. 389*b7579f77SDag-Erling Smørgrav * Inits timeout to NULL. All handlers are on the free list. 390*b7579f77SDag-Erling Smørgrav */ 391*b7579f77SDag-Erling Smørgrav struct comm_point* comm_point_create_tcp(struct comm_base* base, 392*b7579f77SDag-Erling Smørgrav int fd, int num, size_t bufsize, 393*b7579f77SDag-Erling Smørgrav comm_point_callback_t* callback, void* callback_arg); 394*b7579f77SDag-Erling Smørgrav 395*b7579f77SDag-Erling Smørgrav /** 396*b7579f77SDag-Erling Smørgrav * Create an outgoing TCP commpoint. No file descriptor is opened, left at -1. 397*b7579f77SDag-Erling Smørgrav * @param base: in which base to alloc the commpoint. 398*b7579f77SDag-Erling Smørgrav * @param bufsize: size of buffer to create for handlers. 399*b7579f77SDag-Erling Smørgrav * @param callback: callback function pointer for the handler. 400*b7579f77SDag-Erling Smørgrav * @param callback_arg: will be passed to your callback function. 401*b7579f77SDag-Erling Smørgrav * @return: the commpoint or NULL on error. 402*b7579f77SDag-Erling Smørgrav */ 403*b7579f77SDag-Erling Smørgrav struct comm_point* comm_point_create_tcp_out(struct comm_base* base, 404*b7579f77SDag-Erling Smørgrav size_t bufsize, comm_point_callback_t* callback, void* callback_arg); 405*b7579f77SDag-Erling Smørgrav 406*b7579f77SDag-Erling Smørgrav /** 407*b7579f77SDag-Erling Smørgrav * Create commpoint to listen to a local domain file descriptor. 408*b7579f77SDag-Erling Smørgrav * @param base: in which base to alloc the commpoint. 409*b7579f77SDag-Erling Smørgrav * @param fd: file descriptor of open AF_UNIX socket set to listen nonblocking. 410*b7579f77SDag-Erling Smørgrav * @param bufsize: size of buffer to create for handlers. 411*b7579f77SDag-Erling Smørgrav * @param callback: callback function pointer for the handler. 412*b7579f77SDag-Erling Smørgrav * @param callback_arg: will be passed to your callback function. 413*b7579f77SDag-Erling Smørgrav * @return: the commpoint or NULL on error. 414*b7579f77SDag-Erling Smørgrav */ 415*b7579f77SDag-Erling Smørgrav struct comm_point* comm_point_create_local(struct comm_base* base, 416*b7579f77SDag-Erling Smørgrav int fd, size_t bufsize, 417*b7579f77SDag-Erling Smørgrav comm_point_callback_t* callback, void* callback_arg); 418*b7579f77SDag-Erling Smørgrav 419*b7579f77SDag-Erling Smørgrav /** 420*b7579f77SDag-Erling Smørgrav * Create commpoint to listen to a local domain pipe descriptor. 421*b7579f77SDag-Erling Smørgrav * @param base: in which base to alloc the commpoint. 422*b7579f77SDag-Erling Smørgrav * @param fd: file descriptor. 423*b7579f77SDag-Erling Smørgrav * @param writing: true if you want to listen to writes, false for reads. 424*b7579f77SDag-Erling Smørgrav * @param callback: callback function pointer for the handler. 425*b7579f77SDag-Erling Smørgrav * @param callback_arg: will be passed to your callback function. 426*b7579f77SDag-Erling Smørgrav * @return: the commpoint or NULL on error. 427*b7579f77SDag-Erling Smørgrav */ 428*b7579f77SDag-Erling Smørgrav struct comm_point* comm_point_create_raw(struct comm_base* base, 429*b7579f77SDag-Erling Smørgrav int fd, int writing, 430*b7579f77SDag-Erling Smørgrav comm_point_callback_t* callback, void* callback_arg); 431*b7579f77SDag-Erling Smørgrav 432*b7579f77SDag-Erling Smørgrav /** 433*b7579f77SDag-Erling Smørgrav * Close a comm point fd. 434*b7579f77SDag-Erling Smørgrav * @param c: comm point to close. 435*b7579f77SDag-Erling Smørgrav */ 436*b7579f77SDag-Erling Smørgrav void comm_point_close(struct comm_point* c); 437*b7579f77SDag-Erling Smørgrav 438*b7579f77SDag-Erling Smørgrav /** 439*b7579f77SDag-Erling Smørgrav * Close and deallocate (free) the comm point. If the comm point is 440*b7579f77SDag-Erling Smørgrav * a tcp-accept point, also its tcp-handler points are deleted. 441*b7579f77SDag-Erling Smørgrav * @param c: comm point to delete. 442*b7579f77SDag-Erling Smørgrav */ 443*b7579f77SDag-Erling Smørgrav void comm_point_delete(struct comm_point* c); 444*b7579f77SDag-Erling Smørgrav 445*b7579f77SDag-Erling Smørgrav /** 446*b7579f77SDag-Erling Smørgrav * Send reply. Put message into commpoint buffer. 447*b7579f77SDag-Erling Smørgrav * @param repinfo: The reply info copied from a commpoint callback call. 448*b7579f77SDag-Erling Smørgrav */ 449*b7579f77SDag-Erling Smørgrav void comm_point_send_reply(struct comm_reply* repinfo); 450*b7579f77SDag-Erling Smørgrav 451*b7579f77SDag-Erling Smørgrav /** 452*b7579f77SDag-Erling Smørgrav * Drop reply. Cleans up. 453*b7579f77SDag-Erling Smørgrav * @param repinfo: The reply info copied from a commpoint callback call. 454*b7579f77SDag-Erling Smørgrav */ 455*b7579f77SDag-Erling Smørgrav void comm_point_drop_reply(struct comm_reply* repinfo); 456*b7579f77SDag-Erling Smørgrav 457*b7579f77SDag-Erling Smørgrav /** 458*b7579f77SDag-Erling Smørgrav * Send an udp message over a commpoint. 459*b7579f77SDag-Erling Smørgrav * @param c: commpoint to send it from. 460*b7579f77SDag-Erling Smørgrav * @param packet: what to send. 461*b7579f77SDag-Erling Smørgrav * @param addr: where to send it to. 462*b7579f77SDag-Erling Smørgrav * @param addrlen: length of addr. 463*b7579f77SDag-Erling Smørgrav * @return: false on a failure. 464*b7579f77SDag-Erling Smørgrav */ 465*b7579f77SDag-Erling Smørgrav int comm_point_send_udp_msg(struct comm_point* c, ldns_buffer* packet, 466*b7579f77SDag-Erling Smørgrav struct sockaddr* addr, socklen_t addrlen); 467*b7579f77SDag-Erling Smørgrav 468*b7579f77SDag-Erling Smørgrav /** 469*b7579f77SDag-Erling Smørgrav * Stop listening for input on the commpoint. No callbacks will happen. 470*b7579f77SDag-Erling Smørgrav * @param c: commpoint to disable. The fd is not closed. 471*b7579f77SDag-Erling Smørgrav */ 472*b7579f77SDag-Erling Smørgrav void comm_point_stop_listening(struct comm_point* c); 473*b7579f77SDag-Erling Smørgrav 474*b7579f77SDag-Erling Smørgrav /** 475*b7579f77SDag-Erling Smørgrav * Start listening again for input on the comm point. 476*b7579f77SDag-Erling Smørgrav * @param c: commpoint to enable again. 477*b7579f77SDag-Erling Smørgrav * @param newfd: new fd, or -1 to leave fd be. 478*b7579f77SDag-Erling Smørgrav * @param sec: timeout in seconds, or -1 for no (change to the) timeout. 479*b7579f77SDag-Erling Smørgrav */ 480*b7579f77SDag-Erling Smørgrav void comm_point_start_listening(struct comm_point* c, int newfd, int sec); 481*b7579f77SDag-Erling Smørgrav 482*b7579f77SDag-Erling Smørgrav /** 483*b7579f77SDag-Erling Smørgrav * Stop listening and start listening again for reading or writing. 484*b7579f77SDag-Erling Smørgrav * @param c: commpoint 485*b7579f77SDag-Erling Smørgrav * @param rd: if true, listens for reading. 486*b7579f77SDag-Erling Smørgrav * @param wr: if true, listens for writing. 487*b7579f77SDag-Erling Smørgrav */ 488*b7579f77SDag-Erling Smørgrav void comm_point_listen_for_rw(struct comm_point* c, int rd, int wr); 489*b7579f77SDag-Erling Smørgrav 490*b7579f77SDag-Erling Smørgrav /** 491*b7579f77SDag-Erling Smørgrav * Get size of memory used by comm point. 492*b7579f77SDag-Erling Smørgrav * For TCP handlers this includes subhandlers. 493*b7579f77SDag-Erling Smørgrav * For UDP handlers, this does not include the (shared) UDP buffer. 494*b7579f77SDag-Erling Smørgrav * @param c: commpoint. 495*b7579f77SDag-Erling Smørgrav * @return size in bytes. 496*b7579f77SDag-Erling Smørgrav */ 497*b7579f77SDag-Erling Smørgrav size_t comm_point_get_mem(struct comm_point* c); 498*b7579f77SDag-Erling Smørgrav 499*b7579f77SDag-Erling Smørgrav /** 500*b7579f77SDag-Erling Smørgrav * create timer. Not active upon creation. 501*b7579f77SDag-Erling Smørgrav * @param base: event handling base. 502*b7579f77SDag-Erling Smørgrav * @param cb: callback function: void myfunc(void* myarg); 503*b7579f77SDag-Erling Smørgrav * @param cb_arg: user callback argument. 504*b7579f77SDag-Erling Smørgrav * @return: the new timer or NULL on error. 505*b7579f77SDag-Erling Smørgrav */ 506*b7579f77SDag-Erling Smørgrav struct comm_timer* comm_timer_create(struct comm_base* base, 507*b7579f77SDag-Erling Smørgrav void (*cb)(void*), void* cb_arg); 508*b7579f77SDag-Erling Smørgrav 509*b7579f77SDag-Erling Smørgrav /** 510*b7579f77SDag-Erling Smørgrav * disable timer. Stops callbacks from happening. 511*b7579f77SDag-Erling Smørgrav * @param timer: to disable. 512*b7579f77SDag-Erling Smørgrav */ 513*b7579f77SDag-Erling Smørgrav void comm_timer_disable(struct comm_timer* timer); 514*b7579f77SDag-Erling Smørgrav 515*b7579f77SDag-Erling Smørgrav /** 516*b7579f77SDag-Erling Smørgrav * reset timevalue for timer. 517*b7579f77SDag-Erling Smørgrav * @param timer: timer to (re)set. 518*b7579f77SDag-Erling Smørgrav * @param tv: when the timer should activate. if NULL timer is disabled. 519*b7579f77SDag-Erling Smørgrav */ 520*b7579f77SDag-Erling Smørgrav void comm_timer_set(struct comm_timer* timer, struct timeval* tv); 521*b7579f77SDag-Erling Smørgrav 522*b7579f77SDag-Erling Smørgrav /** 523*b7579f77SDag-Erling Smørgrav * delete timer. 524*b7579f77SDag-Erling Smørgrav * @param timer: to delete. 525*b7579f77SDag-Erling Smørgrav */ 526*b7579f77SDag-Erling Smørgrav void comm_timer_delete(struct comm_timer* timer); 527*b7579f77SDag-Erling Smørgrav 528*b7579f77SDag-Erling Smørgrav /** 529*b7579f77SDag-Erling Smørgrav * see if timeout has been set to a value. 530*b7579f77SDag-Erling Smørgrav * @param timer: the timer to examine. 531*b7579f77SDag-Erling Smørgrav * @return: false if disabled or not set. 532*b7579f77SDag-Erling Smørgrav */ 533*b7579f77SDag-Erling Smørgrav int comm_timer_is_set(struct comm_timer* timer); 534*b7579f77SDag-Erling Smørgrav 535*b7579f77SDag-Erling Smørgrav /** 536*b7579f77SDag-Erling Smørgrav * Get size of memory used by comm timer. 537*b7579f77SDag-Erling Smørgrav * @param timer: the timer to examine. 538*b7579f77SDag-Erling Smørgrav * @return size in bytes. 539*b7579f77SDag-Erling Smørgrav */ 540*b7579f77SDag-Erling Smørgrav size_t comm_timer_get_mem(struct comm_timer* timer); 541*b7579f77SDag-Erling Smørgrav 542*b7579f77SDag-Erling Smørgrav /** 543*b7579f77SDag-Erling Smørgrav * Create a signal handler. Call signal_bind() later to bind to a signal. 544*b7579f77SDag-Erling Smørgrav * @param base: communication base to use. 545*b7579f77SDag-Erling Smørgrav * @param callback: called when signal is caught. 546*b7579f77SDag-Erling Smørgrav * @param cb_arg: user argument to callback 547*b7579f77SDag-Erling Smørgrav * @return: the signal struct or NULL on error. 548*b7579f77SDag-Erling Smørgrav */ 549*b7579f77SDag-Erling Smørgrav struct comm_signal* comm_signal_create(struct comm_base* base, 550*b7579f77SDag-Erling Smørgrav void (*callback)(int, void*), void* cb_arg); 551*b7579f77SDag-Erling Smørgrav 552*b7579f77SDag-Erling Smørgrav /** 553*b7579f77SDag-Erling Smørgrav * Bind signal struct to catch a signal. A signle comm_signal can be bound 554*b7579f77SDag-Erling Smørgrav * to multiple signals, calling comm_signal_bind multiple times. 555*b7579f77SDag-Erling Smørgrav * @param comsig: the communication point, with callback information. 556*b7579f77SDag-Erling Smørgrav * @param sig: signal number. 557*b7579f77SDag-Erling Smørgrav * @return: true on success. false on error. 558*b7579f77SDag-Erling Smørgrav */ 559*b7579f77SDag-Erling Smørgrav int comm_signal_bind(struct comm_signal* comsig, int sig); 560*b7579f77SDag-Erling Smørgrav 561*b7579f77SDag-Erling Smørgrav /** 562*b7579f77SDag-Erling Smørgrav * Delete the signal communication point. 563*b7579f77SDag-Erling Smørgrav * @param comsig: to delete. 564*b7579f77SDag-Erling Smørgrav */ 565*b7579f77SDag-Erling Smørgrav void comm_signal_delete(struct comm_signal* comsig); 566*b7579f77SDag-Erling Smørgrav 567*b7579f77SDag-Erling Smørgrav /** 568*b7579f77SDag-Erling Smørgrav * perform accept(2) with error checking. 569*b7579f77SDag-Erling Smørgrav * @param c: commpoint with accept fd. 570*b7579f77SDag-Erling Smørgrav * @param addr: remote end returned here. 571*b7579f77SDag-Erling Smørgrav * @param addrlen: length of remote end returned here. 572*b7579f77SDag-Erling Smørgrav * @return new fd, or -1 on error. 573*b7579f77SDag-Erling Smørgrav * if -1, error message has been printed if necessary, simply drop 574*b7579f77SDag-Erling Smørgrav * out of the reading handler. 575*b7579f77SDag-Erling Smørgrav */ 576*b7579f77SDag-Erling Smørgrav int comm_point_perform_accept(struct comm_point* c, 577*b7579f77SDag-Erling Smørgrav struct sockaddr_storage* addr, socklen_t* addrlen); 578*b7579f77SDag-Erling Smørgrav 579*b7579f77SDag-Erling Smørgrav /**** internal routines ****/ 580*b7579f77SDag-Erling Smørgrav 581*b7579f77SDag-Erling Smørgrav /** 582*b7579f77SDag-Erling Smørgrav * This routine is published for checks and tests, and is only used internally. 583*b7579f77SDag-Erling Smørgrav * handle libevent callback for udp comm point. 584*b7579f77SDag-Erling Smørgrav * @param fd: file descriptor. 585*b7579f77SDag-Erling Smørgrav * @param event: event bits from libevent: 586*b7579f77SDag-Erling Smørgrav * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT. 587*b7579f77SDag-Erling Smørgrav * @param arg: the comm_point structure. 588*b7579f77SDag-Erling Smørgrav */ 589*b7579f77SDag-Erling Smørgrav void comm_point_udp_callback(int fd, short event, void* arg); 590*b7579f77SDag-Erling Smørgrav 591*b7579f77SDag-Erling Smørgrav /** 592*b7579f77SDag-Erling Smørgrav * This routine is published for checks and tests, and is only used internally. 593*b7579f77SDag-Erling Smørgrav * handle libevent callback for udp ancillary data comm point. 594*b7579f77SDag-Erling Smørgrav * @param fd: file descriptor. 595*b7579f77SDag-Erling Smørgrav * @param event: event bits from libevent: 596*b7579f77SDag-Erling Smørgrav * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT. 597*b7579f77SDag-Erling Smørgrav * @param arg: the comm_point structure. 598*b7579f77SDag-Erling Smørgrav */ 599*b7579f77SDag-Erling Smørgrav void comm_point_udp_ancil_callback(int fd, short event, void* arg); 600*b7579f77SDag-Erling Smørgrav 601*b7579f77SDag-Erling Smørgrav /** 602*b7579f77SDag-Erling Smørgrav * This routine is published for checks and tests, and is only used internally. 603*b7579f77SDag-Erling Smørgrav * handle libevent callback for tcp accept comm point 604*b7579f77SDag-Erling Smørgrav * @param fd: file descriptor. 605*b7579f77SDag-Erling Smørgrav * @param event: event bits from libevent: 606*b7579f77SDag-Erling Smørgrav * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT. 607*b7579f77SDag-Erling Smørgrav * @param arg: the comm_point structure. 608*b7579f77SDag-Erling Smørgrav */ 609*b7579f77SDag-Erling Smørgrav void comm_point_tcp_accept_callback(int fd, short event, void* arg); 610*b7579f77SDag-Erling Smørgrav 611*b7579f77SDag-Erling Smørgrav /** 612*b7579f77SDag-Erling Smørgrav * This routine is published for checks and tests, and is only used internally. 613*b7579f77SDag-Erling Smørgrav * handle libevent callback for tcp data comm point 614*b7579f77SDag-Erling Smørgrav * @param fd: file descriptor. 615*b7579f77SDag-Erling Smørgrav * @param event: event bits from libevent: 616*b7579f77SDag-Erling Smørgrav * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT. 617*b7579f77SDag-Erling Smørgrav * @param arg: the comm_point structure. 618*b7579f77SDag-Erling Smørgrav */ 619*b7579f77SDag-Erling Smørgrav void comm_point_tcp_handle_callback(int fd, short event, void* arg); 620*b7579f77SDag-Erling Smørgrav 621*b7579f77SDag-Erling Smørgrav /** 622*b7579f77SDag-Erling Smørgrav * This routine is published for checks and tests, and is only used internally. 623*b7579f77SDag-Erling Smørgrav * handle libevent callback for timer comm. 624*b7579f77SDag-Erling Smørgrav * @param fd: file descriptor (always -1). 625*b7579f77SDag-Erling Smørgrav * @param event: event bits from libevent: 626*b7579f77SDag-Erling Smørgrav * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT. 627*b7579f77SDag-Erling Smørgrav * @param arg: the comm_timer structure. 628*b7579f77SDag-Erling Smørgrav */ 629*b7579f77SDag-Erling Smørgrav void comm_timer_callback(int fd, short event, void* arg); 630*b7579f77SDag-Erling Smørgrav 631*b7579f77SDag-Erling Smørgrav /** 632*b7579f77SDag-Erling Smørgrav * This routine is published for checks and tests, and is only used internally. 633*b7579f77SDag-Erling Smørgrav * handle libevent callback for signal comm. 634*b7579f77SDag-Erling Smørgrav * @param fd: file descriptor (used for the signal number). 635*b7579f77SDag-Erling Smørgrav * @param event: event bits from libevent: 636*b7579f77SDag-Erling Smørgrav * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT. 637*b7579f77SDag-Erling Smørgrav * @param arg: the internal commsignal structure. 638*b7579f77SDag-Erling Smørgrav */ 639*b7579f77SDag-Erling Smørgrav void comm_signal_callback(int fd, short event, void* arg); 640*b7579f77SDag-Erling Smørgrav 641*b7579f77SDag-Erling Smørgrav /** 642*b7579f77SDag-Erling Smørgrav * This routine is published for checks and tests, and is only used internally. 643*b7579f77SDag-Erling Smørgrav * libevent callback for AF_UNIX fds 644*b7579f77SDag-Erling Smørgrav * @param fd: file descriptor. 645*b7579f77SDag-Erling Smørgrav * @param event: event bits from libevent: 646*b7579f77SDag-Erling Smørgrav * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT. 647*b7579f77SDag-Erling Smørgrav * @param arg: the comm_point structure. 648*b7579f77SDag-Erling Smørgrav */ 649*b7579f77SDag-Erling Smørgrav void comm_point_local_handle_callback(int fd, short event, void* arg); 650*b7579f77SDag-Erling Smørgrav 651*b7579f77SDag-Erling Smørgrav /** 652*b7579f77SDag-Erling Smørgrav * This routine is published for checks and tests, and is only used internally. 653*b7579f77SDag-Erling Smørgrav * libevent callback for raw fd access. 654*b7579f77SDag-Erling Smørgrav * @param fd: file descriptor. 655*b7579f77SDag-Erling Smørgrav * @param event: event bits from libevent: 656*b7579f77SDag-Erling Smørgrav * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT. 657*b7579f77SDag-Erling Smørgrav * @param arg: the comm_point structure. 658*b7579f77SDag-Erling Smørgrav */ 659*b7579f77SDag-Erling Smørgrav void comm_point_raw_handle_callback(int fd, short event, void* arg); 660*b7579f77SDag-Erling Smørgrav 661*b7579f77SDag-Erling Smørgrav /** 662*b7579f77SDag-Erling Smørgrav * This routine is published for checks and tests, and is only used internally. 663*b7579f77SDag-Erling Smørgrav * libevent callback for timeout on slow accept. 664*b7579f77SDag-Erling Smørgrav * @param fd: file descriptor. 665*b7579f77SDag-Erling Smørgrav * @param event: event bits from libevent: 666*b7579f77SDag-Erling Smørgrav * EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT. 667*b7579f77SDag-Erling Smørgrav * @param arg: the comm_point structure. 668*b7579f77SDag-Erling Smørgrav */ 669*b7579f77SDag-Erling Smørgrav void comm_base_handle_slow_accept(int fd, short event, void* arg); 670*b7579f77SDag-Erling Smørgrav 671*b7579f77SDag-Erling Smørgrav #ifdef USE_WINSOCK 672*b7579f77SDag-Erling Smørgrav /** 673*b7579f77SDag-Erling Smørgrav * Callback for openssl BIO to on windows detect WSAEWOULDBLOCK and notify 674*b7579f77SDag-Erling Smørgrav * the winsock_event of this for proper TCP nonblocking implementation. 675*b7579f77SDag-Erling Smørgrav * @param c: comm_point, fd must be set its struct event is registered. 676*b7579f77SDag-Erling Smørgrav * @param ssl: openssl SSL, fd must be set so it has a bio. 677*b7579f77SDag-Erling Smørgrav */ 678*b7579f77SDag-Erling Smørgrav void comm_point_tcp_win_bio_cb(struct comm_point* c, void* ssl); 679*b7579f77SDag-Erling Smørgrav #endif 680*b7579f77SDag-Erling Smørgrav 681*b7579f77SDag-Erling Smørgrav /** see if errno for tcp connect has to be logged or not. This uses errno */ 682*b7579f77SDag-Erling Smørgrav int tcp_connect_errno_needs_log(struct sockaddr* addr, socklen_t addrlen); 683*b7579f77SDag-Erling Smørgrav 684*b7579f77SDag-Erling Smørgrav #endif /* NET_EVENT_H */ 685