xref: /freebsd/contrib/unbound/util/netevent.h (revision b7579f77d18196a58ff700756c84dc9a302a7f67)
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