1.\"	$OpenBSD: event.3,v 1.4 2002/07/12 18:50:48 provos Exp $
2.\"
3.\" Copyright (c) 2000 Artur Grabowski <art@openbsd.org>
4.\" All rights reserved.
5.\"
6.\" Redistribution and use in source and binary forms, with or without
7.\" modification, are permitted provided that the following conditions
8.\" are met:
9.\"
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 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
19.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
20.\" AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21.\" THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22.\" EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23.\" PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
24.\" OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25.\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
27.\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28.\"
29.Dd August 8, 2000
30.Dt EVENT 3
31.Os
32.Sh NAME
33.Nm event_init ,
34.Nm event_dispatch ,
35.Nm event_loop ,
36.Nm event_loopexit ,
37.Nm event_loopbreak ,
38.Nm event_set ,
39.Nm event_base_dispatch ,
40.Nm event_base_loop ,
41.Nm event_base_loopexit ,
42.Nm event_base_loopbreak ,
43.Nm event_base_set ,
44.Nm event_base_free ,
45.Nm event_add ,
46.Nm event_del ,
47.Nm event_once ,
48.Nm event_base_once ,
49.Nm event_pending ,
50.Nm event_initialized ,
51.Nm event_priority_init ,
52.Nm event_priority_set ,
53.Nm evtimer_set ,
54.Nm evtimer_add ,
55.Nm evtimer_del ,
56.Nm evtimer_pending ,
57.Nm evtimer_initialized ,
58.Nm signal_set ,
59.Nm signal_add ,
60.Nm signal_del ,
61.Nm signal_pending ,
62.Nm signal_initialized ,
63.Nm bufferevent_new ,
64.Nm bufferevent_free ,
65.Nm bufferevent_write ,
66.Nm bufferevent_write_buffer ,
67.Nm bufferevent_read ,
68.Nm bufferevent_enable ,
69.Nm bufferevent_disable ,
70.Nm bufferevent_settimeout ,
71.Nm bufferevent_base_set ,
72.Nm evbuffer_new ,
73.Nm evbuffer_free ,
74.Nm evbuffer_add ,
75.Nm evbuffer_add_buffer ,
76.Nm evbuffer_add_printf ,
77.Nm evbuffer_add_vprintf ,
78.Nm evbuffer_drain ,
79.Nm evbuffer_write ,
80.Nm evbuffer_read ,
81.Nm evbuffer_find ,
82.Nm evbuffer_readline ,
83.Nm evhttp_new ,
84.Nm evhttp_bind_socket ,
85.Nm evhttp_free
86.Nd execute a function when a specific event occurs
87.Sh SYNOPSIS
88.Fd #include <sys/time.h>
89.Fd #include <event.h>
90.Ft "struct event_base *"
91.Fn "event_init" "void"
92.Ft int
93.Fn "event_dispatch" "void"
94.Ft int
95.Fn "event_loop" "int flags"
96.Ft int
97.Fn "event_loopexit" "struct timeval *tv"
98.Ft int
99.Fn "event_loopbreak" "void"
100.Ft void
101.Fn "event_set" "struct event *ev" "int fd" "short event" "void (*fn)(int, short, void *)" "void *arg"
102.Ft int
103.Fn "event_base_dispatch" "struct event_base *base"
104.Ft int
105.Fn "event_base_loop" "struct event_base *base" "int flags"
106.Ft int
107.Fn "event_base_loopexit" "struct event_base *base" "struct timeval *tv"
108.Ft int
109.Fn "event_base_loopbreak" "struct event_base *base"
110.Ft int
111.Fn "event_base_set" "struct event_base *base" "struct event *"
112.Ft void
113.Fn "event_base_free" "struct event_base *base"
114.Ft int
115.Fn "event_add" "struct event *ev" "struct timeval *tv"
116.Ft int
117.Fn "event_del" "struct event *ev"
118.Ft int
119.Fn "event_once" "int fd" "short event" "void (*fn)(int, short, void *)" "void *arg" "struct timeval *tv"
120.Ft int
121.Fn "event_base_once" "struct event_base *base" "int fd" "short event" "void (*fn)(int, short, void *)" "void *arg" "struct timeval *tv"
122.Ft int
123.Fn "event_pending" "struct event *ev" "short event" "struct timeval *tv"
124.Ft int
125.Fn "event_initialized" "struct event *ev"
126.Ft int
127.Fn "event_priority_init" "int npriorities"
128.Ft int
129.Fn "event_priority_set" "struct event *ev" "int priority"
130.Ft void
131.Fn "evtimer_set" "struct event *ev" "void (*fn)(int, short, void *)" "void *arg"
132.Ft void
133.Fn "evtimer_add" "struct event *ev" "struct timeval *"
134.Ft void
135.Fn "evtimer_del" "struct event *ev"
136.Ft int
137.Fn "evtimer_pending" "struct event *ev" "struct timeval *tv"
138.Ft int
139.Fn "evtimer_initialized" "struct event *ev"
140.Ft void
141.Fn "signal_set" "struct event *ev" "int signal" "void (*fn)(int, short, void *)" "void *arg"
142.Ft void
143.Fn "signal_add" "struct event *ev" "struct timeval *"
144.Ft void
145.Fn "signal_del" "struct event *ev"
146.Ft int
147.Fn "signal_pending" "struct event *ev" "struct timeval *tv"
148.Ft int
149.Fn "signal_initialized" "struct event *ev"
150.Ft "struct bufferevent *"
151.Fn "bufferevent_new" "int fd" "evbuffercb readcb" "evbuffercb writecb" "everrorcb" "void *cbarg"
152.Ft void
153.Fn "bufferevent_free" "struct bufferevent *bufev"
154.Ft int
155.Fn "bufferevent_write" "struct bufferevent *bufev" "void *data" "size_t size"
156.Ft int
157.Fn "bufferevent_write_buffer" "struct bufferevent *bufev" "struct evbuffer *buf"
158.Ft size_t
159.Fn "bufferevent_read" "struct bufferevent *bufev" "void *data" "size_t size"
160.Ft int
161.Fn "bufferevent_enable" "struct bufferevent *bufev" "short event"
162.Ft int
163.Fn "bufferevent_disable" "struct bufferevent *bufev" "short event"
164.Ft void
165.Fn "bufferevent_settimeout" "struct bufferevent *bufev" "int timeout_read" "int timeout_write"
166.Ft int
167.Fn "bufferevent_base_set" "struct event_base *base" "struct bufferevent *bufev"
168.Ft "struct evbuffer *"
169.Fn "evbuffer_new" "void"
170.Ft void
171.Fn "evbuffer_free" "struct evbuffer *buf"
172.Ft int
173.Fn "evbuffer_add" "struct evbuffer *buf" "const void *data" "size_t size"
174.Ft int
175.Fn "evbuffer_add_buffer" "struct evbuffer *dst" "struct evbuffer *src"
176.Ft int
177.Fn "evbuffer_add_printf" "struct evbuffer *buf" "const char *fmt" "..."
178.Ft int
179.Fn "evbuffer_add_vprintf" "struct evbuffer *buf" "const char *fmt" "va_list ap"
180.Ft void
181.Fn "evbuffer_drain" "struct evbuffer *buf" "size_t size"
182.Ft int
183.Fn "evbuffer_write" "struct evbuffer *buf" "int fd"
184.Ft int
185.Fn "evbuffer_read" "struct evbuffer *buf" "int fd" "int size"
186.Ft "unsigned char *"
187.Fn "evbuffer_find" "struct evbuffer *buf" "const unsigned char *data" "size_t size"
188.Ft "char *"
189.Fn "evbuffer_readline" "struct evbuffer *buf"
190.Ft "struct evhttp *"
191.Fn "evhttp_new" "struct event_base *base"
192.Ft int
193.Fn "evhttp_bind_socket" "struct evhttp *http" "const char *address" "unsigned short port"
194.Ft "void"
195.Fn "evhttp_free" "struct evhttp *http"
196.Ft int
197.Fa (*event_sigcb)(void) ;
198.Ft volatile sig_atomic_t
199.Fa event_gotsig ;
200.Sh DESCRIPTION
201The
202.Nm event
203API provides a mechanism to execute a function when a specific event
204on a file descriptor occurs or after a given time has passed.
205.Pp
206The
207.Nm event
208API needs to be initialized with
209.Fn event_init
210before it can be used.
211.Pp
212In order to process events, an application needs to call
213.Fn event_dispatch .
214This function only returns on error, and should replace the event core
215of the application program.
216.Pp
217The function
218.Fn event_set
219prepares the event structure
220.Fa ev
221to be used in future calls to
222.Fn event_add
223and
224.Fn event_del .
225The event will be prepared to call the function specified by the
226.Fa fn
227argument with an
228.Fa int
229argument indicating the file descriptor, a
230.Fa short
231argument indicating the type of event, and a
232.Fa void *
233argument given in the
234.Fa arg
235argument.
236The
237.Fa fd
238indicates the file descriptor that should be monitored for events.
239The events can be either
240.Va EV_READ ,
241.Va EV_WRITE ,
242or both,
243indicating that an application can read or write from the file descriptor
244respectively without blocking.
245.Pp
246The function
247.Fa fn
248will be called with the file descriptor that triggered the event and
249the type of event which will be either
250.Va EV_TIMEOUT ,
251.Va EV_SIGNAL ,
252.Va EV_READ ,
253or
254.Va EV_WRITE .
255Additionally, an event which has registered interest in more than one of the
256preceeding events, via bitwise-OR to
257.Fn event_set ,
258can provide its callback function with a bitwise-OR of more than one triggered
259event.
260The additional flag
261.Va EV_PERSIST
262makes an
263.Fn event_add
264persistent until
265.Fn event_del
266has been called.
267.Pp
268Once initialized, the
269.Fa ev
270structure can be used repeatedly with
271.Fn event_add
272and
273.Fn event_del
274and does not need to be reinitialized unless the function called and/or
275the argument to it are to be changed.
276However, when an
277.Fa ev
278structure has been added to libevent using
279.Fn event_add
280the structure must persist until the event occurs (assuming
281.Fa EV_PERSIST
282is not set) or is removed
283using
284.Fn event_del .
285You may not reuse the same
286.Fa ev
287structure for multiple monitored descriptors; each descriptor
288needs its own
289.Fa ev .
290.Pp
291The function
292.Fn event_add
293schedules the execution of the
294.Fa ev
295event when the event specified in
296.Fn event_set
297occurs or in at least the time specified in the
298.Fa tv .
299If
300.Fa tv
301is
302.Dv NULL ,
303no timeout occurs and the function will only be called
304if a matching event occurs on the file descriptor.
305The event in the
306.Fa ev
307argument must be already initialized by
308.Fn event_set
309and may not be used in calls to
310.Fn event_set
311until it has timed out or been removed with
312.Fn event_del .
313If the event in the
314.Fa ev
315argument already has a scheduled timeout, the old timeout will be
316replaced by the new one.
317.Pp
318The function
319.Fn event_del
320will cancel the event in the argument
321.Fa ev .
322If the event has already executed or has never been added
323the call will have no effect.
324.Pp
325The functions
326.Fn evtimer_set ,
327.Fn evtimer_add ,
328.Fn evtimer_del ,
329.Fn evtimer_initialized ,
330and
331.Fn evtimer_pending
332are abbreviations for common situations where only a timeout is required.
333The file descriptor passed will be \-1, and the event type will be
334.Va EV_TIMEOUT .
335.Pp
336The functions
337.Fn signal_set ,
338.Fn signal_add ,
339.Fn signal_del ,
340.Fn signal_initialized ,
341and
342.Fn signal_pending
343are abbreviations.
344The event type will be a persistent
345.Va EV_SIGNAL .
346That means
347.Fn signal_set
348adds
349.Va EV_PERSIST .
350.Pp
351In order to avoid races in signal handlers, the
352.Nm event
353API provides two variables:
354.Va event_sigcb
355and
356.Va event_gotsig .
357A signal handler
358sets
359.Va event_gotsig
360to indicate that a signal has been received.
361The application sets
362.Va event_sigcb
363to a callback function.
364After the signal handler sets
365.Va event_gotsig ,
366.Nm event_dispatch
367will execute the callback function to process received signals.
368The callback returns 1 when no events are registered any more.
369It can return \-1 to indicate an error to the
370.Nm event
371library, causing
372.Fn event_dispatch
373to terminate with
374.Va errno
375set to
376.Er EINTR .
377.Pp
378The function
379.Fn event_once
380is similar to
381.Fn event_set .
382However, it schedules a callback to be called exactly once and does not
383require the caller to prepare an
384.Fa event
385structure.
386This function supports
387.Fa EV_TIMEOUT ,
388.Fa EV_READ ,
389and
390.Fa EV_WRITE .
391.Pp
392The
393.Fn event_pending
394function can be used to check if the event specified by
395.Fa event
396is pending to run.
397If
398.Va EV_TIMEOUT
399was specified and
400.Fa tv
401is not
402.Dv NULL ,
403the expiration time of the event will be returned in
404.Fa tv .
405.Pp
406The
407.Fn event_initialized
408macro can be used to check if an event has been initialized.
409.Pp
410The
411.Nm event_loop
412function provides an interface for single pass execution of pending
413events.
414The flags
415.Va EVLOOP_ONCE
416and
417.Va EVLOOP_NONBLOCK
418are recognized.
419The
420.Nm event_loopexit
421function exits from the event loop. The next
422.Fn event_loop
423iteration after the
424given timer expires will complete normally (handling all queued events) then
425exit without blocking for events again. Subsequent invocations of
426.Fn event_loop
427will proceed normally.
428The
429.Nm event_loopbreak
430function exits from the event loop immediately.
431.Fn event_loop
432will abort after the next event is completed;
433.Fn event_loopbreak
434is typically invoked from this event's callback. This behavior is analogous
435to the "break;" statement. Subsequent invocations of
436.Fn event_loop
437will proceed normally.
438.Pp
439It is the responsibility of the caller to provide these functions with
440pre-allocated event structures.
441.Pp
442.Sh EVENT PRIORITIES
443By default
444.Nm libevent
445schedules all active events with the same priority.
446However, sometimes it is desirable to process some events with a higher
447priority than others.
448For that reason,
449.Nm libevent
450supports strict priority queues.
451Active events with a lower priority are always processed before events
452with a higher priority.
453.Pp
454The number of different priorities can be set initially with the
455.Fn event_priority_init
456function.
457This function should be called before the first call to
458.Fn event_dispatch .
459The
460.Fn event_priority_set
461function can be used to assign a priority to an event.
462By default,
463.Nm libevent
464assigns the middle priority to all events unless their priority
465is explicitly set.
466.Sh THREAD SAFE EVENTS
467.Nm Libevent
468has experimental support for thread-safe events.
469When initializing the library via
470.Fn event_init ,
471an event base is returned.
472This event base can be used in conjunction with calls to
473.Fn event_base_set ,
474.Fn event_base_dispatch ,
475.Fn event_base_loop ,
476.Fn event_base_loopexit ,
477.Fn bufferevent_base_set
478and
479.Fn event_base_free .
480.Fn event_base_set
481should be called after preparing an event with
482.Fn event_set ,
483as
484.Fn event_set
485assigns the provided event to the most recently created event base.
486.Fn bufferevent_base_set
487should be called after preparing a bufferevent with
488.Fn bufferevent_new .
489.Fn event_base_free
490should be used to free memory associated with the event base
491when it is no longer needed.
492.Sh BUFFERED EVENTS
493.Nm libevent
494provides an abstraction on top of the regular event callbacks.
495This abstraction is called a
496.Va "buffered event" .
497A buffered event provides input and output buffers that get filled
498and drained automatically.
499The user of a buffered event no longer deals directly with the IO,
500but instead is reading from input and writing to output buffers.
501.Pp
502A new bufferevent is created by
503.Fn bufferevent_new .
504The parameter
505.Fa fd
506specifies the file descriptor from which data is read and written to.
507This file descriptor is not allowed to be a
508.Xr pipe 2 .
509The next three parameters are callbacks.
510The read and write callback have the following form:
511.Ft void
512.Fn "(*cb)" "struct bufferevent *bufev" "void *arg" .
513The error callback has the following form:
514.Ft void
515.Fn "(*cb)" "struct bufferevent *bufev" "short what" "void *arg" .
516The argument is specified by the fourth parameter
517.Fa "cbarg" .
518A
519.Fa bufferevent struct
520pointer is returned on success, NULL on error.
521Both the read and the write callback may be NULL.
522The error callback has to be always provided.
523.Pp
524Once initialized, the bufferevent structure can be used repeatedly with
525bufferevent_enable() and bufferevent_disable().
526The flags parameter can be a combination of
527.Va EV_READ
528and
529.Va EV_WRITE .
530When read enabled the bufferevent will try to read from the file
531descriptor and call the read callback.
532The write callback is executed
533whenever the output buffer is drained below the write low watermark,
534which is
535.Va 0
536by default.
537.Pp
538The
539.Fn bufferevent_write
540function can be used to write data to the file descriptor.
541The data is appended to the output buffer and written to the descriptor
542automatically as it becomes available for writing.
543.Fn bufferevent_write
544returns 0 on success or \-1 on failure.
545The
546.Fn bufferevent_read
547function is used to read data from the input buffer,
548returning the amount of data read.
549.Pp
550If multiple bases are in use, bufferevent_base_set() must be called before
551enabling the bufferevent for the first time.
552.Sh NON-BLOCKING HTTP SUPPORT
553.Nm libevent
554provides a very thin HTTP layer that can be used both to host an HTTP
555server and also to make HTTP requests.
556An HTTP server can be created by calling
557.Fn evhttp_new .
558It can be bound to any port and address with the
559.Fn evhttp_bind_socket
560function.
561When the HTTP server is no longer used, it can be freed via
562.Fn evhttp_free .
563.Pp
564To be notified of HTTP requests, a user needs to register callbacks with the
565HTTP server.
566This can be done by calling
567.Fn evhttp_set_cb .
568The second argument is the URI for which a callback is being registered.
569The corresponding callback will receive an
570.Va struct evhttp_request
571object that contains all information about the request.
572.Pp
573This section does not document all the possible function calls; please
574check
575.Va event.h
576for the public interfaces.
577.Sh ADDITIONAL NOTES
578It is possible to disable support for
579.Va epoll , kqueue , devpoll , poll
580or
581.Va select
582by setting the environment variable
583.Va EVENT_NOEPOLL , EVENT_NOKQUEUE , EVENT_NODEVPOLL , EVENT_NOPOLL
584or
585.Va EVENT_NOSELECT ,
586respectively.
587By setting the environment variable
588.Va EVENT_SHOW_METHOD ,
589.Nm libevent
590displays the kernel notification method that it uses.
591.Sh RETURN VALUES
592Upon successful completion
593.Fn event_add
594and
595.Fn event_del
596return 0.
597Otherwise, \-1 is returned and the global variable errno is
598set to indicate the error.
599.Sh SEE ALSO
600.Xr kqueue 2 ,
601.Xr poll 2 ,
602.Xr select 2 ,
603.Xr evdns 3 ,
604.Xr timeout 9
605.Sh HISTORY
606The
607.Nm event
608API manpage is based on the
609.Xr timeout 9
610manpage by Artur Grabowski.
611The port of
612.Nm libevent
613to Windows is due to Michael A. Davis.
614Support for real-time signals is due to Taral.
615.Sh AUTHORS
616The
617.Nm event
618library was written by Niels Provos.
619.Sh BUGS
620This documentation is neither complete nor authoritative.
621If you are in doubt about the usage of this API then
622check the source code to find out how it works, write
623up the missing piece of documentation and send it to
624me for inclusion in this man page.
625