changeset 209 2961eca161ad
child 604 c25824a87b1f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/libevent/patches/event.3.patch	Thu Apr 28 21:37:41 2011 -0700
@@ -0,0 +1,843 @@
+--- libevent-1.3e/event.3.orig	Wed Apr 27 12:03:35 2011
++++ libevent-1.3e/event.3	Wed Apr 27 12:03:55 2011
[email protected]@ -26,567 +26,453 @@
+ .\"
+-.Dd August 8, 2000
+-.Dt EVENT 3
+-.Sh NAME
+-.Nm event_init ,
+-.Nm event_dispatch ,
+-.Nm event_loop ,
+-.Nm event_loopexit ,
+-.Nm event_set ,
+-.Nm event_base_dispatch ,
+-.Nm event_base_loop ,
+-.Nm event_base_loopexit ,
+-.Nm event_base_set ,
+-.Nm event_base_free ,
+-.Nm event_add ,
+-.Nm event_del ,
+-.Nm event_once ,
+-.Nm event_base_once ,
+-.Nm event_pending ,
+-.Nm event_initialized ,
+-.Nm event_priority_init ,
+-.Nm event_priority_set ,
+-.Nm evtimer_set ,
+-.Nm evtimer_add ,
+-.Nm evtimer_del ,
+-.Nm evtimer_pending ,
+-.Nm evtimer_initialized ,
+-.Nm signal_set ,
+-.Nm signal_add ,
+-.Nm signal_del ,
+-.Nm signal_pending ,
+-.Nm signal_initialized ,
+-.Nm bufferevent_new ,
+-.Nm bufferevent_free ,
+-.Nm bufferevent_write ,
+-.Nm bufferevent_write_buffer ,
+-.Nm bufferevent_read ,
+-.Nm bufferevent_enable ,
+-.Nm bufferevent_disable ,
+-.Nm bufferevent_settimeout ,
+-.Nm bufferevent_base_set ,
+-.Nm evbuffer_new ,
+-.Nm evbuffer_free ,
+-.Nm evbuffer_add ,
+-.Nm evbuffer_add_buffer ,
+-.Nm evbuffer_add_printf ,
+-.Nm evbuffer_add_vprintf ,
+-.Nm evbuffer_drain ,
+-.Nm evbuffer_write ,
+-.Nm evbuffer_read ,
+-.Nm evbuffer_find ,
+-.Nm evbuffer_readline ,
+-.Nm evhttp_start ,
+-.Nm evhttp_free
+-.Nd execute a function when a specific event occurs
+-.Fd #include <sys/time.h>
+-.Fd #include <event.h>
+-.Ft "struct event_base *"
+-.Fn "event_init" "void"
+-.Ft int
+-.Fn "event_dispatch" "void"
+-.Ft int
+-.Fn "event_loop" "int flags"
+-.Ft int
+-.Fn "event_loopexit" "struct timeval *tv"
+-.Ft void
+-.Fn "event_set" "struct event *ev" "int fd" "short event" "void (*fn)(int, short, void *)" "void *arg"
+-.Ft int
+-.Fn "event_base_dispatch" "struct event_base *base"
+-.Ft int
+-.Fn "event_base_loop" "struct event_base *base" "int flags"
+-.Ft int
+-.Fn "event_base_loopexit" "struct event_base *base" "struct timeval *tv"
+-.Ft int
+-.Fn "event_base_set" "struct event_base *base" "struct event *"
+-.Ft void
+-.Fn "event_base_free" "struct event_base *base"
+-.Ft int
+-.Fn "event_add" "struct event *ev" "struct timeval *tv"
+-.Ft int
+-.Fn "event_del" "struct event *ev"
+-.Ft int
+-.Fn "event_once" "int fd" "short event" "void (*fn)(int, short, void *)" "void *arg" "struct timeval *tv"
+-.Ft int
+-.Fn "event_base_once" "struct event_base *base" "int fd" "short event" "void (*fn)(int, short, void *)" "void *arg" "struct timeval *tv"
+-.Ft int
+-.Fn "event_pending" "struct event *ev" "short event" "struct timeval *tv"
+-.Ft int
+-.Fn "event_initialized" "struct event *ev"
+-.Ft int
+-.Fn "event_priority_init" "int npriorities"
+-.Ft int
+-.Fn "event_priority_set" "struct event *ev" "int priority"
+-.Ft void
+-.Fn "evtimer_set" "struct event *ev" "void (*fn)(int, short, void *)" "void *arg"
+-.Ft void
+-.Fn "evtimer_add" "struct event *ev" "struct timeval *"
+-.Ft void
+-.Fn "evtimer_del" "struct event *ev"
+-.Ft int
+-.Fn "evtimer_pending" "struct event *ev" "struct timeval *tv"
+-.Ft int
+-.Fn "evtimer_initialized" "struct event *ev"
+-.Ft void
+-.Fn "signal_set" "struct event *ev" "int signal" "void (*fn)(int, short, void *)" "void *arg"
+-.Ft void
+-.Fn "signal_add" "struct event *ev" "struct timeval *"
+-.Ft void
+-.Fn "signal_del" "struct event *ev"
+-.Ft int
+-.Fn "signal_pending" "struct event *ev" "struct timeval *tv"
+-.Ft int
+-.Fn "signal_initialized" "struct event *ev"
+-.Ft "struct bufferevent *"
+-.Fn "bufferevent_new" "int fd" "evbuffercb readcb" "evbuffercb writecb" "everrorcb" "void *cbarg"
+-.Ft void
+-.Fn "bufferevent_free" "struct bufferevent *bufev"
+-.Ft int
+-.Fn "bufferevent_write" "struct bufferevent *bufev" "void *data" "size_t size"
+-.Ft int
+-.Fn "bufferevent_write_buffer" "struct bufferevent *bufev" "struct evbuffer *buf"
+-.Ft size_t
+-.Fn "bufferevent_read" "struct bufferevent *bufev" "void *data" "size_t size"
+-.Ft int
+-.Fn "bufferevent_enable" "struct bufferevent *bufev" "short event"
+-.Ft int
+-.Fn "bufferevent_disable" "struct bufferevent *bufev" "short event"
+-.Ft void
+-.Fn "bufferevent_settimeout" "struct bufferevent *bufev" "int timeout_read" "int timeout_write"
+-.Ft int
+-.Fn "bufferevent_base_set" "struct event_base *base" "struct bufferevent *bufev"
+-.Ft "struct evbuffer *"
+-.Fn "evbuffer_new" "void"
+-.Ft void
+-.Fn "evbuffer_free" "struct evbuffer *buf"
+-.Ft int
+-.Fn "evbuffer_add" "struct evbuffer *buf" "const void *data" "size_t size"
+-.Ft int
+-.Fn "evbuffer_add_buffer" "struct evbuffer *dst" "struct evbuffer *src"
+-.Ft int
+-.Fn "evbuffer_add_printf" "struct evbuffer *buf" "const char *fmt" "..."
+-.Ft int
+-.Fn "evbuffer_add_vprintf" "struct evbuffer *buf" "const char *fmt" "va_list ap"
+-.Ft void
+-.Fn "evbuffer_drain" "struct evbuffer *buf" "size_t size"
+-.Ft int
+-.Fn "evbuffer_write" "struct evbuffer *buf" "int fd"
+-.Ft int
+-.Fn "evbuffer_read" "struct evbuffer *buf" "int fd" "int size"
+-.Ft "u_char *"
+-.Fn "evbuffer_find" "struct evbuffer *buf" "const u_char *data" "size_t size"
+-.Ft "char *"
+-.Fn "evbuffer_readline" "struct evbuffer *buf"
+-.Ft "struct evhttp *"
+-.Fn "evhttp_start" "const char *address" "u_short port"
+-.Ft "void"
+-.Fn "evhttp_free" "struct evhttp* http"
+-.Ft int
+-.Fa (*event_sigcb)(void) ;
+-.Ft volatile sig_atomic_t
+-.Fa event_gotsig ;
++.TH EVENT 3 "8 August 2000" "libevent 1.3e" "libevent Manual"
++event_init, event_dispatch, event_loop, event_loopexit, event_set, event_base_dispatch, event_base_loop, event_base_loopexit, event_base_set, event_base_free, event_add, event_del, event_once, event_base_once, event_pending, event_initialized, event_priority_init, event_priority_set, evtimer_set, evtimer_add, evtimer_del, evtimer_pending, evtimer_initialized, signal_set, signal_add, signal_del, signal_pending, signal_initialized, bufferevent_new, bufferevent_free, bufferevent_write, bufferevent_write_buffer, bufferevent_read, bufferevent_enable, bufferevent_disable, bufferevent_settimeout, bufferevent_base_set, evbuffer_new, evbuffer_free, evbuffer_add, evbuffer_add_buffer, evbuffer_add_printf, evbuffer_add_vprintf, evbuffer_drain, evbuffer_write, evbuffer_read, evbuffer_find, evbuffer_readline
++The libevent library (libevent, -levent)
++\fB#include <sys/time.h>\fP
++\fB#include <event.h>\fP
++\fBstruct event_base* \fBevent_init\fR\fR(\fBvoid\fP\fR);
++\fBint \fBevent_dispatch\fR\fR(\fBvoid\fP\fR);
++\fBint \fBevent_loop\fR\fR(\fBint \fIflags\fP\fR);
++.BI "int event_loopexit(struct timeval* " tv ");"
++\fBvoid \fBevent_set\fR\fR(\fBstruct event* \fIev\fP\fR, \fBint \fIfd \fP\fR, \fBshort \fIevent\fP\fR, \fBvoid \fI(*fn)(int, short, void *)\fP\fR, \fBvoid* \fIarg\fP\fR);
++\fBint \fBevent_base_dispatch\fR\fR(\fBstruct event_base* \fIbase\fP\fR);
++\fBint \fBevent_base_loop\fR\fR(\fBstruct event_base* \fIbase\fP\fR, \fBint \fIflags\fP\fR);
++\fBint \fBevent_base_loopexit\fR\fR(struct event_base* \fIbase\fP\fR, \fBstruct timeval* \fItv\fP\fR);
++\fBint \fBevent_base_set\fR\fR(struct event_base* \fIbase\fP\fR, \fBstruct event* \fIev\fP\fR);
++\fBvoid \fBevent_base_free\fR\fR(struct event_base* \fIbase\fP\fR);
++\fBint \fBevent_add\fR\fR(struct event* \fIev\fP\fR, \fBstruct timeval* \fItv\fP\fR);
++.\fBint \fBevent_del\fR\fR(struct event* \fIev\fP\fR);
++\fBint \fBevent_once\fR\fR(int \fIfd\fP\fR, \fBshort \fIevent\fP\fR, \fBvoid \fI(*fn)(int, short, void*)\fB\fR, \fBstruct timeval* \fItv\fP\fR);
++\fBint \fBevent_base_once\fR\fR(struct event_base* \fIbase\fP\fR, \fBint \fIfd\fB\fR, \fBshort \fIevent\fB\fR, \fBvoid \fI(*fn)(int, short, void*)\fB\fR, \fBvoid* \fIarg\fB\fR, \fBstruct timeval* \fItv\fP\fR);
++\fBint \fBevent_pending\fR\fR(struct event* \fIev\fP\fR, \fBshort \fIevent\fB\fR, \fBstruct timeval* \fItv\fP\fR);
++\fBint \fBevent_initialized\fR\fR(struct event* \fIev\fP\fR);
++\fBint \fBevent_priority_init\fR\fR (int \fInpriorities\fP\fR);
++\fBint \fBevent_priority_set\fR\fR (struct event* \fIev\fP\fR, \fBint \fIpriority\fP\fR);
++\fBvoid \fBevtimer_set\fR\fR (struct event* \fIev\fP\fR, \fBvoid \fI(*fn)(int, short, void*)\fB\fR, \fBvoid* \fIarg\fP\fR);
++\fBvoid \fBevtimer_add\fR\fR (struct event* \fIev\fP\fR, \fBstruct timeval* \fItv\fP\fR);
++\fBvoid \fBevtimer_del\fR\fR (struct event* \fIev\fP\fR);
++\fBint \fBevtimer_pending\fR\fR (struct event* \fIev\fP\fR, \fBstruct timeval* \fItv\fP\fR);
++\fBint \fBevtimer_initialized\fR\fR(struct event* \fIev\fP\fR);
++\fBvoid \fBsignal_set\fR\fR (struct event* \fIev\fP\fR, \fBint \fIsignal\fP\fR, \fBvoid \fI(*fn)(int, short, void*)\fP\fR, \fBvoid* \fIarg\fP\fR);
++\fBvoid \fBsignal_add\fR\fR (struct event* \fIev\fP\fR, \fBstruct timeval* \fItv\fP\fR);
++\fBvoid \fBsignal_del\fR\fR (struct event* \fIev\fP\fR);
++\fBint \fBsignal_pending\fR\fR(struct event* \fIev\fP\fR, \fBstruct timeval* \fItv\fP\fR);
++\fBint \fBsignal_initialized\fR\fR(struct event* \fIev\fP\fR);
++\fBstruct bufferevent* \fB"bufferevent_new\fR\fR(int \fIfd\fP\fR, \fBevbuffercb \fIreadcb\fP\fR, \fBevbuffercb \fIwritecb\fP\fR, \fBeverrorcb \fIerrorcb\fP\fR, \fBvoid* \fIcbarg\fP\fR);
++\fBvoid \fBbufferevent_free\fR\fR(struct bufferevent* \fIbufev\fP\fR);
++\fBint \fBbufferevent_write\fR\fR(struct bufferevent* \fIbufev\fP\fR, \fBvoid* \fIdata\fP\fR, \fBsize_t \fIsize\fP\fR);
++\fBint \fBbufferevent_write_buffer\fR\fR(\fBstruct bufferevent* \fIbufev\fP\fR, \fBstruct evbuffer* \fIbuf\fP\fR);
++\fBsize_t \fBbufferevent_read\fR\fR(\fBstruct bufferevent* \fIbufev\fP\fR, \fBvoid* \fIdata\fP\fR, \fBsize_t \fIsize\fP\fR);
++\fBint \fBbufferevent_enable\fR\fR(\fBstruct bufferevent* \fIbufev\fP\fR, \fBshort \fIevent\fP\fR);
++\fBint \fBbufferevent_disable\fR\fR(\fBstruct bufferevent* \fIbufev\fP\fR, \fBshort \fIeven\fP\fR);
++\fBvoid \fBbufferevent_settimeout\fR\fR(\fBstruct bufferevent* \fIbufev\fP\fR, \fBint \fItimeout_read\fP\fR, \fBint \fItimeout_write\fP\fR);
++\fBint \fBbufferevent_base_set\fR\fR(\fBstruct event_base* \fIbase\fP\fR, \fBstruct bufferevent* \fIbufev\fP\fR);
++\fBstruct evbuffer* \fBevbuffer_new (\fBvoid\fP\fR);
++\fBvoid \fBvbuffer_free\fR\fR(\fBstruct evbuffer* \fIbuf\fP\fR);
++\fBint \fBevbuffer_add\fR\fR(\fBstruct evbuffer* \fIbuf\fP\fR, \fBconst void* \fIdata\fP\fR, \fBsize_t \fIsize\fP\fR);
++\fBint \fBevbuffer_add_buffer\fR\fR(\fBstruct evbuffer* \fIdst\fP\fR, \fBstruct evbuffer* \fIsrc\fP\fR);
++\fBint \fBevbuffer_add_printf\fR\fR(\fBstruct evbuffer* \fIbuf\fP\fR, \fBconst char* \fIfmt\fP\fR, \fB...\fP\fR);
++\fBint \fBevbuffer_add_vprintf\fR\fR(\fBstruct evbuffer* \fIbuf\fP\fR, \fBconst char* \fIfmt\fP\fR, \fBva_list \fIap\fP\fR);
++\fBvoid \fBevbuffer_drain\fR\fR(\fBstruct evbuffer* \fIbuf\fP\fR, \fBsize_t \fIsize\fP\fR);
++\fBint \fBevbuffer_write\fR\fR(\fBstruct evbuffer* \fIbuf\fP\fR, \fBint \fIfd\fP\fR);
++\fBint \fBevbuffer_read\fR\fR(\fBstruct evbuffer* \fIbuf\fP\fR, \fBint \fIfd\fP\fR, \fBint \fIsize\fP\fR);
++\fBu_char* \fBevbuffer_find\fR\fR(\fBstruct evbuffer* \fIbuf\fP\fR, \fBconst u_char* \fIdata\fP\fR, \fBsize_t \fIsize\fP\fR);
++\fBchar* \fBevbuffer_readline\fR\fR(\fBstruct evbuffer* \fIbuf\fP\fR);
++\fBint \fI(*event_sigcb)\fP\fR\fI(void)\fP\fR;
++\fBvolatile sig_atomic_t \fR\fRevent_gotsig\fP\fR;
+ The
+-.Nm event
+ API provides a mechanism to execute a function when a specific event
+ on a file descriptor occurs or after a given time has passed.
+ The
+-.Nm event
+ API needs to be initialized with
+-.Fn event_init
+ before it can be used.
+ In order to process events, an application needs to call
+-.Fn event_dispatch .
++\fIevent_dispatch\fP\fR .
+ This function only returns on error, and should replace the event core
+ of the application program.
+ In order to avoid races in signal handlers, the
+-.Nm event
+ API provides two variables:
+-.Va event_sigcb
+ and
+-.Va event_gotsig .
+ A signal handler
+ sets
+-.Va event_gotsig
+ to indicate that a signal has been received.
+ The application sets
+-.Va event_sigcb
+ to a callback function.
+ After the signal handler sets
+-.Va event_gotsig ,
+-.Nm event_dispatch
+ will execute the callback function to process received signals.
+ The callback returns 1 when no events are registered any more.
+ It can return \-1 to indicate an error to the
+-.Nm event
+ library, causing
+-.Fn event_dispatch
+ to terminate with
+-.Va errno
+-set to
+-.Er EINTR .
++set to EINTR.
+ The
+-.Nm event_loop
+ function provides an interface for single pass execution of pending
+ events.
+ The flags
+-are recognized.
++EVLOOP_ONCE and EVLOOP_NONBLOCK are recognized.
+ The
+-.Nm event_loopexit
+ function allows the loop to be terminated after some amount of time
+ has passed.
+ The parameter indicates the time after which the loop should terminate.
+ It is the responsibility of the caller to provide these functions with
+ pre-allocated event structures.
+ The function
+-.Fn event_set
+ prepares the event structure
+-.Fa ev
+ to be used in future calls to
+-.Fn event_add
+ and
+-.Fn event_del .
++\fBevent_del\fP\fR .
+ The event will be prepared to call the function specified by the
+-.Fa fn
+ argument with an
+-.Fa int
+ argument indicating the file descriptor, a
+-.Fa short
+ argument indicating the type of event, and a
+-.Fa void *
+ argument given in the
+-.Fa arg
+ argument.
+-.Fa fd
++The \fIfd\fP\fR
+ indicates the file descriptor that should be monitored for events.
+-The events can be either
+-.Va EV_READ ,
+-.Va EV_WRITE ,
+-or both,
++The events can be either EV_READ, EV_WRITE , or both,
+ indicating that an application can read or write from the file descriptor
+ respectively without blocking.
+ The function
+-.Fa fn
+ will be called with the file descriptor that triggered the event and
+-the type of event which will be either
+-.Va EV_READ ,
+-.Va EV_WRITE .
+-The additional flag
+-makes an
+-.Fn event_add
+-persistent until
+-.Fn event_del
++the type of event which will be either EV_TIMEOUT, EV_SIGNAL,
++EV_READ, or EV_WRITE.  The additional flag EV_PERSIST makes an
++\fIevent_add\fP\fR persistent until
+ has been called.
+ Once initialized, the
+-.Fa ev
+ structure can be used repeatedly with
+-.Fn event_add
+ and
+-.Fn event_del
+ and does not need to be reinitialized unless the function called and/or
+ the argument to it are to be changed.
+ However, when an
+-.Fa ev
+ structure has been added to libevent using
+-.Fn event_add
+ the structure must persist until the event occurs (assuming
+-is not set) or is removed
+-.Fn event_del .
++EV_PERSIST is not set) or is removed using
++\fIevent_del\fP\fR .
+ You may not reuse the same
+-.Fa ev
+ structure for multiple monitored descriptors; each descriptor
+-needs its own
+-.Fa ev .
++needs its own \fIev\fP\fR .
+ The function
+-.Fn event_add
+ schedules the execution of the
+-.Fa ev
+ event when the event specified in
+-.Fn event_set
+ occurs or in at least the time specified in the
+-.Fa tv .
++\fItv\fP\fR .
+ If
+-.Fa tv
+-.Dv NULL ,
+-no timeout occurs and the function will only be called
++is NULL, no timeout occurs and the function will only be called
+ if a matching event occurs on the file descriptor.
+ The event in the
+-.Fa ev
+ argument must be already initialized by
+-.Fn event_set
+ and may not be used in calls to
+-.Fn event_set
+ until it has timed out or been removed with
+-.Fn event_del .
++\fIevent_del\fP\fR .
+ If the event in the
+-.Fa ev
+ argument already has a scheduled timeout, the old timeout will be
+ replaced by the new one.
+ The function
+-.Fn event_del
+ will cancel the event in the argument
+-.Fa ev .
++\fIev\fP\fR .
+ If the event has already executed or has never been added
+ the call will have no effect.
+ The function
+-.Fn event_once
+ is similar to
+-.Fn event_set .
+ However, it schedules a callback to be called exactly once and does not
+ require the caller to prepare an
+-.Fa event
+ structure.
+-This function supports
+-.Fa EV_READ ,
+-.Fa EV_WRITE .
++This function supports EV_TIMEOUT, EV_READ, and EV_WRITE.
+ The
+-.Fn event_pending
+ function can be used to check if the event specified by
+-.Fa event
+ is pending to run.
+-was specified and
+-.Fa tv
+-is not
+-.Dv NULL ,
++If EV_TIMEOUT was specified and
++is not NULL ,
+ the expiration time of the event will be returned in
+-.Fa tv .
++\fItv\fP\fR .
+ The
+-.Fn event_initialized
+ macro can be used to check if an event has been initialized.
+ The functions
+-.Fn evtimer_set ,
+-.Fn evtimer_add ,
+-.Fn evtimer_del ,
+-.Fn evtimer_initialized ,
+ and
+-.Fn evtimer_pending
+ are abbreviations for common situations where only a timeout is required.
+ The file descriptor passed will be \-1, and the event type will be
+ The functions
+-.Fn signal_set ,
+-.Fn signal_add ,
+-.Fn signal_del ,
+-.Fn signal_initialized ,
++\fIsignal_del()\fP\fR ,
+ and
+-.Fn signal_pending
+ are abbreviations.
+-The event type will be a persistent
++The event type will be a persistent EV_SIGNAL .
+ That means
+-.Fn signal_set
++\fIsignal_set\fP\fR adds EV_PERSIST .
+ It is possible to disable support for
+-.Va epoll , kqueue , devpoll , poll
+-.Va select
++epoll, kqueue, devpoll, event ports, poll or select
+ by setting the environment variable
+ By setting the environment variable
+-.Nm libevent
+ displays the kernel notification method that it uses.
+ By default
+-.Nm libevent
+ schedules all active events with the same priority.
+ However, sometimes it is desirable to process some events with a higher
+ priority than others.
+ For that reason,
+-.Nm libevent
+ supports strict priority queues.
+ Active events with a lower priority are always processed before events
+ with a higher priority.
+ The number of different priorities can be set initially with the
+-.Fn event_priority_init
+ function.
+ This function should be called before the first call to
+-.Fn event_dispatch .
++\fIevent_dispatch()\fP\fR .
+ The
+-.Fn event_priority_set
+ function can be used to assign a priority to an event.
+ By default,
+-.Nm libevent
+ assigns the middle priority to all events unless their priority
+ is explicitly set.
+-.Nm Libevent
+ has experimental support for thread-safe events.
+ When initializing the library via
+-.Fn event_init ,
+ an event base is returned.
+ This event base can be used in conjunction with calls to
+-.Fn event_base_set ,
+-.Fn event_base_dispatch ,
+-.Fn event_base_loop ,
+-.Fn event_base_loopexit ,
+-.Fn bufferevent_base_set
+ and
+-.Fn event_base_free .
+-.Fn event_base_set
+ should be called after preparing an event with
+-.Fn event_set ,
+ as
+-.Fn event_set
+ assigns the provided event to the most recently created event base.
+-.Fn bufferevent_base_set
+ should be called after preparing a bufferevent with
+-.Fn bufferevent_new .
+-.Fn event_base_free
+ should be used to free memory associated with the event base
+ when it is no longer needed.
+-.Nm libevent
+ provides an abstraction on top of the regular event callbacks.
+ This abstraction is called a
+-.Va "buffered event" .
++\fB"buffered event"\fP\fR.
+ A buffered event provides input and output buffers that get filled
+ and drained automatically.
+ The user of a buffered event no longer deals directly with the IO,
+ but instead is reading from input and writing to output buffers.
+ A new bufferevent is created by
+-.Fn bufferevent_new .
+ The parameter
+-.Fa fd
+ specifies the file descriptor from which data is read and written to.
+ This file descriptor is not allowed to be a
+-.Xr pipe 2 .
+ The next three parameters are callbacks.
+ The read and write callback have the following form:
+-.Ft void
+-.Fn "(*cb)" "struct bufferevent *bufev" "void *arg" .
++\fBvoid \fB(*cb)\fR\fR(\fBstruct bufferevent* \fIbufev\fP\fR, \fBvoid* \fIarg\fP\fR).
+ The error callback has the following form:
+-.Ft void
+-.Fn "(*cb)" "struct bufferevent *bufev" "short what" "void *arg" .
++\fBvoid \fB(*cb)\fR\fR(\fBstruct bufferevent* \fIbufev\fP\fR, \fBshort \fIwhat\fP\fR, \fBvoid* \fIarg\fP\fR).
+ The argument is specified by the fourth parameter
+-.Fa "cbarg" .
+ A
+-.Fa bufferevent struct
++\fIbufferevent\fP\fR struct
+ pointer is returned on success, NULL on error.
+ Both the read and the write callback may be NULL.
+ The error callback has to be always provided.
+ Once initialized, the bufferevent structure can be used repeatedly with
+-bufferevent_enable() and bufferevent_disable().
+-The flags parameter can be a combination of
+-.Va EV_WRITE .
++\fIbufferevent_enable()\fP\fR and \fIbufferevent_disable()\fP\fR.
++The \fIflags\fP\fR parameter can be a combination of
+ When read enabled the bufferevent will try to read from the file
+ descriptor and call the read callback.
+ The write callback is executed
+ whenever the output buffer is drained below the write low watermark,
+-which is
+-.Va 0
+-by default.
++which is 0 by default.
+ The
+-.Fn bufferevent_write
+ function can be used to write data to the file descriptor.
+ The data is appended to the output buffer and written to the descriptor
+ automatically as it becomes available for writing.
+-.Fn bufferevent_write
+ returns 0 on success or \-1 on failure.
+ The
+-.Fn bufferevent_read
+ function is used to read data from the input buffer,
+ returning the amount of data read.
+ If multiple bases are in use, bufferevent_base_set() must be called before
+ enabling the bufferevent for the first time.
+-.Nm libevent
+-provides a very thin HTTP layer that can be used both to host an HTTP
+-server and also to make HTTP requests.
+-An HTTP server can be created by calling
+-.Fn evhttp_start .
+-When the HTTP server is no longer used, it can be freed via
+-.Fn evhttp_free .
+-To be notified of HTTP requests, a user needs to register callbacks with the
+-HTTP server.
+-This can be done by calling
+-.Fn evhttp_set_cb .
+-The second argument is the URI for which a callback is being registered.
+-The corresponding callback will receive an
+-.Va struct evhttp_request
+-object that contains all information about the request.
+-This section does not document all the possible function calls; please
+-.Va event.h
+-for the public interfaces.
+ Upon successful completion
+-.Fn event_add
+ and
+-.Fn event_del
+ return 0.
+ Otherwise, \-1 is returned and the global variable errno is
+ set to indicate the error.
+-.Xr kqueue 2 ,
+-.Xr poll 2 ,
+-.Xr select 2 ,
+-.Xr evdns 3 ,
+-.Xr timeout 9
+ The
+-.Nm event
+ API manpage is based on the
+-.Xr timeout 9
+ manpage by Artur Grabowski.
+ The port of
+-.Nm libevent
+ to Windows is due to Michael A. Davis.
+ Support for real-time signals is due to Taral.
+ The
+-.Nm event
+ library was written by Niels Provos.
+-.Sh BUGS
+ This documentation is neither complete nor authoritative.
+ If you are in doubt about the usage of this API then
+ check the source code to find out how it works, write
+ up the missing piece of documentation and send it to
+ me for inclusion in this man page.