xref: /freebsd/contrib/unbound/util/netevent.h (revision 4c75e3aa0f1368f18240b8bfd0e1e88f64994a1c)
1b7579f77SDag-Erling Smørgrav /*
2b7579f77SDag-Erling Smørgrav  * util/netevent.h - event notification
3b7579f77SDag-Erling Smørgrav  *
4b7579f77SDag-Erling Smørgrav  * Copyright (c) 2007, NLnet Labs. All rights reserved.
5b7579f77SDag-Erling Smørgrav  *
6b7579f77SDag-Erling Smørgrav  * This software is open source.
7b7579f77SDag-Erling Smørgrav  *
8b7579f77SDag-Erling Smørgrav  * Redistribution and use in source and binary forms, with or without
9b7579f77SDag-Erling Smørgrav  * modification, are permitted provided that the following conditions
10b7579f77SDag-Erling Smørgrav  * are met:
11b7579f77SDag-Erling Smørgrav  *
12b7579f77SDag-Erling Smørgrav  * Redistributions of source code must retain the above copyright notice,
13b7579f77SDag-Erling Smørgrav  * this list of conditions and the following disclaimer.
14b7579f77SDag-Erling Smørgrav  *
15b7579f77SDag-Erling Smørgrav  * Redistributions in binary form must reproduce the above copyright notice,
16b7579f77SDag-Erling Smørgrav  * this list of conditions and the following disclaimer in the documentation
17b7579f77SDag-Erling Smørgrav  * and/or other materials provided with the distribution.
18b7579f77SDag-Erling Smørgrav  *
19b7579f77SDag-Erling Smørgrav  * Neither the name of the NLNET LABS nor the names of its contributors may
20b7579f77SDag-Erling Smørgrav  * be used to endorse or promote products derived from this software without
21b7579f77SDag-Erling Smørgrav  * specific prior written permission.
22b7579f77SDag-Erling Smørgrav  *
23b7579f77SDag-Erling Smørgrav  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2417d15b25SDag-Erling Smørgrav  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2517d15b25SDag-Erling Smørgrav  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2617d15b25SDag-Erling Smørgrav  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2717d15b25SDag-Erling Smørgrav  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2817d15b25SDag-Erling Smørgrav  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
2917d15b25SDag-Erling Smørgrav  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
3017d15b25SDag-Erling Smørgrav  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
3117d15b25SDag-Erling Smørgrav  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
3217d15b25SDag-Erling Smørgrav  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3317d15b25SDag-Erling Smørgrav  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34b7579f77SDag-Erling Smørgrav  */
35b7579f77SDag-Erling Smørgrav 
36b7579f77SDag-Erling Smørgrav /**
37b7579f77SDag-Erling Smørgrav  * \file
38b7579f77SDag-Erling Smørgrav  *
39b7579f77SDag-Erling Smørgrav  * This file contains event notification functions.
40b7579f77SDag-Erling Smørgrav  *
41b7579f77SDag-Erling Smørgrav  * There are three types of communication points
42b7579f77SDag-Erling Smørgrav  *    o UDP socket - perthread buffer.
43b7579f77SDag-Erling Smørgrav  *    o TCP-accept socket - array of TCP-sockets, socketcount.
44b7579f77SDag-Erling Smørgrav  *    o TCP socket - own buffer, parent-TCPaccept, read/write state,
45b7579f77SDag-Erling Smørgrav  *                   number of bytes read/written, timeout.
46b7579f77SDag-Erling Smørgrav  *
47b7579f77SDag-Erling Smørgrav  * There are sockets aimed towards our clients and towards the internet.
48b7579f77SDag-Erling Smørgrav  *    o frontside - aimed towards our clients, queries come in, answers back.
49b7579f77SDag-Erling Smørgrav  *    o behind - aimed towards internet, to the authoritative DNS servers.
50b7579f77SDag-Erling Smørgrav  *
51b7579f77SDag-Erling Smørgrav  * Several event types are available:
52b7579f77SDag-Erling Smørgrav  *    o comm_base - for thread safety of the comm points, one per thread.
53b7579f77SDag-Erling Smørgrav  *    o comm_point - udp and tcp networking, with callbacks.
54b7579f77SDag-Erling Smørgrav  *    o comm_timer - a timeout with callback.
55b7579f77SDag-Erling Smørgrav  *    o comm_signal - callbacks when signal is caught.
56b7579f77SDag-Erling Smørgrav  *    o comm_reply - holds reply info during networking callback.
57b7579f77SDag-Erling Smørgrav  *
58b7579f77SDag-Erling Smørgrav  */
59b7579f77SDag-Erling Smørgrav 
60b7579f77SDag-Erling Smørgrav #ifndef NET_EVENT_H
61b7579f77SDag-Erling Smørgrav #define NET_EVENT_H
62b7579f77SDag-Erling Smørgrav 
6365b390aaSDag-Erling Smørgrav #include "dnscrypt/dnscrypt.h"
6465b390aaSDag-Erling Smørgrav 
6517d15b25SDag-Erling Smørgrav struct sldns_buffer;
66b7579f77SDag-Erling Smørgrav struct comm_point;
67b7579f77SDag-Erling Smørgrav struct comm_reply;
68*4c75e3aaSDag-Erling Smørgrav struct tcl_list;
69e2d15004SDag-Erling Smørgrav struct ub_event_base;
70b7579f77SDag-Erling Smørgrav 
71b7579f77SDag-Erling Smørgrav /* internal event notification data storage structure. */
72b7579f77SDag-Erling Smørgrav struct internal_event;
73b7579f77SDag-Erling Smørgrav struct internal_base;
74e2d15004SDag-Erling Smørgrav struct internal_timer; /* A sub struct of the comm_timer super struct */
75b7579f77SDag-Erling Smørgrav 
76b7579f77SDag-Erling Smørgrav /** callback from communication point function type */
773005e0a3SDag-Erling Smørgrav typedef int comm_point_callback_type(struct comm_point*, void*, int,
78b7579f77SDag-Erling Smørgrav 	struct comm_reply*);
79b7579f77SDag-Erling Smørgrav 
80b7579f77SDag-Erling Smørgrav /** to pass no_error to callback function */
81b7579f77SDag-Erling Smørgrav #define NETEVENT_NOERROR 0
82b7579f77SDag-Erling Smørgrav /** to pass closed connection to callback function */
83b7579f77SDag-Erling Smørgrav #define NETEVENT_CLOSED -1
84b7579f77SDag-Erling Smørgrav /** to pass timeout happened to callback function */
85b7579f77SDag-Erling Smørgrav #define NETEVENT_TIMEOUT -2
86b7579f77SDag-Erling Smørgrav /** to pass fallback from capsforID to callback function; 0x20 failed */
87b7579f77SDag-Erling Smørgrav #define NETEVENT_CAPSFAIL -3
8857bddd21SDag-Erling Smørgrav /** to pass done transfer to callback function; http file is complete */
8957bddd21SDag-Erling Smørgrav #define NETEVENT_DONE -4
90b7579f77SDag-Erling Smørgrav 
91b7579f77SDag-Erling Smørgrav /** timeout to slow accept calls when not possible, in msec. */
92b7579f77SDag-Erling Smørgrav #define NETEVENT_SLOW_ACCEPT_TIME 2000
93b7579f77SDag-Erling Smørgrav 
94b7579f77SDag-Erling Smørgrav /**
95b7579f77SDag-Erling Smørgrav  * A communication point dispatcher. Thread specific.
96b7579f77SDag-Erling Smørgrav  */
97b7579f77SDag-Erling Smørgrav struct comm_base {
98b7579f77SDag-Erling Smørgrav 	/** behind the scenes structure. with say libevent info. alloced */
99b7579f77SDag-Erling Smørgrav 	struct internal_base* eb;
100b7579f77SDag-Erling Smørgrav 	/** callback to stop listening on accept sockets,
101b7579f77SDag-Erling Smørgrav 	 * performed when accept() will not function properly */
102b7579f77SDag-Erling Smørgrav 	void (*stop_accept)(void*);
103b7579f77SDag-Erling Smørgrav 	/** callback to start listening on accept sockets, performed
104b7579f77SDag-Erling Smørgrav 	 * after stop_accept() then a timeout has passed. */
105b7579f77SDag-Erling Smørgrav 	void (*start_accept)(void*);
106b7579f77SDag-Erling Smørgrav 	/** user argument for stop_accept and start_accept functions */
107b7579f77SDag-Erling Smørgrav 	void* cb_arg;
108b7579f77SDag-Erling Smørgrav };
109b7579f77SDag-Erling Smørgrav 
110b7579f77SDag-Erling Smørgrav /**
111b7579f77SDag-Erling Smørgrav  * Reply information for a communication point.
112b7579f77SDag-Erling Smørgrav  */
113b7579f77SDag-Erling Smørgrav struct comm_reply {
114b7579f77SDag-Erling Smørgrav 	/** the comm_point with fd to send reply on to. */
115b7579f77SDag-Erling Smørgrav 	struct comm_point* c;
116b7579f77SDag-Erling Smørgrav 	/** the address (for UDP based communication) */
117b7579f77SDag-Erling Smørgrav 	struct sockaddr_storage addr;
118b7579f77SDag-Erling Smørgrav 	/** length of address */
119b7579f77SDag-Erling Smørgrav 	socklen_t addrlen;
120b7579f77SDag-Erling Smørgrav 	/** return type 0 (none), 4(IP4), 6(IP6) */
121b7579f77SDag-Erling Smørgrav 	int srctype;
12265b390aaSDag-Erling Smørgrav 	/* DnsCrypt context */
12365b390aaSDag-Erling Smørgrav #ifdef USE_DNSCRYPT
12465b390aaSDag-Erling Smørgrav 	uint8_t client_nonce[crypto_box_HALF_NONCEBYTES];
12565b390aaSDag-Erling Smørgrav 	uint8_t nmkey[crypto_box_BEFORENMBYTES];
126c7f4d7adSDag-Erling Smørgrav 	const dnsccert *dnsc_cert;
12765b390aaSDag-Erling Smørgrav 	int is_dnscrypted;
12865b390aaSDag-Erling Smørgrav #endif
129b7579f77SDag-Erling Smørgrav 	/** the return source interface data */
130b7579f77SDag-Erling Smørgrav 	union {
131b7579f77SDag-Erling Smørgrav #ifdef IPV6_PKTINFO
132b7579f77SDag-Erling Smørgrav 		struct in6_pktinfo v6info;
133b7579f77SDag-Erling Smørgrav #endif
134b7579f77SDag-Erling Smørgrav #ifdef IP_PKTINFO
135b7579f77SDag-Erling Smørgrav 		struct in_pktinfo v4info;
136b7579f77SDag-Erling Smørgrav #elif defined(IP_RECVDSTADDR)
137b7579f77SDag-Erling Smørgrav 		struct in_addr v4addr;
138b7579f77SDag-Erling Smørgrav #endif
139b7579f77SDag-Erling Smørgrav 	}
140b7579f77SDag-Erling Smørgrav 		/** variable with return source data */
141b7579f77SDag-Erling Smørgrav 		pktinfo;
14265b390aaSDag-Erling Smørgrav 	/** max udp size for udp packets */
14365b390aaSDag-Erling Smørgrav 	size_t max_udp_size;
144b7579f77SDag-Erling Smørgrav };
145b7579f77SDag-Erling Smørgrav 
146b7579f77SDag-Erling Smørgrav /**
147b7579f77SDag-Erling Smørgrav  * Communication point to the network
148b7579f77SDag-Erling Smørgrav  * These behaviours can be accomplished by setting the flags
149b7579f77SDag-Erling Smørgrav  * and passing return values from the callback.
150b7579f77SDag-Erling Smørgrav  *    udp frontside: called after readdone. sendafter.
151b7579f77SDag-Erling Smørgrav  *    tcp frontside: called readdone, sendafter. close.
152b7579f77SDag-Erling Smørgrav  *    udp behind: called after readdone. No send after.
153b7579f77SDag-Erling Smørgrav  *    tcp behind: write done, read done, then called. No send after.
154b7579f77SDag-Erling Smørgrav  */
155b7579f77SDag-Erling Smørgrav struct comm_point {
156b7579f77SDag-Erling Smørgrav 	/** behind the scenes structure, with say libevent info. alloced. */
157b7579f77SDag-Erling Smørgrav 	struct internal_event* ev;
158b7579f77SDag-Erling Smørgrav 
159b7579f77SDag-Erling Smørgrav 	/** file descriptor for communication point */
160b7579f77SDag-Erling Smørgrav 	int fd;
161b7579f77SDag-Erling Smørgrav 
162b7579f77SDag-Erling Smørgrav 	/** timeout (NULL if it does not). Malloced. */
163b7579f77SDag-Erling Smørgrav 	struct timeval* timeout;
164b7579f77SDag-Erling Smørgrav 
165b7579f77SDag-Erling Smørgrav 	/** buffer pointer. Either to perthread, or own buffer or NULL */
16617d15b25SDag-Erling Smørgrav 	struct sldns_buffer* buffer;
167b7579f77SDag-Erling Smørgrav 
168b7579f77SDag-Erling Smørgrav 	/* -------- TCP Handler -------- */
169b7579f77SDag-Erling Smørgrav 	/** Read/Write state for TCP */
170b7579f77SDag-Erling Smørgrav 	int tcp_is_reading;
171b7579f77SDag-Erling Smørgrav 	/** The current read/write count for TCP */
172b7579f77SDag-Erling Smørgrav 	size_t tcp_byte_count;
173b7579f77SDag-Erling Smørgrav 	/** parent communication point (for TCP sockets) */
174b7579f77SDag-Erling Smørgrav 	struct comm_point* tcp_parent;
175b7579f77SDag-Erling Smørgrav 	/** sockaddr from peer, for TCP handlers */
176b7579f77SDag-Erling Smørgrav 	struct comm_reply repinfo;
177b7579f77SDag-Erling Smørgrav 
178b7579f77SDag-Erling Smørgrav 	/* -------- TCP Accept -------- */
179b7579f77SDag-Erling Smørgrav 	/** the number of TCP handlers for this tcp-accept socket */
180b7579f77SDag-Erling Smørgrav 	int max_tcp_count;
18109a3aaf3SDag-Erling Smørgrav 	/** current number of tcp handler in-use for this accept socket */
18209a3aaf3SDag-Erling Smørgrav 	int cur_tcp_count;
183b7579f77SDag-Erling Smørgrav 	/** malloced array of tcp handlers for a tcp-accept,
184b7579f77SDag-Erling Smørgrav 	    of size max_tcp_count. */
185b7579f77SDag-Erling Smørgrav 	struct comm_point** tcp_handlers;
186b7579f77SDag-Erling Smørgrav 	/** linked list of free tcp_handlers to use for new queries.
187b7579f77SDag-Erling Smørgrav 	    For tcp_accept the first entry, for tcp_handlers the next one. */
188b7579f77SDag-Erling Smørgrav 	struct comm_point* tcp_free;
189b7579f77SDag-Erling Smørgrav 
190b7579f77SDag-Erling Smørgrav 	/* -------- SSL TCP DNS ------- */
191b7579f77SDag-Erling Smørgrav 	/** the SSL object with rw bio (owned) or for commaccept ctx ref */
192b7579f77SDag-Erling Smørgrav 	void* ssl;
193b7579f77SDag-Erling Smørgrav 	/** handshake state for init and renegotiate */
194b7579f77SDag-Erling Smørgrav 	enum {
195b7579f77SDag-Erling Smørgrav 		/** no handshake, it has been done */
196b7579f77SDag-Erling Smørgrav 		comm_ssl_shake_none = 0,
197b7579f77SDag-Erling Smørgrav 		/** ssl initial handshake wants to read */
198b7579f77SDag-Erling Smørgrav 		comm_ssl_shake_read,
199b7579f77SDag-Erling Smørgrav 		/** ssl initial handshake wants to write */
200b7579f77SDag-Erling Smørgrav 		comm_ssl_shake_write,
201b7579f77SDag-Erling Smørgrav 		/** ssl_write wants to read */
202b7579f77SDag-Erling Smørgrav 		comm_ssl_shake_hs_read,
203b7579f77SDag-Erling Smørgrav 		/** ssl_read wants to write */
204b7579f77SDag-Erling Smørgrav 		comm_ssl_shake_hs_write
205b7579f77SDag-Erling Smørgrav 	} ssl_shake_state;
206b7579f77SDag-Erling Smørgrav 
20757bddd21SDag-Erling Smørgrav 	/* -------- HTTP ------- */
20857bddd21SDag-Erling Smørgrav 	/** Currently reading in http headers */
20957bddd21SDag-Erling Smørgrav 	int http_in_headers;
21057bddd21SDag-Erling Smørgrav 	/** Currently reading in chunk headers, 0=not, 1=firstline, 2=unused
21157bddd21SDag-Erling Smørgrav 	 * (more lines), 3=trailer headers after chunk */
21257bddd21SDag-Erling Smørgrav 	int http_in_chunk_headers;
21357bddd21SDag-Erling Smørgrav 	/** chunked transfer */
21457bddd21SDag-Erling Smørgrav 	int http_is_chunked;
21557bddd21SDag-Erling Smørgrav 	/** http temp buffer (shared buffer for temporary work) */
21657bddd21SDag-Erling Smørgrav 	struct sldns_buffer* http_temp;
21757bddd21SDag-Erling Smørgrav 	/** http stored content in buffer */
21857bddd21SDag-Erling Smørgrav 	size_t http_stored;
21957bddd21SDag-Erling Smørgrav 
220ff825849SDag-Erling Smørgrav 	/* -------- dnstap ------- */
221ff825849SDag-Erling Smørgrav 	/** the dnstap environment */
222ff825849SDag-Erling Smørgrav 	struct dt_env* dtenv;
223ff825849SDag-Erling Smørgrav 
224b7579f77SDag-Erling Smørgrav 	/** is this a UDP, TCP-accept or TCP socket. */
225b7579f77SDag-Erling Smørgrav 	enum comm_point_type {
226b7579f77SDag-Erling Smørgrav 		/** UDP socket - handle datagrams. */
227b7579f77SDag-Erling Smørgrav 		comm_udp,
228b7579f77SDag-Erling Smørgrav 		/** TCP accept socket - only creates handlers if readable. */
229b7579f77SDag-Erling Smørgrav 		comm_tcp_accept,
230b7579f77SDag-Erling Smørgrav 		/** TCP handler socket - handle byteperbyte readwrite. */
231b7579f77SDag-Erling Smørgrav 		comm_tcp,
23257bddd21SDag-Erling Smørgrav 		/** HTTP handler socket */
23357bddd21SDag-Erling Smørgrav 		comm_http,
234b7579f77SDag-Erling Smørgrav 		/** AF_UNIX socket - for internal commands. */
235b7579f77SDag-Erling Smørgrav 		comm_local,
236b7579f77SDag-Erling Smørgrav 		/** raw - not DNS format - for pipe readers and writers */
237b7579f77SDag-Erling Smørgrav 		comm_raw
238b7579f77SDag-Erling Smørgrav 	}
239b7579f77SDag-Erling Smørgrav 		/** variable with type of socket, UDP,TCP-accept,TCP,pipe */
240b7579f77SDag-Erling Smørgrav 		type;
241b7579f77SDag-Erling Smørgrav 
242b7579f77SDag-Erling Smørgrav 	/* ---------- Behaviour ----------- */
243b7579f77SDag-Erling Smørgrav 	/** if set the connection is NOT closed on delete. */
244b7579f77SDag-Erling Smørgrav 	int do_not_close;
245b7579f77SDag-Erling Smørgrav 
246b7579f77SDag-Erling Smørgrav 	/** if set, the connection is closed on error, on timeout,
247b7579f77SDag-Erling Smørgrav 	    and after read/write completes. No callback is done. */
248b7579f77SDag-Erling Smørgrav 	int tcp_do_close;
249b7579f77SDag-Erling Smørgrav 
250b7579f77SDag-Erling Smørgrav 	/** if set, read/write completes:
251b7579f77SDag-Erling Smørgrav 		read/write state of tcp is toggled.
252b7579f77SDag-Erling Smørgrav 		buffer reset/bytecount reset.
253b7579f77SDag-Erling Smørgrav 		this flag cleared.
254b7579f77SDag-Erling Smørgrav 	    So that when that is done the callback is called. */
255b7579f77SDag-Erling Smørgrav 	int tcp_do_toggle_rw;
256b7579f77SDag-Erling Smørgrav 
257b5663de9SDag-Erling Smørgrav 	/** timeout in msec for TCP wait times for this connection */
258b5663de9SDag-Erling Smørgrav 	int tcp_timeout_msec;
259b5663de9SDag-Erling Smørgrav 
260*4c75e3aaSDag-Erling Smørgrav 	/** if set, tcp keepalive is enabled on this connection */
261*4c75e3aaSDag-Erling Smørgrav 	int tcp_keepalive;
262*4c75e3aaSDag-Erling Smørgrav 
263b7579f77SDag-Erling Smørgrav 	/** if set, checks for pending error from nonblocking connect() call.*/
264b7579f77SDag-Erling Smørgrav 	int tcp_check_nb_connect;
265b7579f77SDag-Erling Smørgrav 
266*4c75e3aaSDag-Erling Smørgrav 	/** if set, check for connection limit on tcp accept. */
267*4c75e3aaSDag-Erling Smørgrav 	struct tcl_list* tcp_conn_limit;
268*4c75e3aaSDag-Erling Smørgrav 	/** the entry for the connection. */
269*4c75e3aaSDag-Erling Smørgrav 	struct tcl_addr* tcl_addr;
270*4c75e3aaSDag-Erling Smørgrav 
271b5663de9SDag-Erling Smørgrav #ifdef USE_MSG_FASTOPEN
272b5663de9SDag-Erling Smørgrav 	/** used to track if the sendto() call should be done when using TFO. */
273b5663de9SDag-Erling Smørgrav 	int tcp_do_fastopen;
274b5663de9SDag-Erling Smørgrav #endif
275b5663de9SDag-Erling Smørgrav 
27665b390aaSDag-Erling Smørgrav #ifdef USE_DNSCRYPT
27765b390aaSDag-Erling Smørgrav 	/** Is this a dnscrypt channel */
27865b390aaSDag-Erling Smørgrav 	int dnscrypt;
27965b390aaSDag-Erling Smørgrav 	/** encrypted buffer pointer. Either to perthread, or own buffer or NULL */
28065b390aaSDag-Erling Smørgrav 	struct sldns_buffer* dnscrypt_buffer;
28165b390aaSDag-Erling Smørgrav #endif
282b7579f77SDag-Erling Smørgrav 	/** number of queries outstanding on this socket, used by
283b7579f77SDag-Erling Smørgrav 	 * outside network for udp ports */
284b7579f77SDag-Erling Smørgrav 	int inuse;
285b7579f77SDag-Erling Smørgrav 
286b7579f77SDag-Erling Smørgrav 	/** callback when done.
287b7579f77SDag-Erling Smørgrav 	    tcp_accept does not get called back, is NULL then.
288b7579f77SDag-Erling Smørgrav 	    If a timeout happens, callback with timeout=1 is called.
289b7579f77SDag-Erling Smørgrav 	    If an error happens, callback is called with error set
290b7579f77SDag-Erling Smørgrav 	    nonzero. If not NETEVENT_NOERROR, it is an errno value.
291b7579f77SDag-Erling Smørgrav 	    If the connection is closed (by remote end) then the
292b7579f77SDag-Erling Smørgrav 	    callback is called with error set to NETEVENT_CLOSED=-1.
293b7579f77SDag-Erling Smørgrav 	    If a timeout happens on the connection, the error is set to
294b7579f77SDag-Erling Smørgrav 	    NETEVENT_TIMEOUT=-2.
295b7579f77SDag-Erling Smørgrav 	    The reply_info can be copied if the reply needs to happen at a
296b7579f77SDag-Erling Smørgrav 	    later time. It consists of a struct with commpoint and address.
297b7579f77SDag-Erling Smørgrav 	    It can be passed to a msg send routine some time later.
298b7579f77SDag-Erling Smørgrav 	    Note the reply information is temporary and must be copied.
299b7579f77SDag-Erling Smørgrav 	    NULL is passed for_reply info, in cases where error happened.
300b7579f77SDag-Erling Smørgrav 
301b7579f77SDag-Erling Smørgrav 	    declare as:
302b7579f77SDag-Erling Smørgrav 	    int my_callback(struct comm_point* c, void* my_arg, int error,
303b7579f77SDag-Erling Smørgrav 		struct comm_reply *reply_info);
304b7579f77SDag-Erling Smørgrav 
305b7579f77SDag-Erling Smørgrav 	    if the routine returns 0, nothing is done.
306b7579f77SDag-Erling Smørgrav 	    Notzero, the buffer will be sent back to client.
307b7579f77SDag-Erling Smørgrav 	    		For UDP this is done without changing the commpoint.
308b7579f77SDag-Erling Smørgrav 			In TCP it sets write state.
309b7579f77SDag-Erling Smørgrav 	*/
3103005e0a3SDag-Erling Smørgrav 	comm_point_callback_type* callback;
311b7579f77SDag-Erling Smørgrav 	/** argument to pass to callback. */
312b7579f77SDag-Erling Smørgrav 	void *cb_arg;
313b7579f77SDag-Erling Smørgrav };
314b7579f77SDag-Erling Smørgrav 
315b7579f77SDag-Erling Smørgrav /**
316b7579f77SDag-Erling Smørgrav  * Structure only for making timeout events.
317b7579f77SDag-Erling Smørgrav  */
318b7579f77SDag-Erling Smørgrav struct comm_timer {
319e2d15004SDag-Erling Smørgrav 	/** the internal event stuff (derived) */
320b7579f77SDag-Erling Smørgrav 	struct internal_timer* ev_timer;
321b7579f77SDag-Erling Smørgrav 
322b7579f77SDag-Erling Smørgrav 	/** callback function, takes user arg only */
323b7579f77SDag-Erling Smørgrav 	void (*callback)(void*);
324b7579f77SDag-Erling Smørgrav 
325b7579f77SDag-Erling Smørgrav 	/** callback user argument */
326b7579f77SDag-Erling Smørgrav 	void* cb_arg;
327b7579f77SDag-Erling Smørgrav };
328b7579f77SDag-Erling Smørgrav 
329b7579f77SDag-Erling Smørgrav /**
330b7579f77SDag-Erling Smørgrav  * Structure only for signal events.
331b7579f77SDag-Erling Smørgrav  */
332b7579f77SDag-Erling Smørgrav struct comm_signal {
333b7579f77SDag-Erling Smørgrav 	/** the communication base */
334b7579f77SDag-Erling Smørgrav 	struct comm_base* base;
335b7579f77SDag-Erling Smørgrav 
336b7579f77SDag-Erling Smørgrav 	/** the internal event stuff */
337b7579f77SDag-Erling Smørgrav 	struct internal_signal* ev_signal;
338b7579f77SDag-Erling Smørgrav 
339b7579f77SDag-Erling Smørgrav 	/** callback function, takes signal number and user arg */
340b7579f77SDag-Erling Smørgrav 	void (*callback)(int, void*);
341b7579f77SDag-Erling Smørgrav 
342b7579f77SDag-Erling Smørgrav 	/** callback user argument */
343b7579f77SDag-Erling Smørgrav 	void* cb_arg;
344b7579f77SDag-Erling Smørgrav };
345b7579f77SDag-Erling Smørgrav 
346b7579f77SDag-Erling Smørgrav /**
347b7579f77SDag-Erling Smørgrav  * Create a new comm base.
348b7579f77SDag-Erling Smørgrav  * @param sigs: if true it attempts to create a default loop for
349b7579f77SDag-Erling Smørgrav  *   signal handling.
350b7579f77SDag-Erling Smørgrav  * @return: the new comm base. NULL on error.
351b7579f77SDag-Erling Smørgrav  */
352b7579f77SDag-Erling Smørgrav struct comm_base* comm_base_create(int sigs);
353b7579f77SDag-Erling Smørgrav 
354b7579f77SDag-Erling Smørgrav /**
355e2d15004SDag-Erling Smørgrav  * Create comm base that uses the given ub_event_base (underlying pluggable
356e2d15004SDag-Erling Smørgrav  * event mechanism pointer).
357e2d15004SDag-Erling Smørgrav  * @param base: underlying pluggable event base.
35817d15b25SDag-Erling Smørgrav  * @return: the new comm base. NULL on error.
35917d15b25SDag-Erling Smørgrav  */
360e2d15004SDag-Erling Smørgrav struct comm_base* comm_base_create_event(struct ub_event_base* base);
36117d15b25SDag-Erling Smørgrav 
36217d15b25SDag-Erling Smørgrav /**
36317d15b25SDag-Erling Smørgrav  * Delete comm base structure but not the underlying lib event base.
36417d15b25SDag-Erling Smørgrav  * All comm points must have been deleted.
36517d15b25SDag-Erling Smørgrav  * @param b: the base to delete.
36617d15b25SDag-Erling Smørgrav  */
36717d15b25SDag-Erling Smørgrav void comm_base_delete_no_base(struct comm_base* b);
36817d15b25SDag-Erling Smørgrav 
36917d15b25SDag-Erling Smørgrav /**
370b7579f77SDag-Erling Smørgrav  * Destroy a comm base.
371b7579f77SDag-Erling Smørgrav  * All comm points must have been deleted.
372b7579f77SDag-Erling Smørgrav  * @param b: the base to delete.
373b7579f77SDag-Erling Smørgrav  */
374b7579f77SDag-Erling Smørgrav void comm_base_delete(struct comm_base* b);
375b7579f77SDag-Erling Smørgrav 
376b7579f77SDag-Erling Smørgrav /**
377b7579f77SDag-Erling Smørgrav  * Obtain two pointers. The pointers never change (until base_delete()).
378b7579f77SDag-Erling Smørgrav  * The pointers point to time values that are updated regularly.
379b7579f77SDag-Erling Smørgrav  * @param b: the communication base that will update the time values.
380b7579f77SDag-Erling Smørgrav  * @param tt: pointer to time in seconds is returned.
381b7579f77SDag-Erling Smørgrav  * @param tv: pointer to time in microseconds is returned.
382b7579f77SDag-Erling Smørgrav  */
38317d15b25SDag-Erling Smørgrav void comm_base_timept(struct comm_base* b, time_t** tt, struct timeval** tv);
384b7579f77SDag-Erling Smørgrav 
385b7579f77SDag-Erling Smørgrav /**
386b7579f77SDag-Erling Smørgrav  * Dispatch the comm base events.
387b7579f77SDag-Erling Smørgrav  * @param b: the communication to perform.
388b7579f77SDag-Erling Smørgrav  */
389b7579f77SDag-Erling Smørgrav void comm_base_dispatch(struct comm_base* b);
390b7579f77SDag-Erling Smørgrav 
391b7579f77SDag-Erling Smørgrav /**
392b7579f77SDag-Erling Smørgrav  * Exit from dispatch loop.
393b7579f77SDag-Erling Smørgrav  * @param b: the communication base that is in dispatch().
394b7579f77SDag-Erling Smørgrav  */
395b7579f77SDag-Erling Smørgrav void comm_base_exit(struct comm_base* b);
396b7579f77SDag-Erling Smørgrav 
397b7579f77SDag-Erling Smørgrav /**
398b7579f77SDag-Erling Smørgrav  * Set the slow_accept mode handlers.  You can not provide these if you do
399b7579f77SDag-Erling Smørgrav  * not perform accept() calls.
400b7579f77SDag-Erling Smørgrav  * @param b: comm base
401b7579f77SDag-Erling Smørgrav  * @param stop_accept: function that stops listening to accept fds.
402b7579f77SDag-Erling Smørgrav  * @param start_accept: function that resumes listening to accept fds.
403b7579f77SDag-Erling Smørgrav  * @param arg: callback arg to pass to the functions.
404b7579f77SDag-Erling Smørgrav  */
405b7579f77SDag-Erling Smørgrav void comm_base_set_slow_accept_handlers(struct comm_base* b,
406b7579f77SDag-Erling Smørgrav 	void (*stop_accept)(void*), void (*start_accept)(void*), void* arg);
407b7579f77SDag-Erling Smørgrav 
408b7579f77SDag-Erling Smørgrav /**
409b7579f77SDag-Erling Smørgrav  * Access internal data structure (for util/tube.c on windows)
410b7579f77SDag-Erling Smørgrav  * @param b: comm base
411e2d15004SDag-Erling Smørgrav  * @return ub_event_base.
412b7579f77SDag-Erling Smørgrav  */
413e2d15004SDag-Erling Smørgrav struct ub_event_base* comm_base_internal(struct comm_base* b);
414b7579f77SDag-Erling Smørgrav 
415b7579f77SDag-Erling Smørgrav /**
416b7579f77SDag-Erling Smørgrav  * Create an UDP comm point. Calls malloc.
417b7579f77SDag-Erling Smørgrav  * setups the structure with the parameters you provide.
418b7579f77SDag-Erling Smørgrav  * @param base: in which base to alloc the commpoint.
419b7579f77SDag-Erling Smørgrav  * @param fd : file descriptor of open UDP socket.
420b7579f77SDag-Erling Smørgrav  * @param buffer: shared buffer by UDP sockets from this thread.
421b7579f77SDag-Erling Smørgrav  * @param callback: callback function pointer.
422b7579f77SDag-Erling Smørgrav  * @param callback_arg: will be passed to your callback function.
423b7579f77SDag-Erling Smørgrav  * @return: returns the allocated communication point. NULL on error.
424b7579f77SDag-Erling Smørgrav  * Sets timeout to NULL. Turns off TCP options.
425b7579f77SDag-Erling Smørgrav  */
426b7579f77SDag-Erling Smørgrav struct comm_point* comm_point_create_udp(struct comm_base* base,
42717d15b25SDag-Erling Smørgrav 	int fd, struct sldns_buffer* buffer,
4283005e0a3SDag-Erling Smørgrav 	comm_point_callback_type* callback, void* callback_arg);
429b7579f77SDag-Erling Smørgrav 
430b7579f77SDag-Erling Smørgrav /**
431b7579f77SDag-Erling Smørgrav  * Create an UDP with ancillary data comm point. Calls malloc.
432b7579f77SDag-Erling Smørgrav  * Uses recvmsg instead of recv to get udp message.
433b7579f77SDag-Erling Smørgrav  * setups the structure with the parameters you provide.
434b7579f77SDag-Erling Smørgrav  * @param base: in which base to alloc the commpoint.
435b7579f77SDag-Erling Smørgrav  * @param fd : file descriptor of open UDP socket.
436b7579f77SDag-Erling Smørgrav  * @param buffer: shared buffer by UDP sockets from this thread.
437b7579f77SDag-Erling Smørgrav  * @param callback: callback function pointer.
438b7579f77SDag-Erling Smørgrav  * @param callback_arg: will be passed to your callback function.
439b7579f77SDag-Erling Smørgrav  * @return: returns the allocated communication point. NULL on error.
440b7579f77SDag-Erling Smørgrav  * Sets timeout to NULL. Turns off TCP options.
441b7579f77SDag-Erling Smørgrav  */
442b7579f77SDag-Erling Smørgrav struct comm_point* comm_point_create_udp_ancil(struct comm_base* base,
44317d15b25SDag-Erling Smørgrav 	int fd, struct sldns_buffer* buffer,
4443005e0a3SDag-Erling Smørgrav 	comm_point_callback_type* callback, void* callback_arg);
445b7579f77SDag-Erling Smørgrav 
446b7579f77SDag-Erling Smørgrav /**
447b7579f77SDag-Erling Smørgrav  * Create a TCP listener comm point. Calls malloc.
448b7579f77SDag-Erling Smørgrav  * Setups the structure with the parameters you provide.
449b7579f77SDag-Erling Smørgrav  * Also Creates TCP Handlers, pre allocated for you.
450b7579f77SDag-Erling Smørgrav  * Uses the parameters you provide.
451b7579f77SDag-Erling Smørgrav  * @param base: in which base to alloc the commpoint.
452b7579f77SDag-Erling Smørgrav  * @param fd: file descriptor of open TCP socket set to listen nonblocking.
453b7579f77SDag-Erling Smørgrav  * @param num: becomes max_tcp_count, the routine allocates that
454b7579f77SDag-Erling Smørgrav  *	many tcp handler commpoints.
455*4c75e3aaSDag-Erling Smørgrav  * @param idle_timeout: TCP idle timeout in ms.
456*4c75e3aaSDag-Erling Smørgrav  * @param tcp_conn_limit: TCP connection limit info.
457b7579f77SDag-Erling Smørgrav  * @param bufsize: size of buffer to create for handlers.
458b7579f77SDag-Erling Smørgrav  * @param callback: callback function pointer for TCP handlers.
459b7579f77SDag-Erling Smørgrav  * @param callback_arg: will be passed to your callback function.
460b7579f77SDag-Erling Smørgrav  * @return: returns the TCP listener commpoint. You can find the
461b7579f77SDag-Erling Smørgrav  *  	TCP handlers in the array inside the listener commpoint.
462b7579f77SDag-Erling Smørgrav  *	returns NULL on error.
463b7579f77SDag-Erling Smørgrav  * Inits timeout to NULL. All handlers are on the free list.
464b7579f77SDag-Erling Smørgrav  */
465b7579f77SDag-Erling Smørgrav struct comm_point* comm_point_create_tcp(struct comm_base* base,
466*4c75e3aaSDag-Erling Smørgrav 	int fd, int num, int idle_timeout, struct tcl_list* tcp_conn_limit,
467*4c75e3aaSDag-Erling Smørgrav 	size_t bufsize, comm_point_callback_type* callback, void* callback_arg);
468b7579f77SDag-Erling Smørgrav 
469b7579f77SDag-Erling Smørgrav /**
470b7579f77SDag-Erling Smørgrav  * Create an outgoing TCP commpoint. No file descriptor is opened, left at -1.
471b7579f77SDag-Erling Smørgrav  * @param base: in which base to alloc the commpoint.
472b7579f77SDag-Erling Smørgrav  * @param bufsize: size of buffer to create for handlers.
473b7579f77SDag-Erling Smørgrav  * @param callback: callback function pointer for the handler.
474b7579f77SDag-Erling Smørgrav  * @param callback_arg: will be passed to your callback function.
475b7579f77SDag-Erling Smørgrav  * @return: the commpoint or NULL on error.
476b7579f77SDag-Erling Smørgrav  */
477b7579f77SDag-Erling Smørgrav struct comm_point* comm_point_create_tcp_out(struct comm_base* base,
4783005e0a3SDag-Erling Smørgrav 	size_t bufsize, comm_point_callback_type* callback, void* callback_arg);
479b7579f77SDag-Erling Smørgrav 
480b7579f77SDag-Erling Smørgrav /**
48157bddd21SDag-Erling Smørgrav  * Create an outgoing HTTP commpoint. No file descriptor is opened, left at -1.
48257bddd21SDag-Erling Smørgrav  * @param base: in which base to alloc the commpoint.
48357bddd21SDag-Erling Smørgrav  * @param bufsize: size of buffer to create for handlers.
48457bddd21SDag-Erling Smørgrav  * @param callback: callback function pointer for the handler.
48557bddd21SDag-Erling Smørgrav  * @param callback_arg: will be passed to your callback function.
48657bddd21SDag-Erling Smørgrav  * @param temp: sldns buffer, shared between other http_out commpoints, for
48757bddd21SDag-Erling Smørgrav  * 	temporary data when performing callbacks.
48857bddd21SDag-Erling Smørgrav  * @return: the commpoint or NULL on error.
48957bddd21SDag-Erling Smørgrav  */
49057bddd21SDag-Erling Smørgrav struct comm_point* comm_point_create_http_out(struct comm_base* base,
49157bddd21SDag-Erling Smørgrav 	size_t bufsize, comm_point_callback_type* callback,
49257bddd21SDag-Erling Smørgrav 	void* callback_arg, struct sldns_buffer* temp);
49357bddd21SDag-Erling Smørgrav 
49457bddd21SDag-Erling Smørgrav /**
495b7579f77SDag-Erling Smørgrav  * Create commpoint to listen to a local domain file descriptor.
496b7579f77SDag-Erling Smørgrav  * @param base: in which base to alloc the commpoint.
497b7579f77SDag-Erling Smørgrav  * @param fd: file descriptor of open AF_UNIX socket set to listen nonblocking.
498b7579f77SDag-Erling Smørgrav  * @param bufsize: size of buffer to create for handlers.
499b7579f77SDag-Erling Smørgrav  * @param callback: callback function pointer for the handler.
500b7579f77SDag-Erling Smørgrav  * @param callback_arg: will be passed to your callback function.
501b7579f77SDag-Erling Smørgrav  * @return: the commpoint or NULL on error.
502b7579f77SDag-Erling Smørgrav  */
503b7579f77SDag-Erling Smørgrav struct comm_point* comm_point_create_local(struct comm_base* base,
504b7579f77SDag-Erling Smørgrav 	int fd, size_t bufsize,
5053005e0a3SDag-Erling Smørgrav 	comm_point_callback_type* callback, void* callback_arg);
506b7579f77SDag-Erling Smørgrav 
507b7579f77SDag-Erling Smørgrav /**
508b7579f77SDag-Erling Smørgrav  * Create commpoint to listen to a local domain pipe descriptor.
509b7579f77SDag-Erling Smørgrav  * @param base: in which base to alloc the commpoint.
510b7579f77SDag-Erling Smørgrav  * @param fd: file descriptor.
511b7579f77SDag-Erling Smørgrav  * @param writing: true if you want to listen to writes, false for reads.
512b7579f77SDag-Erling Smørgrav  * @param callback: callback function pointer for the handler.
513b7579f77SDag-Erling Smørgrav  * @param callback_arg: will be passed to your callback function.
514b7579f77SDag-Erling Smørgrav  * @return: the commpoint or NULL on error.
515b7579f77SDag-Erling Smørgrav  */
516b7579f77SDag-Erling Smørgrav struct comm_point* comm_point_create_raw(struct comm_base* base,
517b7579f77SDag-Erling Smørgrav 	int fd, int writing,
5183005e0a3SDag-Erling Smørgrav 	comm_point_callback_type* callback, void* callback_arg);
519b7579f77SDag-Erling Smørgrav 
520b7579f77SDag-Erling Smørgrav /**
521b7579f77SDag-Erling Smørgrav  * Close a comm point fd.
522b7579f77SDag-Erling Smørgrav  * @param c: comm point to close.
523b7579f77SDag-Erling Smørgrav  */
524b7579f77SDag-Erling Smørgrav void comm_point_close(struct comm_point* c);
525b7579f77SDag-Erling Smørgrav 
526b7579f77SDag-Erling Smørgrav /**
527b7579f77SDag-Erling Smørgrav  * Close and deallocate (free) the comm point. If the comm point is
528b7579f77SDag-Erling Smørgrav  * a tcp-accept point, also its tcp-handler points are deleted.
529b7579f77SDag-Erling Smørgrav  * @param c: comm point to delete.
530b7579f77SDag-Erling Smørgrav  */
531b7579f77SDag-Erling Smørgrav void comm_point_delete(struct comm_point* c);
532b7579f77SDag-Erling Smørgrav 
533b7579f77SDag-Erling Smørgrav /**
534b7579f77SDag-Erling Smørgrav  * Send reply. Put message into commpoint buffer.
535b7579f77SDag-Erling Smørgrav  * @param repinfo: The reply info copied from a commpoint callback call.
536b7579f77SDag-Erling Smørgrav  */
537b7579f77SDag-Erling Smørgrav void comm_point_send_reply(struct comm_reply* repinfo);
538b7579f77SDag-Erling Smørgrav 
539b7579f77SDag-Erling Smørgrav /**
540b7579f77SDag-Erling Smørgrav  * Drop reply. Cleans up.
541b7579f77SDag-Erling Smørgrav  * @param repinfo: The reply info copied from a commpoint callback call.
542b7579f77SDag-Erling Smørgrav  */
543b7579f77SDag-Erling Smørgrav void comm_point_drop_reply(struct comm_reply* repinfo);
544b7579f77SDag-Erling Smørgrav 
545b7579f77SDag-Erling Smørgrav /**
546b7579f77SDag-Erling Smørgrav  * Send an udp message over a commpoint.
547b7579f77SDag-Erling Smørgrav  * @param c: commpoint to send it from.
548b7579f77SDag-Erling Smørgrav  * @param packet: what to send.
549b7579f77SDag-Erling Smørgrav  * @param addr: where to send it to.
550b7579f77SDag-Erling Smørgrav  * @param addrlen: length of addr.
551b7579f77SDag-Erling Smørgrav  * @return: false on a failure.
552b7579f77SDag-Erling Smørgrav  */
55317d15b25SDag-Erling Smørgrav int comm_point_send_udp_msg(struct comm_point* c, struct sldns_buffer* packet,
554b7579f77SDag-Erling Smørgrav 	struct sockaddr* addr, socklen_t addrlen);
555b7579f77SDag-Erling Smørgrav 
556b7579f77SDag-Erling Smørgrav /**
557b7579f77SDag-Erling Smørgrav  * Stop listening for input on the commpoint. No callbacks will happen.
558b7579f77SDag-Erling Smørgrav  * @param c: commpoint to disable. The fd is not closed.
559b7579f77SDag-Erling Smørgrav  */
560b7579f77SDag-Erling Smørgrav void comm_point_stop_listening(struct comm_point* c);
561b7579f77SDag-Erling Smørgrav 
562b7579f77SDag-Erling Smørgrav /**
563b7579f77SDag-Erling Smørgrav  * Start listening again for input on the comm point.
564b7579f77SDag-Erling Smørgrav  * @param c: commpoint to enable again.
565b7579f77SDag-Erling Smørgrav  * @param newfd: new fd, or -1 to leave fd be.
566b5663de9SDag-Erling Smørgrav  * @param msec: timeout in milliseconds, or -1 for no (change to the) timeout.
567b5663de9SDag-Erling Smørgrav  *	So seconds*1000.
568b7579f77SDag-Erling Smørgrav  */
569b5663de9SDag-Erling Smørgrav void comm_point_start_listening(struct comm_point* c, int newfd, int msec);
570b7579f77SDag-Erling Smørgrav 
571b7579f77SDag-Erling Smørgrav /**
572b7579f77SDag-Erling Smørgrav  * Stop listening and start listening again for reading or writing.
573b7579f77SDag-Erling Smørgrav  * @param c: commpoint
574b7579f77SDag-Erling Smørgrav  * @param rd: if true, listens for reading.
575b7579f77SDag-Erling Smørgrav  * @param wr: if true, listens for writing.
576b7579f77SDag-Erling Smørgrav  */
577b7579f77SDag-Erling Smørgrav void comm_point_listen_for_rw(struct comm_point* c, int rd, int wr);
578b7579f77SDag-Erling Smørgrav 
579b7579f77SDag-Erling Smørgrav /**
580b7579f77SDag-Erling Smørgrav  * Get size of memory used by comm point.
581b7579f77SDag-Erling Smørgrav  * For TCP handlers this includes subhandlers.
582b7579f77SDag-Erling Smørgrav  * For UDP handlers, this does not include the (shared) UDP buffer.
583b7579f77SDag-Erling Smørgrav  * @param c: commpoint.
584b7579f77SDag-Erling Smørgrav  * @return size in bytes.
585b7579f77SDag-Erling Smørgrav  */
586b7579f77SDag-Erling Smørgrav size_t comm_point_get_mem(struct comm_point* c);
587b7579f77SDag-Erling Smørgrav 
588b7579f77SDag-Erling Smørgrav /**
589b7579f77SDag-Erling Smørgrav  * create timer. Not active upon creation.
590b7579f77SDag-Erling Smørgrav  * @param base: event handling base.
591b7579f77SDag-Erling Smørgrav  * @param cb: callback function: void myfunc(void* myarg);
592b7579f77SDag-Erling Smørgrav  * @param cb_arg: user callback argument.
593b7579f77SDag-Erling Smørgrav  * @return: the new timer or NULL on error.
594b7579f77SDag-Erling Smørgrav  */
595b7579f77SDag-Erling Smørgrav struct comm_timer* comm_timer_create(struct comm_base* base,
596b7579f77SDag-Erling Smørgrav 	void (*cb)(void*), void* cb_arg);
597b7579f77SDag-Erling Smørgrav 
598b7579f77SDag-Erling Smørgrav /**
599b7579f77SDag-Erling Smørgrav  * disable timer. Stops callbacks from happening.
600b7579f77SDag-Erling Smørgrav  * @param timer: to disable.
601b7579f77SDag-Erling Smørgrav  */
602b7579f77SDag-Erling Smørgrav void comm_timer_disable(struct comm_timer* timer);
603b7579f77SDag-Erling Smørgrav 
604b7579f77SDag-Erling Smørgrav /**
605b7579f77SDag-Erling Smørgrav  * reset timevalue for timer.
606b7579f77SDag-Erling Smørgrav  * @param timer: timer to (re)set.
607b7579f77SDag-Erling Smørgrav  * @param tv: when the timer should activate. if NULL timer is disabled.
608b7579f77SDag-Erling Smørgrav  */
609b7579f77SDag-Erling Smørgrav void comm_timer_set(struct comm_timer* timer, struct timeval* tv);
610b7579f77SDag-Erling Smørgrav 
611b7579f77SDag-Erling Smørgrav /**
612b7579f77SDag-Erling Smørgrav  * delete timer.
613b7579f77SDag-Erling Smørgrav  * @param timer: to delete.
614b7579f77SDag-Erling Smørgrav  */
615b7579f77SDag-Erling Smørgrav void comm_timer_delete(struct comm_timer* timer);
616b7579f77SDag-Erling Smørgrav 
617b7579f77SDag-Erling Smørgrav /**
618b7579f77SDag-Erling Smørgrav  * see if timeout has been set to a value.
619b7579f77SDag-Erling Smørgrav  * @param timer: the timer to examine.
620b7579f77SDag-Erling Smørgrav  * @return: false if disabled or not set.
621b7579f77SDag-Erling Smørgrav  */
622b7579f77SDag-Erling Smørgrav int comm_timer_is_set(struct comm_timer* timer);
623b7579f77SDag-Erling Smørgrav 
624b7579f77SDag-Erling Smørgrav /**
625b7579f77SDag-Erling Smørgrav  * Get size of memory used by comm timer.
626b7579f77SDag-Erling Smørgrav  * @param timer: the timer to examine.
627b7579f77SDag-Erling Smørgrav  * @return size in bytes.
628b7579f77SDag-Erling Smørgrav  */
629b7579f77SDag-Erling Smørgrav size_t comm_timer_get_mem(struct comm_timer* timer);
630b7579f77SDag-Erling Smørgrav 
631b7579f77SDag-Erling Smørgrav /**
632b7579f77SDag-Erling Smørgrav  * Create a signal handler. Call signal_bind() later to bind to a signal.
633b7579f77SDag-Erling Smørgrav  * @param base: communication base to use.
634b7579f77SDag-Erling Smørgrav  * @param callback: called when signal is caught.
635b7579f77SDag-Erling Smørgrav  * @param cb_arg: user argument to callback
636b7579f77SDag-Erling Smørgrav  * @return: the signal struct or NULL on error.
637b7579f77SDag-Erling Smørgrav  */
638b7579f77SDag-Erling Smørgrav struct comm_signal* comm_signal_create(struct comm_base* base,
639b7579f77SDag-Erling Smørgrav 	void (*callback)(int, void*), void* cb_arg);
640b7579f77SDag-Erling Smørgrav 
641b7579f77SDag-Erling Smørgrav /**
642b7579f77SDag-Erling Smørgrav  * Bind signal struct to catch a signal. A signle comm_signal can be bound
643b7579f77SDag-Erling Smørgrav  * to multiple signals, calling comm_signal_bind multiple times.
644b7579f77SDag-Erling Smørgrav  * @param comsig: the communication point, with callback information.
645b7579f77SDag-Erling Smørgrav  * @param sig: signal number.
646b7579f77SDag-Erling Smørgrav  * @return: true on success. false on error.
647b7579f77SDag-Erling Smørgrav  */
648b7579f77SDag-Erling Smørgrav int comm_signal_bind(struct comm_signal* comsig, int sig);
649b7579f77SDag-Erling Smørgrav 
650b7579f77SDag-Erling Smørgrav /**
651b7579f77SDag-Erling Smørgrav  * Delete the signal communication point.
652b7579f77SDag-Erling Smørgrav  * @param comsig: to delete.
653b7579f77SDag-Erling Smørgrav  */
654b7579f77SDag-Erling Smørgrav void comm_signal_delete(struct comm_signal* comsig);
655b7579f77SDag-Erling Smørgrav 
656b7579f77SDag-Erling Smørgrav /**
657b7579f77SDag-Erling Smørgrav  * perform accept(2) with error checking.
658b7579f77SDag-Erling Smørgrav  * @param c: commpoint with accept fd.
659b7579f77SDag-Erling Smørgrav  * @param addr: remote end returned here.
660b7579f77SDag-Erling Smørgrav  * @param addrlen: length of remote end returned here.
661b7579f77SDag-Erling Smørgrav  * @return new fd, or -1 on error.
662b7579f77SDag-Erling Smørgrav  *	if -1, error message has been printed if necessary, simply drop
663b7579f77SDag-Erling Smørgrav  *	out of the reading handler.
664b7579f77SDag-Erling Smørgrav  */
665b7579f77SDag-Erling Smørgrav int comm_point_perform_accept(struct comm_point* c,
666b7579f77SDag-Erling Smørgrav 	struct sockaddr_storage* addr, socklen_t* addrlen);
667b7579f77SDag-Erling Smørgrav 
668b7579f77SDag-Erling Smørgrav /**** internal routines ****/
669b7579f77SDag-Erling Smørgrav 
670b7579f77SDag-Erling Smørgrav /**
671b7579f77SDag-Erling Smørgrav  * This routine is published for checks and tests, and is only used internally.
672b7579f77SDag-Erling Smørgrav  * handle libevent callback for udp comm point.
673b7579f77SDag-Erling Smørgrav  * @param fd: file descriptor.
674b7579f77SDag-Erling Smørgrav  * @param event: event bits from libevent:
675b7579f77SDag-Erling Smørgrav  *	EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT.
676b7579f77SDag-Erling Smørgrav  * @param arg: the comm_point structure.
677b7579f77SDag-Erling Smørgrav  */
678b7579f77SDag-Erling Smørgrav void comm_point_udp_callback(int fd, short event, void* arg);
679b7579f77SDag-Erling Smørgrav 
680b7579f77SDag-Erling Smørgrav /**
681b7579f77SDag-Erling Smørgrav  * This routine is published for checks and tests, and is only used internally.
682b7579f77SDag-Erling Smørgrav  * handle libevent callback for udp ancillary data comm point.
683b7579f77SDag-Erling Smørgrav  * @param fd: file descriptor.
684b7579f77SDag-Erling Smørgrav  * @param event: event bits from libevent:
685b7579f77SDag-Erling Smørgrav  *	EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT.
686b7579f77SDag-Erling Smørgrav  * @param arg: the comm_point structure.
687b7579f77SDag-Erling Smørgrav  */
688b7579f77SDag-Erling Smørgrav void comm_point_udp_ancil_callback(int fd, short event, void* arg);
689b7579f77SDag-Erling Smørgrav 
690b7579f77SDag-Erling Smørgrav /**
691b7579f77SDag-Erling Smørgrav  * This routine is published for checks and tests, and is only used internally.
692b7579f77SDag-Erling Smørgrav  * handle libevent callback for tcp accept comm point
693b7579f77SDag-Erling Smørgrav  * @param fd: file descriptor.
694b7579f77SDag-Erling Smørgrav  * @param event: event bits from libevent:
695b7579f77SDag-Erling Smørgrav  *	EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT.
696b7579f77SDag-Erling Smørgrav  * @param arg: the comm_point structure.
697b7579f77SDag-Erling Smørgrav  */
698b7579f77SDag-Erling Smørgrav void comm_point_tcp_accept_callback(int fd, short event, void* arg);
699b7579f77SDag-Erling Smørgrav 
700b7579f77SDag-Erling Smørgrav /**
701b7579f77SDag-Erling Smørgrav  * This routine is published for checks and tests, and is only used internally.
702b7579f77SDag-Erling Smørgrav  * handle libevent callback for tcp data comm point
703b7579f77SDag-Erling Smørgrav  * @param fd: file descriptor.
704b7579f77SDag-Erling Smørgrav  * @param event: event bits from libevent:
705b7579f77SDag-Erling Smørgrav  *	EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT.
706b7579f77SDag-Erling Smørgrav  * @param arg: the comm_point structure.
707b7579f77SDag-Erling Smørgrav  */
708b7579f77SDag-Erling Smørgrav void comm_point_tcp_handle_callback(int fd, short event, void* arg);
709b7579f77SDag-Erling Smørgrav 
710b7579f77SDag-Erling Smørgrav /**
711b7579f77SDag-Erling Smørgrav  * This routine is published for checks and tests, and is only used internally.
71257bddd21SDag-Erling Smørgrav  * handle libevent callback for tcp data comm point
71357bddd21SDag-Erling Smørgrav  * @param fd: file descriptor.
71457bddd21SDag-Erling Smørgrav  * @param event: event bits from libevent:
71557bddd21SDag-Erling Smørgrav  *	EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT.
71657bddd21SDag-Erling Smørgrav  * @param arg: the comm_point structure.
71757bddd21SDag-Erling Smørgrav  */
71857bddd21SDag-Erling Smørgrav void comm_point_http_handle_callback(int fd, short event, void* arg);
71957bddd21SDag-Erling Smørgrav 
72057bddd21SDag-Erling Smørgrav /**
72157bddd21SDag-Erling Smørgrav  * This routine is published for checks and tests, and is only used internally.
722b7579f77SDag-Erling Smørgrav  * handle libevent callback for timer comm.
723b7579f77SDag-Erling Smørgrav  * @param fd: file descriptor (always -1).
724b7579f77SDag-Erling Smørgrav  * @param event: event bits from libevent:
725b7579f77SDag-Erling Smørgrav  *	EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT.
726b7579f77SDag-Erling Smørgrav  * @param arg: the comm_timer structure.
727b7579f77SDag-Erling Smørgrav  */
728b7579f77SDag-Erling Smørgrav void comm_timer_callback(int fd, short event, void* arg);
729b7579f77SDag-Erling Smørgrav 
730b7579f77SDag-Erling Smørgrav /**
731b7579f77SDag-Erling Smørgrav  * This routine is published for checks and tests, and is only used internally.
732b7579f77SDag-Erling Smørgrav  * handle libevent callback for signal comm.
733b7579f77SDag-Erling Smørgrav  * @param fd: file descriptor (used for the signal number).
734b7579f77SDag-Erling Smørgrav  * @param event: event bits from libevent:
735b7579f77SDag-Erling Smørgrav  *	EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT.
736b7579f77SDag-Erling Smørgrav  * @param arg: the internal commsignal structure.
737b7579f77SDag-Erling Smørgrav  */
738b7579f77SDag-Erling Smørgrav void comm_signal_callback(int fd, short event, void* arg);
739b7579f77SDag-Erling Smørgrav 
740b7579f77SDag-Erling Smørgrav /**
741b7579f77SDag-Erling Smørgrav  * This routine is published for checks and tests, and is only used internally.
742b7579f77SDag-Erling Smørgrav  * libevent callback for AF_UNIX fds
743b7579f77SDag-Erling Smørgrav  * @param fd: file descriptor.
744b7579f77SDag-Erling Smørgrav  * @param event: event bits from libevent:
745b7579f77SDag-Erling Smørgrav  *	EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT.
746b7579f77SDag-Erling Smørgrav  * @param arg: the comm_point structure.
747b7579f77SDag-Erling Smørgrav  */
748b7579f77SDag-Erling Smørgrav void comm_point_local_handle_callback(int fd, short event, void* arg);
749b7579f77SDag-Erling Smørgrav 
750b7579f77SDag-Erling Smørgrav /**
751b7579f77SDag-Erling Smørgrav  * This routine is published for checks and tests, and is only used internally.
752b7579f77SDag-Erling Smørgrav  * libevent callback for raw fd access.
753b7579f77SDag-Erling Smørgrav  * @param fd: file descriptor.
754b7579f77SDag-Erling Smørgrav  * @param event: event bits from libevent:
755b7579f77SDag-Erling Smørgrav  *	EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT.
756b7579f77SDag-Erling Smørgrav  * @param arg: the comm_point structure.
757b7579f77SDag-Erling Smørgrav  */
758b7579f77SDag-Erling Smørgrav void comm_point_raw_handle_callback(int fd, short event, void* arg);
759b7579f77SDag-Erling Smørgrav 
760b7579f77SDag-Erling Smørgrav /**
761b7579f77SDag-Erling Smørgrav  * This routine is published for checks and tests, and is only used internally.
762b7579f77SDag-Erling Smørgrav  * libevent callback for timeout on slow accept.
763b7579f77SDag-Erling Smørgrav  * @param fd: file descriptor.
764b7579f77SDag-Erling Smørgrav  * @param event: event bits from libevent:
765b7579f77SDag-Erling Smørgrav  *	EV_READ, EV_WRITE, EV_SIGNAL, EV_TIMEOUT.
766b7579f77SDag-Erling Smørgrav  * @param arg: the comm_point structure.
767b7579f77SDag-Erling Smørgrav  */
768b7579f77SDag-Erling Smørgrav void comm_base_handle_slow_accept(int fd, short event, void* arg);
769b7579f77SDag-Erling Smørgrav 
770b7579f77SDag-Erling Smørgrav #ifdef USE_WINSOCK
771b7579f77SDag-Erling Smørgrav /**
772b7579f77SDag-Erling Smørgrav  * Callback for openssl BIO to on windows detect WSAEWOULDBLOCK and notify
773b7579f77SDag-Erling Smørgrav  * the winsock_event of this for proper TCP nonblocking implementation.
774b7579f77SDag-Erling Smørgrav  * @param c: comm_point, fd must be set its struct event is registered.
775b7579f77SDag-Erling Smørgrav  * @param ssl: openssl SSL, fd must be set so it has a bio.
776b7579f77SDag-Erling Smørgrav  */
777b7579f77SDag-Erling Smørgrav void comm_point_tcp_win_bio_cb(struct comm_point* c, void* ssl);
778b7579f77SDag-Erling Smørgrav #endif
779b7579f77SDag-Erling Smørgrav 
780b7579f77SDag-Erling Smørgrav /** see if errno for tcp connect has to be logged or not. This uses errno */
781b7579f77SDag-Erling Smørgrav int tcp_connect_errno_needs_log(struct sockaddr* addr, socklen_t addrlen);
782b7579f77SDag-Erling Smørgrav 
783b7579f77SDag-Erling Smørgrav #endif /* NET_EVENT_H */
784