xref: /openbsd/lib/libevent/event.h (revision 404b540a)
1 /*	$OpenBSD: event.h,v 1.20 2008/05/02 18:26:42 brad Exp $	*/
2 
3 /*
4  * Copyright (c) 2000-2004 Niels Provos <provos@citi.umich.edu>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. The name of the author may not be used to endorse or promote products
16  *    derived from this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29 #ifndef _EVENT_H_
30 #define _EVENT_H_
31 
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35 
36 #include <sys/time.h>
37 #include <stdint.h>
38 #include <stdarg.h>
39 
40 #ifdef WIN32
41 #define WIN32_LEAN_AND_MEAN
42 #include <windows.h>
43 #undef WIN32_LEAN_AND_MEAN
44 typedef unsigned char u_char;
45 typedef unsigned short u_short;
46 #endif
47 
48 #define LIBEVENT_VERSION	"1.3e"
49 
50 #define EVLIST_TIMEOUT	0x01
51 #define EVLIST_INSERTED	0x02
52 #define EVLIST_SIGNAL	0x04
53 #define EVLIST_ACTIVE	0x08
54 #define EVLIST_INTERNAL	0x10
55 #define EVLIST_INIT	0x80
56 
57 /* EVLIST_X_ Private space: 0x1000-0xf000 */
58 #define EVLIST_ALL	(0xf000 | 0x9f)
59 
60 #define EV_TIMEOUT	0x01
61 #define EV_READ		0x02
62 #define EV_WRITE	0x04
63 #define EV_SIGNAL	0x08
64 #define EV_PERSIST	0x10	/* Persistant event */
65 
66 /* Fix so that ppl dont have to run with <sys/queue.h> */
67 #ifndef TAILQ_ENTRY
68 #define _EVENT_DEFINED_TQENTRY
69 #define TAILQ_ENTRY(type)						\
70 struct {								\
71 	struct type *tqe_next;	/* next element */			\
72 	struct type **tqe_prev;	/* address of previous next element */	\
73 }
74 #endif /* !TAILQ_ENTRY */
75 #ifndef RB_ENTRY
76 #define _EVENT_DEFINED_RBENTRY
77 #define RB_ENTRY(type)							\
78 struct {								\
79 	struct type *rbe_left;		/* left element */		\
80 	struct type *rbe_right;		/* right element */		\
81 	struct type *rbe_parent;	/* parent element */		\
82 	int rbe_color;			/* node color */		\
83 }
84 #endif /* !RB_ENTRY */
85 
86 struct event_base;
87 struct event {
88 	TAILQ_ENTRY (event) ev_next;
89 	TAILQ_ENTRY (event) ev_active_next;
90 	TAILQ_ENTRY (event) ev_signal_next;
91 	RB_ENTRY (event) ev_timeout_node;
92 
93 	struct event_base *ev_base;
94 	int ev_fd;
95 	short ev_events;
96 	short ev_ncalls;
97 	short *ev_pncalls;	/* Allows deletes in callback */
98 
99 	struct timeval ev_timeout;
100 
101 	int ev_pri;		/* smaller numbers are higher priority */
102 
103 	void (*ev_callback)(int, short, void *arg);
104 	void *ev_arg;
105 
106 	int ev_res;		/* result passed to event callback */
107 	int ev_flags;
108 };
109 
110 #define EVENT_SIGNAL(ev)	(int)(ev)->ev_fd
111 #define EVENT_FD(ev)		(int)(ev)->ev_fd
112 
113 /*
114  * Key-Value pairs.  Can be used for HTTP headers but also for
115  * query argument parsing.
116  */
117 struct evkeyval {
118 	TAILQ_ENTRY(evkeyval) next;
119 
120 	char *key;
121 	char *value;
122 };
123 
124 #ifdef _EVENT_DEFINED_TQENTRY
125 #undef TAILQ_ENTRY
126 struct event_list;
127 struct evkeyvalq;
128 #undef _EVENT_DEFINED_TQENTRY
129 #else
130 TAILQ_HEAD (event_list, event);
131 TAILQ_HEAD (evkeyvalq, evkeyval);
132 #endif /* _EVENT_DEFINED_TQENTRY */
133 #ifdef _EVENT_DEFINED_RBENTRY
134 #undef RB_ENTRY
135 #undef _EVENT_DEFINED_RBENTRY
136 #endif /* _EVENT_DEFINED_RBENTRY */
137 
138 struct eventop {
139 	char *name;
140 	void *(*init)(struct event_base *);
141 	int (*add)(void *, struct event *);
142 	int (*del)(void *, struct event *);
143 	int (*recalc)(struct event_base *, void *, int);
144 	int (*dispatch)(struct event_base *, void *, struct timeval *);
145 	void (*dealloc)(struct event_base *, void *);
146 };
147 
148 struct event_base *event_init(void);
149 int event_dispatch(void);
150 int event_base_dispatch(struct event_base *);
151 void event_base_free(struct event_base *);
152 
153 #define _EVENT_LOG_DEBUG 0
154 #define _EVENT_LOG_MSG   1
155 #define _EVENT_LOG_WARN  2
156 #define _EVENT_LOG_ERR   3
157 typedef void (*event_log_cb)(int severity, const char *msg);
158 void event_set_log_callback(event_log_cb cb);
159 
160 /* Associate a different event base with an event */
161 int event_base_set(struct event_base *, struct event *);
162 
163 #define EVLOOP_ONCE	0x01
164 #define EVLOOP_NONBLOCK	0x02
165 int event_loop(int);
166 int event_base_loop(struct event_base *, int);
167 int event_loopexit(struct timeval *);	/* Causes the loop to exit */
168 int event_base_loopexit(struct event_base *, struct timeval *);
169 
170 #define evtimer_add(ev, tv)		event_add(ev, tv)
171 #define evtimer_set(ev, cb, arg)	event_set(ev, -1, 0, cb, arg)
172 #define evtimer_del(ev)			event_del(ev)
173 #define evtimer_pending(ev, tv)		event_pending(ev, EV_TIMEOUT, tv)
174 #define evtimer_initialized(ev)		((ev)->ev_flags & EVLIST_INIT)
175 
176 #define signal_add(ev, tv)		event_add(ev, tv)
177 #define signal_set(ev, x, cb, arg)	\
178 	event_set(ev, x, EV_SIGNAL|EV_PERSIST, cb, arg)
179 #define signal_del(ev)			event_del(ev)
180 #define signal_pending(ev, tv)		event_pending(ev, EV_SIGNAL, tv)
181 #define signal_initialized(ev)		((ev)->ev_flags & EVLIST_INIT)
182 
183 void event_set(struct event *, int, short, void (*)(int, short, void *), void *);
184 int event_once(int, short, void (*)(int, short, void *), void *, struct timeval *);
185 int event_base_once(struct event_base *, int, short, void (*)(int, short, void *), void *, struct timeval *);
186 
187 int event_add(struct event *, struct timeval *);
188 int event_del(struct event *);
189 void event_active(struct event *, int, short);
190 
191 int event_pending(struct event *, short, struct timeval *);
192 
193 #ifdef WIN32
194 #define event_initialized(ev)		((ev)->ev_flags & EVLIST_INIT && (ev)->ev_fd != (int)INVALID_HANDLE_VALUE)
195 #else
196 #define event_initialized(ev)		((ev)->ev_flags & EVLIST_INIT)
197 #endif
198 
199 /* Some simple debugging functions */
200 const char *event_get_version(void);
201 const char *event_get_method(void);
202 
203 /* These functions deal with event priorities */
204 
205 int	event_priority_init(int);
206 int	event_base_priority_init(struct event_base *, int);
207 int	event_priority_set(struct event *, int);
208 
209 /* These functions deal with buffering input and output */
210 
211 struct evbuffer {
212 	u_char *buffer;
213 	u_char *orig_buffer;
214 
215 	size_t misalign;
216 	size_t totallen;
217 	size_t off;
218 
219 	void (*cb)(struct evbuffer *, size_t, size_t, void *);
220 	void *cbarg;
221 };
222 
223 /* Just for error reporting - use other constants otherwise */
224 #define EVBUFFER_READ		0x01
225 #define EVBUFFER_WRITE		0x02
226 #define EVBUFFER_EOF		0x10
227 #define EVBUFFER_ERROR		0x20
228 #define EVBUFFER_TIMEOUT	0x40
229 
230 struct bufferevent;
231 typedef void (*evbuffercb)(struct bufferevent *, void *);
232 typedef void (*everrorcb)(struct bufferevent *, short what, void *);
233 
234 struct event_watermark {
235 	size_t low;
236 	size_t high;
237 };
238 
239 struct bufferevent {
240 	struct event ev_read;
241 	struct event ev_write;
242 
243 	struct evbuffer *input;
244 	struct evbuffer *output;
245 
246 	struct event_watermark wm_read;
247 	struct event_watermark wm_write;
248 
249 	evbuffercb readcb;
250 	evbuffercb writecb;
251 	everrorcb errorcb;
252 	void *cbarg;
253 
254 	int timeout_read;	/* in seconds */
255 	int timeout_write;	/* in seconds */
256 
257 	short enabled;	/* events that are currently enabled */
258 };
259 
260 struct bufferevent *bufferevent_new(int fd,
261     evbuffercb readcb, evbuffercb writecb, everrorcb errorcb, void *cbarg);
262 int bufferevent_base_set(struct event_base *base, struct bufferevent *bufev);
263 int bufferevent_priority_set(struct bufferevent *bufev, int pri);
264 void bufferevent_free(struct bufferevent *bufev);
265 int bufferevent_write(struct bufferevent *bufev,
266     const void *data, size_t size);
267 int bufferevent_write_buffer(struct bufferevent *bufev, struct evbuffer *buf);
268 size_t bufferevent_read(struct bufferevent *bufev, void *data, size_t size);
269 int bufferevent_enable(struct bufferevent *bufev, short event);
270 int bufferevent_disable(struct bufferevent *bufev, short event);
271 void bufferevent_settimeout(struct bufferevent *bufev,
272     int timeout_read, int timeout_write);
273 
274 #define EVBUFFER_LENGTH(x)	(x)->off
275 #define EVBUFFER_DATA(x)	(x)->buffer
276 #define EVBUFFER_INPUT(x)	(x)->input
277 #define EVBUFFER_OUTPUT(x)	(x)->output
278 
279 struct evbuffer *evbuffer_new(void);
280 void evbuffer_free(struct evbuffer *);
281 int evbuffer_expand(struct evbuffer *, size_t);
282 int evbuffer_add(struct evbuffer *, const void *, size_t);
283 int evbuffer_remove(struct evbuffer *, void *, size_t);
284 char *evbuffer_readline(struct evbuffer *);
285 int evbuffer_add_buffer(struct evbuffer *, struct evbuffer *);
286 int evbuffer_add_printf(struct evbuffer *, const char *fmt, ...);
287 int evbuffer_add_vprintf(struct evbuffer *, const char *fmt, va_list ap);
288 void evbuffer_drain(struct evbuffer *, size_t);
289 int evbuffer_write(struct evbuffer *, int);
290 int evbuffer_read(struct evbuffer *, int, int);
291 u_char *evbuffer_find(struct evbuffer *, const u_char *, size_t);
292 void evbuffer_setcb(struct evbuffer *, void (*)(struct evbuffer *, size_t, size_t, void *), void *);
293 
294 /*
295  * Marshaling tagged data - We assume that all tags are inserted in their
296  * numeric order - so that unknown tags will always be higher than the
297  * known ones - and we can just ignore the end of an event buffer.
298  */
299 
300 void evtag_init(void);
301 
302 void evtag_marshal(struct evbuffer *evbuf, uint8_t tag, const void *data,
303     uint32_t len);
304 
305 void encode_int(struct evbuffer *evbuf, uint32_t number);
306 
307 void evtag_marshal_int(struct evbuffer *evbuf, uint8_t tag, uint32_t integer);
308 
309 void evtag_marshal_string(struct evbuffer *buf, uint8_t tag,
310     const char *string);
311 
312 void evtag_marshal_timeval(struct evbuffer *evbuf, uint8_t tag,
313     struct timeval *tv);
314 
315 void evtag_test(void);
316 
317 int evtag_unmarshal(struct evbuffer *src, uint8_t *ptag, struct evbuffer *dst);
318 int evtag_peek(struct evbuffer *evbuf, uint8_t *ptag);
319 int evtag_peek_length(struct evbuffer *evbuf, uint32_t *plength);
320 int evtag_payload_length(struct evbuffer *evbuf, uint32_t *plength);
321 int evtag_consume(struct evbuffer *evbuf);
322 
323 int evtag_unmarshal_int(struct evbuffer *evbuf, uint8_t need_tag,
324     uint32_t *pinteger);
325 
326 int evtag_unmarshal_fixed(struct evbuffer *src, uint8_t need_tag, void *data,
327     size_t len);
328 
329 int evtag_unmarshal_string(struct evbuffer *evbuf, uint8_t need_tag,
330     char **pstring);
331 
332 int evtag_unmarshal_timeval(struct evbuffer *evbuf, uint8_t need_tag,
333     struct timeval *ptv);
334 
335 #ifdef __cplusplus
336 }
337 #endif
338 
339 #endif /* _EVENT_H_ */
340