7040066 move libevent to userland
authorMike Sullivan <Mike.Sullivan@Oracle.COM>
Thu, 28 Apr 2011 21:37:41 -0700
changeset 209 2961eca161ad
parent 208 a06bd0485fd0
child 210 678da3f391ca
7040066 move libevent to userland
components/libevent/Makefile
components/libevent/libevent.3
components/libevent/libevent.license
components/libevent/libevent.p5m
components/libevent/llib-levent
components/libevent/patches/Makefile.in.patch
components/libevent/patches/config.patch
components/libevent/patches/event.3.patch
components/libevent/patches/evport.patch
components/libevent/patches/http.patch
components/meta-packages/history/SUNWlibevent.p5m
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/libevent/Makefile	Thu Apr 28 21:37:41 2011 -0700
@@ -0,0 +1,71 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+#
+
+include ../../make-rules/shared-macros.mk
+
+COMPONENT_NAME=		libevent
+COMPONENT_VERSION=	1.3e
+IPS_COMPONENT_VERSION=	1.3.5
+COMPONENT_SRC=		$(COMPONENT_NAME)-$(COMPONENT_VERSION)
+COMPONENT_ARCHIVE=	$(COMPONENT_SRC).tar.gz
+COMPONENT_ARCHIVE_HASH=	sha1:67b064a4533c640dfb86e3d81c0cca9247427353
+COMPONENT_ARCHIVE_URL=	http://monkey.org/~provos/$(COMPONENT_ARCHIVE)
+
+include ../../make-rules/prep.mk
+include ../../make-rules/configure.mk
+include ../../make-rules/ips.mk
+include ../../make-rules/lint-libraries.mk
+
+COMPONENT_PRE_CONFIGURE_ACTION =  \
+	($(CLONEY) $(SOURCE_DIR) $(@D))
+
+#The libevent that is bundled with Solaris is a trimed down version.
+#It does not contain the evhttp*, evdns* functions. The man page 'event.3'
+#is patched to remove descriptions regarding these functions.
+#
+#The original manpage is in a format that the Solaris man command does
+#not understand. Hence it has been manually converted.
+#
+#List of files from the original package that are not being delivered
+#
+#/usr/share/man/man3/evdns.3
+#/usr/include/evhttp.h
+#/usr/include/evdns.h
+#/usr/bin/event_rpcgen.py
+
+CONFIGURE_OPTIONS	+= CFLAGS="$(CFLAGS)"
+CONFIGURE_OPTIONS	+= --enable-threads
+
+build:		$(BUILD_32_and_64)
+
+install:	$(INSTALL_32_and_64)
+
+# this isn't really true - there _are_ tests, but we can't run
+# them because we delete things that the tests want (see above).
+test:		$(NO_TESTS)
+
+BUILD_PKG_DEPENDENCIES =	$(BUILD_TOOLS)
+
+include ../../make-rules/depend.mk
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/libevent/libevent.3	Thu Apr 28 21:37:41 2011 -0700
@@ -0,0 +1,1 @@
+.so man3/event.3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/libevent/libevent.license	Thu Apr 28 21:37:41 2011 -0700
@@ -0,0 +1,26 @@
+Copyright (c) 2000-2004 Niels Provos <[email protected]>
+All rights reserved.
+
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+   1. Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+   2. Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+   3. The name of the author may not be used to endorse or promote products
+      derived from this software without specific prior written permission.
+  
+   THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+   IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+   OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/libevent/libevent.p5m	Thu Apr 28 21:37:41 2011 -0700
@@ -0,0 +1,63 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+#
+
+<transform file path=usr.*/man/.+ -> default mangler.man.stability uncommitted>
+set name=pkg.fmri \
+    value=pkg:/library/libevent@$(IPS_COMPONENT_VERSION),$(BUILD_VERSION)
+set name=pkg.summary \
+    value="Libevent - an event notification library"
+set name=info.classification \
+    value="org.opensolaris.category.2008:System/Libraries"
+set name=info.source_url value=$(COMPONENT_ARCHIVE_URL)
+set name=info.upstream_url value=http://monkey.org/~provos/libevent/
+set name=opensolaris.arc_url \
+    value=http://arc.opensolaris.org/caselog/PSARC/2007/580
+set name=org.opensolaris.consolidation value=$(CONSOLIDATION)
+
+dir path=usr
+dir path=usr/include
+dir path=usr/lib
+dir path=usr/lib/$(MACH64)
+dir path=usr/share
+dir path=usr/share/man
+dir path=usr/share/man/man3
+file path=usr/include/event.h
+file path=usr/lib/$(MACH64)/libevent.so.1.0.3
+file path=usr/lib/$(MACH64)/llib-levent.ln
+file path=usr/lib/libevent.so.1.0.3
+file path=usr/lib/llib-levent
+file path=usr/lib/llib-levent.ln
+file path=usr/share/man/man3/event.3
+file libevent.3 path=usr/share/man/man3/libevent.3
+link path=usr/lib/$(MACH64)/libevent.so target=libevent.so.1.0.3
+link path=usr/lib/$(MACH64)/libevent.so.1 target=libevent.so.1.0.3
+link path=usr/lib/libevent.so target=libevent.so.1.0.3
+link path=usr/lib/libevent.so.1 target=libevent.so.1.0.3
+
+legacy pkg=SUNWlibevent \
+    desc="Libevent - an event notification library (1.3e)" \
+    name="Libevent - an event notification library"
+
+license libevent.license license=BSD
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/libevent/llib-levent	Thu Apr 28 21:37:41 2011 -0700
@@ -0,0 +1,33 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+ */
+
+/* LINTLIBRARY */
+/* PROTOLIB1 */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <event.h>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/libevent/patches/Makefile.in.patch	Thu Apr 28 21:37:41 2011 -0700
@@ -0,0 +1,65 @@
+--- libevent-1.3e/Makefile.in.orig	Wed Apr 27 11:58:08 2011
++++ libevent-1.3e/Makefile.in	Wed Apr 27 11:58:30 2011
+@@ -63,12 +63,11 @@
+ am__DEPENDENCIES_1 =
+ libevent_la_DEPENDENCIES = @LTLIBOBJS@ $(am__DEPENDENCIES_1)
+ am__libevent_la_SOURCES_DIST = event.c buffer.c evbuffer.c log.c \
+-	event_tagging.c http.c evhttp.h http-internal.h evdns.c \
+-	evdns.h strlcpy.c strlcpy-internal.h WIN32-Code/misc.c \
++	event_tagging.c strlcpy.c strlcpy-internal.h WIN32-Code/misc.c \
+ 	WIN32-Code/win32.c
+ @BUILD_WIN32_TRUE@am__objects_1 = misc.lo win32.lo
+ am_libevent_la_OBJECTS = event.lo buffer.lo evbuffer.lo log.lo \
+-	event_tagging.lo http.lo evdns.lo strlcpy.lo $(am__objects_1)
++	event_tagging.lo strlcpy.lo $(am__objects_1)
+ libevent_la_OBJECTS = $(am_libevent_la_OBJECTS)
+ libevent_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+ 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+@@ -105,7 +104,7 @@
+   distclean-recursive maintainer-clean-recursive
+ ETAGS = etags
+ CTAGS = ctags
+-DIST_SUBDIRS = . sample test
++DIST_SUBDIRS = .
+ DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ distdir = $(PACKAGE)-$(VERSION)
+ top_distdir = $(distdir)
+@@ -230,11 +229,6 @@
+ 	event.3 \
+ 	kqueue.c epoll_sub.c epoll.c select.c rtsig.c poll.c signal.c \
+ 	evport.c devpoll.c event_rpcgen.py \
+-	sample/Makefile.am sample/Makefile.in sample/event-test.c \
+-	sample/signal-test.c sample/time-test.c \
+-	test/Makefile.am test/Makefile.in test/bench.c test/regress.c \
+-	test/test-eof.c test/test-weof.c test/test-time.c \
+-	test/test-init.c test/test.sh \
+ 	compat/sys/queue.h compat/sys/tree.h compat/sys/_time.h \
+ 	WIN32-Code/config.h WIN32-Code/misc.c \
+ 	WIN32-Code/win32.c WIN32-Code/misc.h \
+@@ -244,8 +238,8 @@
+ 	WIN32-Prj/time_test/time_test.dsp
+ 
+ lib_LTLIBRARIES = libevent.la
+-@BUILD_WIN32_FALSE@SUBDIRS = . sample test
+-@BUILD_WIN32_TRUE@SUBDIRS = . sample
++@BUILD_WIN32_FALSE@SUBDIRS = .
++@BUILD_WIN32_TRUE@SUBDIRS = .
+ @BUILD_WIN32_FALSE@SYS_LIBS = 
+ @BUILD_WIN32_TRUE@SYS_LIBS = -lws2_32
+ @BUILD_WIN32_FALSE@SYS_SRC = 
+@@ -253,13 +247,12 @@
+ @BUILD_WIN32_FALSE@SYS_INCLUDES = 
+ @BUILD_WIN32_TRUE@SYS_INCLUDES = -IWIN32-Code
+ libevent_la_SOURCES = event.c buffer.c evbuffer.c log.c event_tagging.c \
+-	http.c evhttp.h http-internal.h evdns.c evdns.h strlcpy.c \
+-	strlcpy-internal.h strlcpy-internal.h \
++	strlcpy.c strlcpy-internal.h strlcpy-internal.h \
+ 	$(SYS_SRC)
+ 
+ libevent_la_LIBADD = @LTLIBOBJS@ $(SYS_LIBS)
+ libevent_la_LDFLAGS = -release @VERSION@ -version-info 1:3:0
+-include_HEADERS = event.h evhttp.h evdns.h
++include_HEADERS = event.h
+ INCLUDES = -Icompat $(SYS_INCLUDES)
+ man_MANS = event.3 evdns.3
+ DISTCLEANFILES = *~
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/libevent/patches/config.patch	Thu Apr 28 21:37:41 2011 -0700
@@ -0,0 +1,13 @@
+--- libevent-1.3e/configure.orig	Wed Apr 27 12:01:29 2011
++++ libevent-1.3e/configure	Wed Apr 27 12:01:48 2011
+@@ -9129,8 +9129,8 @@
+   version_type=linux
+   need_lib_prefix=no
+   need_version=no
+-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+-  soname_spec='${libname}${release}${shared_ext}$major'
++  library_names_spec='${libname}${shared_ext}$versuffix ${libname}${shared_ext}$major $libname${shared_ext}'
++  soname_spec='${libname}${shared_ext}$major'
+   shlibpath_var=LD_LIBRARY_PATH
+   shlibpath_overrides_runpath=yes
+   hardcode_into_libs=yes
--- /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
+@@ -26,567 +26,453 @@
+ .\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ .\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ .\"
+-.Dd August 8, 2000
+-.Dt EVENT 3
+-.Os
+-.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
+-.Sh SYNOPSIS
+-.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 ;
+-.Sh DESCRIPTION
++.TH EVENT 3 "8 August 2000" "libevent 1.3e" "libevent Manual"
++.SH NAME
++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
++.SH LIBRARY
++The libevent library (libevent, -levent)
++.br
++.SH SYNOPSIS
++\fB#include <sys/time.h>\fP
++.br
++\fB#include <event.h>\fP
++.sp
++\fBstruct event_base* \fBevent_init\fR\fR(\fBvoid\fP\fR);
++.br
++\fBint \fBevent_dispatch\fR\fR(\fBvoid\fP\fR);
++.br
++\fBint \fBevent_loop\fR\fR(\fBint \fIflags\fP\fR);
++.br
++.BI "int event_loopexit(struct timeval* " tv ");"
++.br
++\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);
++.br
++\fBint \fBevent_base_dispatch\fR\fR(\fBstruct event_base* \fIbase\fP\fR);
++.br
++\fBint \fBevent_base_loop\fR\fR(\fBstruct event_base* \fIbase\fP\fR, \fBint \fIflags\fP\fR);
++.br
++\fBint \fBevent_base_loopexit\fR\fR(struct event_base* \fIbase\fP\fR, \fBstruct timeval* \fItv\fP\fR);
++.br
++\fBint \fBevent_base_set\fR\fR(struct event_base* \fIbase\fP\fR, \fBstruct event* \fIev\fP\fR);
++.br
++\fBvoid \fBevent_base_free\fR\fR(struct event_base* \fIbase\fP\fR);
++.br
++\fBint \fBevent_add\fR\fR(struct event* \fIev\fP\fR, \fBstruct timeval* \fItv\fP\fR);
++.br
++.\fBint \fBevent_del\fR\fR(struct event* \fIev\fP\fR);
++.br
++\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);
++.br
++\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);
++.br
++\fBint \fBevent_pending\fR\fR(struct event* \fIev\fP\fR, \fBshort \fIevent\fB\fR, \fBstruct timeval* \fItv\fP\fR);
++.br
++\fBint \fBevent_initialized\fR\fR(struct event* \fIev\fP\fR);
++.br
++\fBint \fBevent_priority_init\fR\fR (int \fInpriorities\fP\fR);
++.br
++\fBint \fBevent_priority_set\fR\fR (struct event* \fIev\fP\fR, \fBint \fIpriority\fP\fR);
++.br
++\fBvoid \fBevtimer_set\fR\fR (struct event* \fIev\fP\fR, \fBvoid \fI(*fn)(int, short, void*)\fB\fR, \fBvoid* \fIarg\fP\fR);
++.br
++\fBvoid \fBevtimer_add\fR\fR (struct event* \fIev\fP\fR, \fBstruct timeval* \fItv\fP\fR);
++.br
++\fBvoid \fBevtimer_del\fR\fR (struct event* \fIev\fP\fR);
++.br
++\fBint \fBevtimer_pending\fR\fR (struct event* \fIev\fP\fR, \fBstruct timeval* \fItv\fP\fR);
++.br
++\fBint \fBevtimer_initialized\fR\fR(struct event* \fIev\fP\fR);
++.br
++\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);
++.br
++\fBvoid \fBsignal_add\fR\fR (struct event* \fIev\fP\fR, \fBstruct timeval* \fItv\fP\fR);
++.br
++\fBvoid \fBsignal_del\fR\fR (struct event* \fIev\fP\fR);
++.br
++\fBint \fBsignal_pending\fR\fR(struct event* \fIev\fP\fR, \fBstruct timeval* \fItv\fP\fR);
++.br
++\fBint \fBsignal_initialized\fR\fR(struct event* \fIev\fP\fR);
++.br
++\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);
++.br
++\fBvoid \fBbufferevent_free\fR\fR(struct bufferevent* \fIbufev\fP\fR);
++.br
++\fBint \fBbufferevent_write\fR\fR(struct bufferevent* \fIbufev\fP\fR, \fBvoid* \fIdata\fP\fR, \fBsize_t \fIsize\fP\fR);
++.br
++\fBint \fBbufferevent_write_buffer\fR\fR(\fBstruct bufferevent* \fIbufev\fP\fR, \fBstruct evbuffer* \fIbuf\fP\fR);
++.br
++\fBsize_t \fBbufferevent_read\fR\fR(\fBstruct bufferevent* \fIbufev\fP\fR, \fBvoid* \fIdata\fP\fR, \fBsize_t \fIsize\fP\fR);
++.br
++\fBint \fBbufferevent_enable\fR\fR(\fBstruct bufferevent* \fIbufev\fP\fR, \fBshort \fIevent\fP\fR);
++.br
++\fBint \fBbufferevent_disable\fR\fR(\fBstruct bufferevent* \fIbufev\fP\fR, \fBshort \fIeven\fP\fR);
++.br
++\fBvoid \fBbufferevent_settimeout\fR\fR(\fBstruct bufferevent* \fIbufev\fP\fR, \fBint \fItimeout_read\fP\fR, \fBint \fItimeout_write\fP\fR);
++.br
++\fBint \fBbufferevent_base_set\fR\fR(\fBstruct event_base* \fIbase\fP\fR, \fBstruct bufferevent* \fIbufev\fP\fR);
++.br
++\fBstruct evbuffer* \fBevbuffer_new (\fBvoid\fP\fR);
++.br
++\fBvoid \fBvbuffer_free\fR\fR(\fBstruct evbuffer* \fIbuf\fP\fR);
++.br
++\fBint \fBevbuffer_add\fR\fR(\fBstruct evbuffer* \fIbuf\fP\fR, \fBconst void* \fIdata\fP\fR, \fBsize_t \fIsize\fP\fR);
++.br
++\fBint \fBevbuffer_add_buffer\fR\fR(\fBstruct evbuffer* \fIdst\fP\fR, \fBstruct evbuffer* \fIsrc\fP\fR);
++.br
++\fBint \fBevbuffer_add_printf\fR\fR(\fBstruct evbuffer* \fIbuf\fP\fR, \fBconst char* \fIfmt\fP\fR, \fB...\fP\fR);
++.br
++\fBint \fBevbuffer_add_vprintf\fR\fR(\fBstruct evbuffer* \fIbuf\fP\fR, \fBconst char* \fIfmt\fP\fR, \fBva_list \fIap\fP\fR);
++.br
++\fBvoid \fBevbuffer_drain\fR\fR(\fBstruct evbuffer* \fIbuf\fP\fR, \fBsize_t \fIsize\fP\fR);
++.br
++\fBint \fBevbuffer_write\fR\fR(\fBstruct evbuffer* \fIbuf\fP\fR, \fBint \fIfd\fP\fR);
++.br
++\fBint \fBevbuffer_read\fR\fR(\fBstruct evbuffer* \fIbuf\fP\fR, \fBint \fIfd\fP\fR, \fBint \fIsize\fP\fR);
++.br
++\fBu_char* \fBevbuffer_find\fR\fR(\fBstruct evbuffer* \fIbuf\fP\fR, \fBconst u_char* \fIdata\fP\fR, \fBsize_t \fIsize\fP\fR);
++.br
++\fBchar* \fBevbuffer_readline\fR\fR(\fBstruct evbuffer* \fIbuf\fP\fR);
++.br
++\fBint \fI(*event_sigcb)\fP\fR\fI(void)\fP\fR;
++.br
++\fBvolatile sig_atomic_t \fR\fRevent_gotsig\fP\fR;
++.br
++.SH DESCRIPTION
+ The
+-.Nm event
++\fIevent\fP\fR
+ API provides a mechanism to execute a function when a specific event
+ on a file descriptor occurs or after a given time has passed.
+-.Pp
++.PP
+ The
+-.Nm event
++\fIevent\fP\fR
+ API needs to be initialized with
+-.Fn event_init
++\fBevent_init\fR
+ before it can be used.
+-.Pp
++.PP
+ 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.
+-.Pp
++.PP
+ In order to avoid races in signal handlers, the
+-.Nm event
++\fIevent\fP\fR
+ API provides two variables:
+-.Va event_sigcb
++\fIevent_sigcb\fP\fR
+ and
+-.Va event_gotsig .
++\fIevent_gotsig\fP\fR.
+ A signal handler
+ sets
+-.Va event_gotsig
++\fIevent_gotsig\fP\fR
+ to indicate that a signal has been received.
+ The application sets
+-.Va event_sigcb
++\fIevent_sigcb\fP\fR
+ to a callback function.
+ After the signal handler sets
+-.Va event_gotsig ,
+-.Nm event_dispatch
++\fIevent_gotsig\fP\fR,
++\fBevent_dispatch()\fP\fR
+ 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
++\fIevent\fP\fR
+ library, causing
+-.Fn event_dispatch
++\fBevent_dispatch\fP\fR
+ to terminate with
+-.Va errno
+-set to
+-.Er EINTR .
+-.Pp
++\fIerrno\fP\fR
++set to EINTR.
++.PO
+ The
+-.Nm event_loop
++\fIevent_loop\fP\fR
+ function provides an interface for single pass execution of pending
+ events.
+ The flags
+-.Va EVLOOP_ONCE
+-and
+-.Va EVLOOP_NONBLOCK
+-are recognized.
++EVLOOP_ONCE and EVLOOP_NONBLOCK are recognized.
+ The
+-.Nm event_loopexit
++\fIevent_loopexit\fP\fR
+ 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.
+-.Pp
++.PP
+ It is the responsibility of the caller to provide these functions with
+ pre-allocated event structures.
+-.Pp
++.PP
+ The function
+-.Fn event_set
++\fBevent_set\fP\fR
+ prepares the event structure
+-.Fa ev
++\fIev\fP\fR
+ to be used in future calls to
+-.Fn event_add
++\fBevent_add\fP\fR
+ and
+-.Fn event_del .
++\fBevent_del\fP\fR .
+ The event will be prepared to call the function specified by the
+-.Fa fn
++\fIfn\fP\fR
+ argument with an
+-.Fa int
++\fIint\fP\fR
+ argument indicating the file descriptor, a
+-.Fa short
++\fIshort\fP\fR
+ argument indicating the type of event, and a
+-.Fa void *
++\fIvoid*\fP\fR
+ argument given in the
+-.Fa arg
++\fIarg\fP\fR
+ argument.
+-The
+-.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.
+-.Pp
++.PP
+ The function
+-.Fa fn
++\fIfn\fP\fR
+ will be called with the file descriptor that triggered the event and
+-the type of event which will be either
+-.Va EV_TIMEOUT ,
+-.Va EV_SIGNAL ,
+-.Va EV_READ ,
+-or
+-.Va EV_WRITE .
+-The additional flag
+-.Va EV_PERSIST
+-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
++\fIevent_del\fP\fR
+ has been called.
+-.Pp
++.PP
+ Once initialized, the
+-.Fa ev
++\fIev\fP\fR
+ structure can be used repeatedly with
+-.Fn event_add
++\fIevent_add\fP\fR
+ and
+-.Fn event_del
++\fIevent_del\fP\fR
+ 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
++\fIev\fP\fR
+ structure has been added to libevent using
+-.Fn event_add
++\fIevent_add\fP\fR
+ the structure must persist until the event occurs (assuming
+-.Fa EV_PERSIST
+-is not set) or is removed
+-using
+-.Fn event_del .
++EV_PERSIST is not set) or is removed using
++\fIevent_del\fP\fR .
+ You may not reuse the same
+-.Fa ev
++\fIev\fP\fR
+ structure for multiple monitored descriptors; each descriptor
+-needs its own
+-.Fa ev .
+-.Pp
++needs its own \fIev\fP\fR .
++.PP
+ The function
+-.Fn event_add
++\fIevent_add\fP\fR
+ schedules the execution of the
+-.Fa ev
++\fIev\fP\fR
+ event when the event specified in
+-.Fn event_set
++\fBevent_set\fP\fR
+ occurs or in at least the time specified in the
+-.Fa tv .
++\fItv\fP\fR .
+ If
+-.Fa tv
+-is
+-.Dv NULL ,
+-no timeout occurs and the function will only be called
++\fItv\fP\fR
++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
++\fIev\fP\fR
+ argument must be already initialized by
+-.Fn event_set
++\fIevent_set\fP\fR
+ and may not be used in calls to
+-.Fn event_set
++\fIevent_set\fP\fR
+ until it has timed out or been removed with
+-.Fn event_del .
++\fIevent_del\fP\fR .
+ If the event in the
+-.Fa ev
++\fIev\fP\fR
+ argument already has a scheduled timeout, the old timeout will be
+ replaced by the new one.
+-.Pp
++.PP
+ The function
+-.Fn event_del
++\fIevent_del\fP\fR
+ 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.
+-.Pp
++.PP
+ The function
+-.Fn event_once
++\fIevent_once\fP\fR
+ is similar to
+-.Fn event_set .
++\fIevent_set\fP\fR.
+ However, it schedules a callback to be called exactly once and does not
+ require the caller to prepare an
+-.Fa event
++\fIevent\fP\fR
+ structure.
+-This function supports
+-.Fa EV_TIMEOUT ,
+-.Fa EV_READ ,
+-and
+-.Fa EV_WRITE .
+-.Pp
++This function supports EV_TIMEOUT, EV_READ, and EV_WRITE.
++.PP
+ The
+-.Fn event_pending
++\fIevent_pending\fP\fR
+ function can be used to check if the event specified by
+-.Fa event
++\fIevent\fP\fR
+ is pending to run.
+-If
+-.Va EV_TIMEOUT
+-was specified and
+-.Fa tv
+-is not
+-.Dv NULL ,
++If EV_TIMEOUT was specified and
++\fItv\fP\fR
++is not NULL ,
+ the expiration time of the event will be returned in
+-.Fa tv .
+-.Pp
++\fItv\fP\fR .
++.PP
+ The
+-.Fn event_initialized
++\fIevent_initialized\fP\fR
+ macro can be used to check if an event has been initialized.
+-.Pp
++.PP
+ The functions
+-.Fn evtimer_set ,
+-.Fn evtimer_add ,
+-.Fn evtimer_del ,
+-.Fn evtimer_initialized ,
++\fIevtimer_set()\fP\fR,
++\fIevtimer_add()\fP\fR,
++\fIevtimer_del()\fP\fR,
++\fIevtimer_initialized()\fP\fR,
+ and
+-.Fn evtimer_pending
++\fIevtimer_pending()\fP\fR
+ are abbreviations for common situations where only a timeout is required.
+ The file descriptor passed will be \-1, and the event type will be
+-.Va EV_TIMEOUT .
+-.Pp
++EV_TIMEOUT .
++.PP
+ The functions
+-.Fn signal_set ,
+-.Fn signal_add ,
+-.Fn signal_del ,
+-.Fn signal_initialized ,
++\fIsignal_set()\fP\fR,
++\fIsignal_add()\fP]\fR,
++\fIsignal_del()\fP\fR ,
++\fIsignal_initialized()\fP\fR,
+ and
+-.Fn signal_pending
++\fIsignal_pending()\fP\fR
+ are abbreviations.
+-The event type will be a persistent
+-.Va EV_SIGNAL .
++The event type will be a persistent EV_SIGNAL .
+ That means
+-.Fn signal_set
+-adds
+-.Va EV_PERSIST .
+-.Pp
++\fIsignal_set\fP\fR adds EV_PERSIST .
++.PP
+ It is possible to disable support for
+-.Va epoll , kqueue , devpoll , poll
+-or
+-.Va select
++epoll, kqueue, devpoll, event ports, poll or select
+ by setting the environment variable
+-.Va EVENT_NOEPOLL , EVENT_NOKQUEUE , EVENT_NODEVPOLL , EVENT_NOPOLL
+-or
+-.Va EVENT_NOSELECT ,
+-respectively.
++EVENT_NOEPOLL, EVENT_NOKQUEUE, EVENT_NODEVPOLL, EVENT_NOEVPORT,
++EVENT_NOPOLL or EVENT_NOSELECT, respectively.
+ By setting the environment variable
+-.Va EVENT_SHOW_METHOD ,
+-.Nm libevent
++EVENT_SHOW_METHOD,
++\fIlibevent\fP\fR
+ displays the kernel notification method that it uses.
+-.Sh EVENT PRIORITIES
++.SH EVENT PRIORITIES
+ By default
+-.Nm libevent
++\fIlibevent\fP\fR
+ 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
++\fIlibevent\fP\fR
+ supports strict priority queues.
+ Active events with a lower priority are always processed before events
+ with a higher priority.
+-.Pp
++.PP
+ The number of different priorities can be set initially with the
+-.Fn event_priority_init
++\fIevent_priority_init()\fP\fR
+ function.
+ This function should be called before the first call to
+-.Fn event_dispatch .
++\fIevent_dispatch()\fP\fR .
+ The
+-.Fn event_priority_set
++\fIevent_priority_set()\fP\fR
+ function can be used to assign a priority to an event.
+ By default,
+-.Nm libevent
++\fIlibevent\fP\fR
+ assigns the middle priority to all events unless their priority
+ is explicitly set.
+-.Sh THREAD SAFE EVENTS
+-.Nm Libevent
++.SH THREAD SAFE EVENTS
++\fIlibevent\fP\fR
+ has experimental support for thread-safe events.
+ When initializing the library via
+-.Fn event_init ,
++\fIevent_init()\fP\fR,
+ 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
++\fIevent_base_set()\fP\fR,
++\fIevent_base_dispatch()\fP\fR,
++\fIevent_base_loop()\fP\fR,
++\fIevent_base_loopexit()\fP\fR,
++\fIbufferevent_base_set()\fP\fR
+ and
+-.Fn event_base_free .
+-.Fn event_base_set
++\fIevent_base_free()\fP\fR.
++\fIevent_base_set()\fP\fR 
+ should be called after preparing an event with
+-.Fn event_set ,
++\fIevent_set()\fP\fR,
+ as
+-.Fn event_set
++\fIevent_set()\fP\fR
+ assigns the provided event to the most recently created event base.
+-.Fn bufferevent_base_set
++\fIbufferevent_base_set()\fP\fR
+ should be called after preparing a bufferevent with
+-.Fn bufferevent_new .
+-.Fn event_base_free
++\fIbufferevent_new()\fP\fR.
++\fIevent_base_free()\fP\fR
+ should be used to free memory associated with the event base
+ when it is no longer needed.
+-.Sh BUFFERED EVENTS
+-.Nm libevent
++.SH BUFFERED EVENTS
++\fIlibevent\fP\fR
+ 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.
+-.Pp
++.PP
+ A new bufferevent is created by
+-.Fn bufferevent_new .
++\fIbufferevent_new()\fP\fR.
+ The parameter
+-.Fa fd
++\fIfd\fP\fR
+ specifies the file descriptor from which data is read and written to.
+ This file descriptor is not allowed to be a
+-.Xr pipe 2 .
++\fBpipe(2)\fR.
+ 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" .
++\fIcbarg\fP\fR.
+ 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.
+-.Pp
++.PP
+ 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_READ
+-and
+-.Va EV_WRITE .
++\fIbufferevent_enable()\fP\fR and \fIbufferevent_disable()\fP\fR.
++The \fIflags\fP\fR parameter can be a combination of
++EV_READ and EV_WRITE .
+ 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.
+-.Pp
++which is 0 by default.
++.PP
+ The
+-.Fn bufferevent_write
++\fIbufferevent_write()\fP\fR
+ 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
++\fIbufferevent_write()\fP\fR
+ returns 0 on success or \-1 on failure.
+ The
+-.Fn bufferevent_read
++\fIbufferevent_read()\fP\fR
+ function is used to read data from the input buffer,
+ returning the amount of data read.
+-.Pp
++.PP
+ If multiple bases are in use, bufferevent_base_set() must be called before
+ enabling the bufferevent for the first time.
+-.Sh NON-BLOCKING HTTP SUPPORT
+-.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 .
+-.Pp
+-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.
+-.Pp
+-This section does not document all the possible function calls; please
+-check
+-.Va event.h
+-for the public interfaces.
+-.Sh RETURN VALUES
++.SH RETURN VALUES
+ Upon successful completion
+-.Fn event_add
++\fIevent_add()\fP\fR
+ and
+-.Fn event_del
++\fIevent_del()\fP\fR
+ return 0.
+ Otherwise, \-1 is returned and the global variable errno is
+ set to indicate the error.
+-.Sh SEE ALSO
+-.Xr kqueue 2 ,
+-.Xr poll 2 ,
+-.Xr select 2 ,
+-.Xr evdns 3 ,
+-.Xr timeout 9
+-.Sh HISTORY
++.SH SEE ALSO
++\fBpoll(2)\fR,
++\fBselect(3C)\fR,
++\fBport_create(3C)\fR,
++\fBtimeout(9f)\fR.
++.SH HISTORY
+ The
+-.Nm event
++\fIlibevent\fR
+ API manpage is based on the
+-.Xr timeout 9
++\fBtimeout(9)\fR
+ manpage by Artur Grabowski.
+ The port of
+-.Nm libevent
++\fBlibevent\fP\fR
+ to Windows is due to Michael A. Davis.
+ Support for real-time signals is due to Taral.
+-.Sh AUTHORS
++.SH AUTHORS
+ The
+-.Nm event
++\fIevent\fP\fR
+ library was written by Niels Provos.
+-.Sh BUGS
++.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.
++
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/libevent/patches/evport.patch	Thu Apr 28 21:37:41 2011 -0700
@@ -0,0 +1,206 @@
+--- libevent-1.3e/evport.c.orig	Wed Apr 27 12:05:27 2011
++++ libevent-1.3e/evport.c	Wed Apr 27 12:05:41 2011
+@@ -12,20 +12,20 @@
+  * 3. The name of the author may not be used to endorse or promote products
+  *    derived from this software without specific prior written permission.
+  *
+- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ * THIS SOFTWARE IS PROVIDED BY SUN MICROSYSTEMS, INC. ``AS IS'' AND ANY
++ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
++ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ * DISCLAIMED. IN NO EVENT SHALL SUN MICROSYSTEMS, INC. BE LIABLE FOR ANY
++ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
++ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
++ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+  */
+ 
+ /*
+- * Copyright (c) 2006 Sun Microsystems. All rights reserved.
++ * Copyright (c) 2007 Sun Microsystems. All rights reserved.
+  * Use is subject to license terms.
+  */
+ 
+@@ -118,7 +118,7 @@
+ 	int		ed_nevents;	/* number of allocated fdi's 	 */
+ 	struct fd_info *ed_fds;		/* allocated fdi table 		 */
+ 	/* fdi's that we need to reassoc */
+-	struct fd_info *ed_pending[EVENTS_PER_GETN];
++	int ed_pending[EVENTS_PER_GETN]; /* fd's with pending events */
+ };
+ 
+ static void*	evport_init	(struct event_base *);
+@@ -146,6 +146,7 @@
+ evport_init(struct event_base *base)
+ {
+ 	struct evport_data *evpd;
++	int i;
+ 	/*
+ 	 * Disable event ports when this environment variable is set 
+ 	 */
+@@ -170,7 +171,8 @@
+ 		return (NULL);
+ 	}
+ 	evpd->ed_nevents = DEFAULT_NFDS;
+-	memset(&evpd->ed_pending, 0, EVENTS_PER_GETN * sizeof(struct fd_info*));
++	for (i = 0; i < EVENTS_PER_GETN; i++)
++		evpd->ed_pending[i] = -1;
+ 
+ 	evsignal_init(base);
+ 
+@@ -254,15 +256,6 @@
+ 	epdp->ed_fds = tmp;
+ 	memset((char*) (epdp->ed_fds + oldsize), 0, 
+ 	    (newsize - oldsize)*sizeof(struct fd_info));
+-
+-	/* The ev_pending array contains pointers into the released array. */
+-	for (ii = 0; ii < EVENTS_PER_GETN; ++ii) {
+-		if (epdp->ed_pending[ii] != 0) {
+-			int offset = epdp->ed_pending[ii] - old;
+-			epdp->ed_pending[ii] = epdp->ed_fds + offset;
+-		}
+-	}
+-        
+ 	epdp->ed_nevents = newsize;
+ 
+ 	check_evportop(epdp);
+@@ -281,16 +274,11 @@
+ 	int sysevents = FDI_TO_SYSEVENTS(fdip);
+ 
+ 	if (sysevents != 0) {
+-		if ((-1 == port_associate(epdp->ed_port, PORT_SOURCE_FD,
+-		    fd, sysevents, NULL))) {
+-			perror("port_associate");
++		if (port_associate(epdp->ed_port, PORT_SOURCE_FD,
++				   fd, sysevents, NULL) == -1) {
++			event_warn("port_associate");
+ 			return (-1);
+ 		}
+-	} else {
+-		if (-1 == port_dissociate(epdp->ed_port, PORT_SOURCE_FD, fd)) {
+-			perror("port_dissociate");
+-			return (-1);
+-		}
+ 	}
+ 
+ 	check_evportop(epdp);
+@@ -337,13 +325,16 @@
+ 	 * loop below.
+ 	 */
+ 	for (i = 0; i < EVENTS_PER_GETN; ++i) {
+-		struct fd_info *fdi = epdp->ed_pending[i];
++		struct fd_info *fdi = NULL;
++		if (epdp->ed_pending[i] != -1) {
++			fdi = &(epdp->ed_fds[epdp->ed_pending[i]]);
++		}
+ 
+ 		if (fdi != NULL && FDI_HAS_EVENTS(fdi)) {
+ 			int fd = FDI_HAS_READ(fdi) ? fdi->fdi_revt->ev_fd : 
+ 			    fdi->fdi_wevt->ev_fd;
+ 			reassociate(epdp, fdi, fd);
+-			epdp->ed_pending[i] = NULL;
++			epdp->ed_pending[i] = -1;
+ 		}
+ 	}
+ 
+@@ -356,7 +347,7 @@
+ 			if (nevents == 0)
+ 				return (0);
+ 		} else {
+-			perror("port_getn");
++			event_warn("port_getn");
+ 			return (-1);
+ 		}
+ 	} else if (base->sig.evsignal_caught) {
+@@ -373,6 +364,7 @@
+ 
+ 		check_evportop(epdp);
+ 		check_event(pevt);
++		epdp->ed_pending[i] = fd;
+ 
+ 		/*
+ 		 * Figure out what kind of event it was 
+@@ -405,19 +397,6 @@
+ 				event_del(ev);
+ 			event_active(ev, res, 1);
+ 		}
+-
+-		/*
+-		 * If there are still events (they haven't been deleted), then
+-		 * we must reassociate the port, since the event port interface
+-		 * dissociates them automatically. 
+-		 *
+-		 * But we can't do it right away, because the event hasn't
+-		 * handled this event yet, so of course there's still data
+-		 * waiting!
+-		 */
+-		if(FDI_HAS_EVENTS(fdi)) {
+-			epdp->ed_pending[i] = fdi;
+-		}
+ 	} /* end of all events gotten */
+ 
+ 	check_evportop(epdp);
+@@ -491,6 +470,8 @@
+ {
+ 	struct evport_data *evpd = arg;
+ 	struct fd_info *fdi;
++	int i;
++	int associated = 1;
+ 
+ 	check_evportop(evpd);
+ 
+@@ -505,6 +486,12 @@
+ 		return (-1);
+ 	}
+ 
++	for (i = 0; i < EVENTS_PER_GETN; ++i) {
++		if (evpd->ed_pending[i] == ev->ev_fd) {
++			associated = 0;
++			break;
++		}
++	}
+ 
+ 	fdi = &evpd->ed_fds[ev->ev_fd];
+ 	if (ev->ev_events & EV_READ)
+@@ -512,7 +499,29 @@
+ 	if (ev->ev_events & EV_WRITE)
+ 		fdi->fdi_wevt = NULL;
+ 
+-	return reassociate(evpd, fdi, ev->ev_fd);
++	if (associated) {
++		if (!FDI_HAS_EVENTS(fdi) &&
++		    port_dissociate(evpd->ed_port, PORT_SOURCE_FD,
++		    ev->ev_fd) == -1) {	 
++			/*
++			 * Ignre EBADFD error the fd could have been closed
++			 * before event_del() was called.
++			 */
++			if (errno != EBADFD) {
++				event_warn("port_dissociate");
++				return (-1);
++			}
++		} else {
++			if (FDI_HAS_EVENTS(fdi)) {
++				return (reassociate(evpd, fdi, ev->ev_fd));
++			}
++		}
++	} else {
++		if (fdi->fdi_revt == NULL && fdi->fdi_wevt == NULL) {
++			evpd->ed_pending[i] = -1;
++		}
++	}
++	return 0;
+ }
+ 
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/libevent/patches/http.patch	Thu Apr 28 21:37:41 2011 -0700
@@ -0,0 +1,18 @@
+--- libevent-1.3e/http.c.orig	Wed Apr 27 12:06:56 2011
++++ libevent-1.3e/http.c	Wed Apr 27 12:07:14 2011
+@@ -157,10 +157,13 @@
+ 		return NULL;
+ 	tok = *s;
+ 	d = strstr(tok, del);
+-	if (d)
++	if (d) {
+ 		*s = d + strlen(del);
+-	else
++		d[0]='\0';
++	} else {
+ 		*s = NULL;
++	}
++
+ 	return tok;
+ }
+ #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/meta-packages/history/SUNWlibevent.p5m	Thu Apr 28 21:37:41 2011 -0700
@@ -0,0 +1,29 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+#
+
+set name=pkg.fmri value=pkg:/[email protected],5.11-0.133
+set name=pkg.renamed value=true
+
+set name=org.opensolaris.consolidation value=$(CONSOLIDATION)
+
+depend fmri=library/[email protected] type=require