[packages] php5: Remove all patched-in pecl modules, prepare for
[packages.git] / lang / php5 / patches / 020-PECL-add-libevent.patch
diff --git a/lang/php5/patches/020-PECL-add-libevent.patch b/lang/php5/patches/020-PECL-add-libevent.patch
deleted file mode 100644 (file)
index 7e8ede6..0000000
+++ /dev/null
@@ -1,1857 +0,0 @@
---- /dev/null
-+++ b/ext/libevent/CREDITS
-@@ -0,0 +1 @@
-+Antony Dovgal, Arnaud Le Blanc
---- /dev/null
-+++ b/ext/libevent/config.m4
-@@ -0,0 +1,52 @@
-+dnl $Id: config.m4 287913 2009-08-31 08:45:42Z tony2001 $
-+
-+PHP_ARG_WITH(libevent, for libevent support,
-+[  --with-libevent             Include libevent support])
-+
-+if test "$PHP_LIBEVENT" != "no"; then
-+  SEARCH_PATH="/usr /usr/local"
-+  SEARCH_FOR="/include/event.h"
-+
-+  if test "$PHP_LIBEVENT" = "yes"; then
-+    AC_MSG_CHECKING([for libevent headers in default path])
-+    for i in $SEARCH_PATH ; do
-+      if test -r $i/$SEARCH_FOR; then
-+        LIBEVENT_DIR=$i
-+        AC_MSG_RESULT(found in $i)
-+      fi
-+    done
-+  else
-+    AC_MSG_CHECKING([for libevent headers in $PHP_LIBEVENT])
-+    if test -r $PHP_LIBEVENT/$SEARCH_FOR; then
-+      LIBEVENT_DIR=$PHP_LIBEVENT
-+      AC_MSG_RESULT([found])
-+    fi
-+  fi
-+
-+  if test -z "$LIBEVENT_DIR"; then
-+    AC_MSG_RESULT([not found])
-+    AC_MSG_ERROR([Cannot find libevent headers])
-+  fi
-+
-+  PHP_ADD_INCLUDE($LIBEVENT_DIR/include)
-+
-+  LIBNAME=event
-+  LIBSYMBOL=event_base_new
-+
-+  if test "x$PHP_LIBDIR" = "x"; then
-+    PHP_LIBDIR=lib
-+  fi
-+
-+  PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
-+  [
-+    PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $LIBEVENT_DIR/$PHP_LIBDIR, LIBEVENT_SHARED_LIBADD)
-+  ],[
-+    AC_MSG_ERROR([wrong libevent version {1.4.+ is required} or lib not found])
-+  ],[
-+    -L$LIBEVENT_DIR/$PHP_LIBDIR 
-+  ])
-+
-+  PHP_ADD_EXTENSION_DEP(libevent, sockets, true)
-+  PHP_SUBST(LIBEVENT_SHARED_LIBADD)
-+  PHP_NEW_EXTENSION(libevent, libevent.c, $ext_shared)
-+fi
---- /dev/null
-+++ b/ext/libevent/libevent.c
-@@ -0,0 +1,1663 @@
-+/*
-+  +----------------------------------------------------------------------+
-+  | PHP Version 5                                                        |
-+  +----------------------------------------------------------------------+
-+  | Copyright (c) 1997-2008 The PHP Group                                |
-+  +----------------------------------------------------------------------+
-+  | This source file is subject to version 3.01 of the PHP license,      |
-+  | that is bundled with this package in the file LICENSE, and is        |
-+  | available through the world-wide-web at the following url:           |
-+  | http://www.php.net/license/3_01.txt                                  |
-+  | If you did not receive a copy of the PHP license and are unable to   |
-+  | obtain it through the world-wide-web, please send a note to          |
-+  | license@php.net so we can mail you a copy immediately.               |
-+  +----------------------------------------------------------------------+
-+  | Author: Antony Dovgal <tony@daylessday.org>                          |
-+  |         Arnaud Le Blanc <lbarnaud@php.net>                           |
-+  +----------------------------------------------------------------------+
-+*/
-+
-+/* $Id: libevent.c 318910 2011-11-08 12:34:37Z tony2001 $ */
-+
-+#ifdef HAVE_CONFIG_H
-+#include "config.h"
-+#endif
-+
-+#include "php.h"
-+#include "php_ini.h"
-+#include "ext/standard/info.h"
-+#include "php_streams.h"
-+#include "php_network.h"
-+#include "php_libevent.h"
-+
-+#include <signal.h>
-+
-+#if PHP_VERSION_ID >= 50301 && (HAVE_SOCKETS || defined(COMPILE_DL_SOCKETS))
-+# include "ext/sockets/php_sockets.h"
-+# define LIBEVENT_SOCKETS_SUPPORT
-+#endif
-+
-+#ifndef ZEND_FETCH_RESOURCE_NO_RETURN 
-+# define ZEND_FETCH_RESOURCE_NO_RETURN(rsrc, rsrc_type, passed_id, default_id, resource_type_name, resource_type) \
-+      (rsrc = (rsrc_type) zend_fetch_resource(passed_id TSRMLS_CC, default_id, resource_type_name, NULL, 1, resource_type))
-+#endif
-+
-+#include <event.h>
-+
-+#if PHP_MAJOR_VERSION < 5
-+# ifdef PHP_WIN32
-+typedef SOCKET php_socket_t;
-+# else
-+typedef int php_socket_t;
-+# endif
-+
-+# ifdef ZTS
-+#  define TSRMLS_FETCH_FROM_CTX(ctx)  void ***tsrm_ls = (void ***) ctx
-+#  define TSRMLS_SET_CTX(ctx)     ctx = (void ***) tsrm_ls
-+# else
-+#  define TSRMLS_FETCH_FROM_CTX(ctx)
-+#  define TSRMLS_SET_CTX(ctx)
-+# endif
-+
-+# ifndef Z_ADDREF_P
-+#  define Z_ADDREF_P(x) (x)->refcount++
-+# endif
-+#endif
-+
-+static int le_event_base;
-+static int le_event;
-+static int le_bufferevent;
-+
-+#ifdef COMPILE_DL_LIBEVENT
-+ZEND_GET_MODULE(libevent)
-+#endif
-+
-+typedef struct _php_event_base_t { /* {{{ */
-+      struct event_base *base;
-+      int rsrc_id;
-+      zend_uint events;
-+} php_event_base_t;
-+/* }}} */
-+
-+typedef struct _php_event_callback_t { /* {{{ */
-+      zval *func;
-+      zval *arg;
-+} php_event_callback_t;
-+/* }}} */
-+
-+typedef struct _php_event_t { /* {{{ */
-+      struct event *event;
-+      int rsrc_id;
-+      int stream_id;
-+      php_event_base_t *base;
-+      php_event_callback_t *callback;
-+#ifdef ZTS
-+      void ***thread_ctx;
-+#endif
-+      int in_free;
-+} php_event_t;
-+/* }}} */
-+
-+typedef struct _php_bufferevent_t { /* {{{ */
-+      struct bufferevent *bevent;
-+      int rsrc_id;
-+      php_event_base_t *base;
-+      zval *readcb;
-+      zval *writecb;
-+      zval *errorcb;
-+      zval *arg;
-+#ifdef ZTS
-+      void ***thread_ctx;
-+#endif
-+} php_bufferevent_t;
-+/* }}} */
-+
-+#define ZVAL_TO_BASE(zval, base) \
-+      ZEND_FETCH_RESOURCE(base, php_event_base_t *, &zval, -1, "event base", le_event_base)
-+
-+#define ZVAL_TO_EVENT(zval, event) \
-+      ZEND_FETCH_RESOURCE(event, php_event_t *, &zval, -1, "event", le_event)
-+
-+#define ZVAL_TO_BEVENT(zval, bevent) \
-+      ZEND_FETCH_RESOURCE(bevent, php_bufferevent_t *, &zval, -1, "buffer event", le_bufferevent)
-+
-+/* {{{ internal funcs */
-+
-+static inline void _php_event_callback_free(php_event_callback_t *callback) /* {{{ */
-+{
-+      if (!callback) {
-+              return;
-+      }
-+
-+      zval_ptr_dtor(&callback->func);
-+      if (callback->arg) {
-+              zval_ptr_dtor(&callback->arg);
-+      }
-+      efree(callback);
-+}
-+/* }}} */
-+
-+static void _php_event_base_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ */
-+{
-+      php_event_base_t *base = (php_event_base_t*)rsrc->ptr;
-+
-+      event_base_free(base->base);
-+      efree(base);
-+}
-+/* }}} */
-+
-+static void _php_event_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ */
-+{
-+      php_event_t *event = (php_event_t*)rsrc->ptr;
-+      int base_id = -1;
-+
-+      if (event->in_free) {
-+              return;
-+      }
-+
-+      event->in_free = 1;
-+
-+      if (event->base) {
-+              base_id = event->base->rsrc_id;
-+              --event->base->events;
-+      }
-+      if (event->stream_id >= 0) {
-+              zend_list_delete(event->stream_id);
-+      }
-+      event_del(event->event);
-+
-+      _php_event_callback_free(event->callback);
-+      efree(event->event);
-+      efree(event);
-+
-+      if (base_id >= 0) {
-+              zend_list_delete(base_id);
-+      }
-+}
-+/* }}} */
-+
-+static void _php_bufferevent_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ */
-+{
-+      php_bufferevent_t *bevent = (php_bufferevent_t*)rsrc->ptr;
-+      int base_id = -1;
-+
-+      if (bevent->base) {
-+              base_id = bevent->base->rsrc_id;
-+              --bevent->base->events;
-+      }
-+      if (bevent->readcb) {
-+              zval_ptr_dtor(&(bevent->readcb));
-+      }
-+      if (bevent->writecb) {
-+              zval_ptr_dtor(&(bevent->writecb));
-+      }
-+      if (bevent->errorcb) {
-+              zval_ptr_dtor(&(bevent->errorcb));
-+      }
-+      if (bevent->arg) {
-+              zval_ptr_dtor(&(bevent->arg));
-+      }
-+
-+      bufferevent_free(bevent->bevent);
-+      efree(bevent);
-+
-+      if (base_id >= 0) {
-+              zend_list_delete(base_id);
-+      }
-+}
-+/* }}} */
-+
-+static void _php_event_callback(int fd, short events, void *arg) /* {{{ */
-+{
-+      zval *args[3];
-+      php_event_t *event = (php_event_t *)arg;
-+      php_event_callback_t *callback;
-+      zval retval;
-+      TSRMLS_FETCH_FROM_CTX(event ? event->thread_ctx : NULL);
-+
-+      if (!event || !event->callback || !event->base) {
-+              return;
-+      }
-+
-+      callback = event->callback;
-+
-+      MAKE_STD_ZVAL(args[0]);
-+      if (event->stream_id >= 0) {
-+              ZVAL_RESOURCE(args[0], event->stream_id);
-+              zend_list_addref(event->stream_id);
-+      } else {
-+              ZVAL_NULL(args[0]);
-+      }
-+      
-+      MAKE_STD_ZVAL(args[1]);
-+      ZVAL_LONG(args[1], events);
-+
-+      args[2] = callback->arg;
-+      Z_ADDREF_P(callback->arg);
-+      
-+      if (call_user_function(EG(function_table), NULL, callback->func, &retval, 3, args TSRMLS_CC) == SUCCESS) {
-+              zval_dtor(&retval);
-+      }
-+
-+      zval_ptr_dtor(&(args[0]));
-+      zval_ptr_dtor(&(args[1]));
-+      zval_ptr_dtor(&(args[2])); 
-+      
-+}
-+/* }}} */
-+
-+static void _php_bufferevent_readcb(struct bufferevent *be, void *arg) /* {{{ */
-+{
-+      zval *args[2];
-+      zval retval;
-+      php_bufferevent_t *bevent = (php_bufferevent_t *)arg;
-+      TSRMLS_FETCH_FROM_CTX(bevent ? bevent->thread_ctx : NULL);
-+
-+      if (!bevent || !bevent->base || !bevent->readcb) {
-+              return;
-+      }
-+
-+      MAKE_STD_ZVAL(args[0]);
-+      ZVAL_RESOURCE(args[0], bevent->rsrc_id);
-+      zend_list_addref(bevent->rsrc_id); /* we do refcount-- later in zval_ptr_dtor */
-+      
-+      args[1] = bevent->arg;
-+      Z_ADDREF_P(args[1]);
-+      
-+      if (call_user_function(EG(function_table), NULL, bevent->readcb, &retval, 2, args TSRMLS_CC) == SUCCESS) {
-+              zval_dtor(&retval);
-+      }
-+
-+      zval_ptr_dtor(&(args[0]));
-+      zval_ptr_dtor(&(args[1])); 
-+
-+}
-+/* }}} */
-+
-+static void _php_bufferevent_writecb(struct bufferevent *be, void *arg) /* {{{ */
-+{
-+      zval *args[2];
-+      zval retval;
-+      php_bufferevent_t *bevent = (php_bufferevent_t *)arg;
-+      TSRMLS_FETCH_FROM_CTX(bevent ? bevent->thread_ctx : NULL);
-+
-+      if (!bevent || !bevent->base || !bevent->writecb) {
-+              return;
-+      }
-+
-+      MAKE_STD_ZVAL(args[0]);
-+      ZVAL_RESOURCE(args[0], bevent->rsrc_id);
-+      zend_list_addref(bevent->rsrc_id); /* we do refcount-- later in zval_ptr_dtor */
-+      
-+      args[1] = bevent->arg;
-+      Z_ADDREF_P(args[1]);
-+      
-+      if (call_user_function(EG(function_table), NULL, bevent->writecb, &retval, 2, args TSRMLS_CC) == SUCCESS) {
-+              zval_dtor(&retval);
-+      }
-+
-+      zval_ptr_dtor(&(args[0]));
-+      zval_ptr_dtor(&(args[1])); 
-+      
-+}
-+/* }}} */
-+
-+static void _php_bufferevent_errorcb(struct bufferevent *be, short what, void *arg) /* {{{ */
-+{
-+      zval *args[3];
-+      zval retval;
-+      php_bufferevent_t *bevent = (php_bufferevent_t *)arg;
-+      TSRMLS_FETCH_FROM_CTX(bevent ? bevent->thread_ctx : NULL);
-+
-+      if (!bevent || !bevent->base || !bevent->errorcb) {
-+              return;
-+      }
-+
-+      MAKE_STD_ZVAL(args[0]);
-+      ZVAL_RESOURCE(args[0], bevent->rsrc_id);
-+      zend_list_addref(bevent->rsrc_id); /* we do refcount-- later in zval_ptr_dtor */
-+      
-+      MAKE_STD_ZVAL(args[1]);
-+      ZVAL_LONG(args[1], what);
-+
-+      args[2] = bevent->arg;
-+      Z_ADDREF_P(args[2]);
-+      
-+      if (call_user_function(EG(function_table), NULL, bevent->errorcb, &retval, 3, args TSRMLS_CC) == SUCCESS) {
-+              zval_dtor(&retval);
-+      }
-+
-+      zval_ptr_dtor(&(args[0]));
-+      zval_ptr_dtor(&(args[1]));
-+      zval_ptr_dtor(&(args[2])); 
-+      
-+}
-+/* }}} */
-+
-+/* }}} */
-+
-+
-+/* {{{ proto resource event_base_new() 
-+ */
-+static PHP_FUNCTION(event_base_new)
-+{
-+      php_event_base_t *base;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") != SUCCESS) {
-+              return;
-+      }
-+
-+      base = emalloc(sizeof(php_event_base_t));
-+      base->base = event_base_new();
-+      if (!base->base) {
-+              efree(base);
-+              RETURN_FALSE;
-+      }
-+
-+      base->events = 0;
-+
-+#if PHP_MAJOR_VERSION >= 5 && PHP_MINOR_VERSION >= 4
-+      base->rsrc_id = zend_list_insert(base, le_event_base TSRMLS_CC);
-+#else
-+      base->rsrc_id = zend_list_insert(base, le_event_base);
-+#endif
-+      RETURN_RESOURCE(base->rsrc_id);
-+}
-+/* }}} */
-+
-+/* {{{ proto void event_base_free(resource base) 
-+ */
-+static PHP_FUNCTION(event_base_free)
-+{
-+      zval *zbase;
-+      php_event_base_t *base;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zbase) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_BASE(zbase, base);
-+
-+      if (base->events > 0) {
-+              php_error_docref(NULL TSRMLS_CC, E_WARNING, "base has events attached to it and cannot be freed");
-+              RETURN_FALSE;
-+      }
-+
-+      zend_list_delete(base->rsrc_id);
-+}
-+/* }}} */
-+
-+/* {{{ proto int event_base_loop(resource base[, int flags]) 
-+ */
-+static PHP_FUNCTION(event_base_loop)
-+{
-+      zval *zbase;
-+      php_event_base_t *base;
-+      long flags = 0;
-+      int ret;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &zbase, &flags) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_BASE(zbase, base);
-+      zend_list_addref(base->rsrc_id); /* make sure the base cannot be destroyed during the loop */
-+      ret = event_base_loop(base->base, flags);
-+      zend_list_delete(base->rsrc_id);
-+
-+      RETURN_LONG(ret);
-+}
-+/* }}} */
-+
-+/* {{{ proto bool event_base_loopbreak(resource base) 
-+ */
-+static PHP_FUNCTION(event_base_loopbreak)
-+{
-+      zval *zbase;
-+      php_event_base_t *base;
-+      int ret;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zbase) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_BASE(zbase, base);
-+      ret = event_base_loopbreak(base->base);
-+      if (ret == 0) {
-+              RETURN_TRUE;
-+      }
-+      RETURN_FALSE;
-+}
-+/* }}} */
-+
-+/* {{{ proto bool event_base_loopexit(resource base[, int timeout]) 
-+ */
-+static PHP_FUNCTION(event_base_loopexit)
-+{
-+      zval *zbase;
-+      php_event_base_t *base;
-+      int ret;
-+      long timeout = -1;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &zbase, &timeout) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_BASE(zbase, base);
-+
-+      if (timeout < 0) {
-+              ret = event_base_loopexit(base->base, NULL);
-+      } else {
-+              struct timeval time;
-+              
-+              time.tv_usec = timeout % 1000000;
-+              time.tv_sec = timeout / 1000000;
-+              ret = event_base_loopexit(base->base, &time);
-+      }
-+
-+      if (ret == 0) {
-+              RETURN_TRUE;
-+      }
-+      RETURN_FALSE;
-+}
-+/* }}} */
-+
-+/* {{{ proto bool event_base_set(resource event, resource base) 
-+ */
-+static PHP_FUNCTION(event_base_set)
-+{
-+      zval *zbase, *zevent;
-+      php_event_base_t *base, *old_base;
-+      php_event_t *event;
-+      int ret;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rr", &zevent, &zbase) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_BASE(zbase, base);
-+      ZVAL_TO_EVENT(zevent, event);
-+
-+      old_base = event->base;
-+      ret = event_base_set(base->base, event->event);
-+
-+      if (ret == 0) {
-+              if (base != old_base) {
-+                      /* make sure the base is destroyed after the event */
-+                      zend_list_addref(base->rsrc_id);
-+                      ++base->events;
-+              }
-+
-+              if (old_base) {
-+                      --old_base->events;
-+                      zend_list_delete(old_base->rsrc_id);
-+              }
-+
-+              event->base = base;
-+              RETURN_TRUE;
-+      }
-+      RETURN_FALSE;
-+}
-+/* }}} */
-+
-+/* {{{ proto bool event_base_priority_init(resource base, int npriorities) 
-+ */
-+static PHP_FUNCTION(event_base_priority_init)
-+{
-+      zval *zbase;
-+      php_event_base_t *base;
-+      long npriorities;
-+      int ret;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &zbase, &npriorities) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_BASE(zbase, base);
-+
-+      if (npriorities < 0) {
-+              php_error_docref(NULL TSRMLS_CC, E_WARNING, "npriorities cannot be less than zero");
-+              RETURN_FALSE;
-+      }
-+
-+      ret = event_base_priority_init(base->base, npriorities);
-+      if (ret == 0) {
-+              RETURN_TRUE;
-+      }
-+      RETURN_FALSE;
-+}
-+/* }}} */
-+
-+
-+/* {{{ proto resource event_new() 
-+ */
-+static PHP_FUNCTION(event_new)
-+{
-+      php_event_t *event;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") != SUCCESS) {
-+              return;
-+      }
-+
-+      event = emalloc(sizeof(php_event_t));
-+      event->event = ecalloc(1, sizeof(struct event));
-+
-+      event->stream_id = -1;
-+      event->callback = NULL;
-+      event->base = NULL;
-+      event->in_free = 0;
-+      TSRMLS_SET_CTX(event->thread_ctx);
-+
-+#if PHP_MAJOR_VERSION >= 5 && PHP_MINOR_VERSION >= 4
-+      event->rsrc_id = zend_list_insert(event, le_event TSRMLS_CC);
-+#else
-+      event->rsrc_id = zend_list_insert(event, le_event);
-+#endif
-+      RETURN_RESOURCE(event->rsrc_id);
-+}
-+/* }}} */
-+
-+/* {{{ proto void event_free(resource event) 
-+ */
-+static PHP_FUNCTION(event_free)
-+{
-+      zval *zevent;
-+      php_event_t *event;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zevent) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_EVENT(zevent, event);
-+      zend_list_delete(event->rsrc_id);
-+}
-+/* }}} */
-+
-+/* {{{ proto bool event_add(resource event[, int timeout])
-+ */
-+static PHP_FUNCTION(event_add)
-+{
-+      zval *zevent;
-+      php_event_t *event;
-+      int ret;
-+      long timeout = -1;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &zevent, &timeout) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_EVENT(zevent, event);
-+
-+      if (!event->base) {
-+              php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to add event without an event base");
-+              RETURN_FALSE;
-+      }
-+
-+      if (timeout < 0) {
-+              ret = event_add(event->event, NULL);
-+      } else {
-+              struct timeval time;
-+              
-+              time.tv_usec = timeout % 1000000;
-+              time.tv_sec = timeout / 1000000;
-+              ret = event_add(event->event, &time);
-+      }
-+
-+      if (ret != 0) {
-+              RETURN_FALSE;
-+      }
-+
-+      RETURN_TRUE;
-+}
-+/* }}} */
-+
-+/* {{{ proto bool event_set(resource event, mixed fd, int events, mixed callback[, mixed arg]) 
-+ */
-+static PHP_FUNCTION(event_set)
-+{
-+      zval *zevent, **fd, *zcallback, *zarg = NULL;
-+      php_event_t *event;
-+      long events;
-+      php_event_callback_t *callback, *old_callback;
-+      char *func_name;
-+      php_stream *stream;
-+      php_socket_t file_desc;
-+#ifdef LIBEVENT_SOCKETS_SUPPORT
-+      php_socket *php_sock;
-+#endif
-+      int ret;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rZlz|z", &zevent, &fd, &events, &zcallback, &zarg) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_EVENT(zevent, event);
-+
-+      if (events & EV_SIGNAL) {
-+              /* signal support */
-+              convert_to_long_ex(fd);
-+              file_desc = Z_LVAL_PP(fd);
-+              if (file_desc < 0 || file_desc >= NSIG) {
-+                      php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid signal passed");
-+                      RETURN_FALSE;
-+              }
-+      } else {
-+              if (Z_TYPE_PP(fd) == IS_RESOURCE) {
-+                      if (ZEND_FETCH_RESOURCE_NO_RETURN(stream, php_stream *, fd, -1, NULL, php_file_le_stream())) {
-+                              if (php_stream_cast(stream, PHP_STREAM_AS_FD_FOR_SELECT | PHP_STREAM_CAST_INTERNAL, (void*)&file_desc, 1) != SUCCESS || file_desc < 0) {
-+                                      RETURN_FALSE;
-+                              }
-+                      } else {
-+#ifdef LIBEVENT_SOCKETS_SUPPORT
-+                              if (ZEND_FETCH_RESOURCE_NO_RETURN(php_sock, php_socket *, fd, -1, NULL, php_sockets_le_socket())) {
-+                                      file_desc = php_sock->bsd_socket;
-+                              } else {
-+                                      php_error_docref(NULL TSRMLS_CC, E_WARNING, "fd argument must be either valid PHP stream or valid PHP socket resource");
-+                                      RETURN_FALSE;
-+                              }
-+#else
-+                              php_error_docref(NULL TSRMLS_CC, E_WARNING, "fd argument must be valid PHP stream resource");
-+                              RETURN_FALSE;
-+#endif
-+                      }
-+              } else if (Z_TYPE_PP(fd) == IS_LONG) {
-+                      file_desc = Z_LVAL_PP(fd);
-+                      if (file_desc < 0) {
-+                              php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid file descriptor passed");
-+                              RETURN_FALSE;
-+                      }
-+              } else {
-+#ifdef LIBEVENT_SOCKETS_SUPPORT
-+                      php_error_docref(NULL TSRMLS_CC, E_WARNING, "fd argument must be valid PHP stream or socket resource or a file descriptor of type long");
-+#else
-+                      php_error_docref(NULL TSRMLS_CC, E_WARNING, "fd argument must be valid PHP stream resource or a file descriptor of type long");
-+#endif
-+                      RETURN_FALSE;
-+              }
-+      }
-+
-+      if (!zend_is_callable(zcallback, 0, &func_name TSRMLS_CC)) {
-+              php_error_docref(NULL TSRMLS_CC, E_WARNING, "'%s' is not a valid callback", func_name);
-+              efree(func_name);
-+              RETURN_FALSE;
-+      }
-+      efree(func_name);
-+
-+      zval_add_ref(&zcallback);
-+      if (zarg) {
-+              zval_add_ref(&zarg);
-+      } else {
-+              ALLOC_INIT_ZVAL(zarg);
-+      }
-+
-+      callback = emalloc(sizeof(php_event_callback_t));
-+      callback->func = zcallback;
-+      callback->arg = zarg;
-+
-+      old_callback = event->callback;
-+      event->callback = callback;
-+      if (events & EV_SIGNAL) {
-+              event->stream_id = -1;
-+      } else {
-+              zend_list_addref(Z_LVAL_PP(fd));
-+              event->stream_id = Z_LVAL_PP(fd);
-+      }
-+
-+      event_set(event->event, (int)file_desc, (short)events, _php_event_callback, event);
-+
-+      if (old_callback) {
-+              _php_event_callback_free(old_callback);
-+      }
-+
-+      if (event->base) {
-+              ret = event_base_set(event->base->base, event->event);
-+              if (ret != 0) {
-+                      RETURN_FALSE;
-+              }
-+      }
-+      RETURN_TRUE;
-+}
-+/* }}} */
-+
-+/* {{{ proto bool event_del(resource event) 
-+ */
-+static PHP_FUNCTION(event_del)
-+{
-+      zval *zevent;
-+      php_event_t *event;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zevent) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_EVENT(zevent, event);
-+
-+      if (!event->base) {
-+              php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to delete event without an event base");
-+              RETURN_FALSE;
-+      }
-+
-+      if (event_del(event->event) == 0) {
-+              RETURN_TRUE;
-+      }
-+      RETURN_FALSE;
-+}
-+/* }}} */
-+
-+/* {{{ proto bool event_priority_set(resource event, int priority) 
-+ */
-+static PHP_FUNCTION(event_priority_set)
-+{
-+      zval *zevent;
-+      php_event_t *event;
-+      long priority;
-+      int ret;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &zevent, &priority) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_EVENT(zevent, event);
-+
-+      if (!event->base) {
-+              php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to set event priority without an event base");
-+              RETURN_FALSE;
-+      }
-+
-+      ret = event_priority_set(event->event, priority);
-+
-+      if (ret == 0) {
-+              RETURN_TRUE;
-+      }
-+      RETURN_FALSE;
-+}
-+/* }}} */
-+
-+/* {{{ proto bool event_timer_set(resource event, mixed callback[, mixed arg]) 
-+ */
-+static PHP_FUNCTION(event_timer_set)
-+{
-+      zval *zevent, *zcallback, *zarg = NULL;
-+      php_event_t *event;
-+      php_event_callback_t *callback, *old_callback;
-+      char *func_name;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rz|z", &zevent, &zcallback, &zarg) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_EVENT(zevent, event);
-+
-+      if (!zend_is_callable(zcallback, 0, &func_name TSRMLS_CC)) {
-+              php_error_docref(NULL TSRMLS_CC, E_WARNING, "'%s' is not a valid callback", func_name);
-+              efree(func_name);
-+              RETURN_FALSE;
-+      }
-+      efree(func_name);
-+
-+      zval_add_ref(&zcallback);
-+      if (zarg) {
-+              zval_add_ref(&zarg);
-+      } else {
-+              ALLOC_INIT_ZVAL(zarg);
-+      }
-+
-+      callback = emalloc(sizeof(php_event_callback_t));
-+      callback->func = zcallback;
-+      callback->arg = zarg;
-+
-+      old_callback = event->callback;
-+      event->callback = callback;
-+      if (event->stream_id >= 0) {
-+              zend_list_delete(event->stream_id);
-+      }
-+      event->stream_id = -1;
-+
-+      event_set(event->event, -1, 0, _php_event_callback, event);
-+
-+      if (old_callback) {
-+              _php_event_callback_free(old_callback);
-+      }
-+      RETURN_TRUE;
-+}
-+/* }}} */
-+
-+/* {{{ proto bool event_timer_pending(resource event[, int timeout])
-+ */
-+static PHP_FUNCTION(event_timer_pending)
-+{
-+      zval *zevent;
-+      php_event_t *event;
-+      int ret;
-+      long timeout = -1;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &zevent, &timeout) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_EVENT(zevent, event);
-+
-+      if (timeout < 0) {
-+              ret = event_pending(event->event, EV_TIMEOUT, NULL);
-+      } else {
-+              struct timeval time;
-+              
-+              time.tv_usec = timeout % 1000000;
-+              time.tv_sec = timeout / 1000000;
-+              ret = event_pending(event->event, EV_TIMEOUT, &time);
-+      }
-+
-+      if (ret != 0) {
-+              RETURN_FALSE;
-+      }
-+      RETURN_TRUE;
-+}
-+/* }}} */
-+
-+
-+
-+/* {{{ proto resource event_buffer_new(mixed fd, mixed readcb, mixed writecb, mixed errorcb[, mixed arg]) 
-+ */
-+static PHP_FUNCTION(event_buffer_new)
-+{
-+      php_bufferevent_t *bevent;
-+      php_stream *stream;
-+      zval *zfd, *zreadcb, *zwritecb, *zerrorcb, *zarg = NULL;
-+      php_socket_t fd;
-+      char *func_name;
-+#ifdef LIBEVENT_SOCKETS_SUPPORT
-+      php_socket *php_sock;
-+#endif
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zzzz|z", &zfd, &zreadcb, &zwritecb, &zerrorcb, &zarg) != SUCCESS) {
-+              return;
-+      }
-+      
-+      if (Z_TYPE_P(zfd) == IS_RESOURCE) {
-+              if (ZEND_FETCH_RESOURCE_NO_RETURN(stream, php_stream *, &zfd, -1, NULL, php_file_le_stream())) {
-+                      if (php_stream_cast(stream, PHP_STREAM_AS_FD_FOR_SELECT | PHP_STREAM_CAST_INTERNAL, (void*)&fd, 1) != SUCCESS || fd < 0) {
-+                              RETURN_FALSE;
-+                      }
-+              } else {
-+#ifdef LIBEVENT_SOCKETS_SUPPORT
-+                      if (ZEND_FETCH_RESOURCE_NO_RETURN(php_sock, php_socket *, &zfd, -1, NULL, php_sockets_le_socket())) {
-+                              fd = php_sock->bsd_socket;
-+                      } else {
-+                              php_error_docref(NULL TSRMLS_CC, E_WARNING, "fd argument must be valid PHP stream or socket resource or a file descriptor of type long");
-+                              RETURN_FALSE;
-+                      }
-+#else
-+                      php_error_docref(NULL TSRMLS_CC, E_WARNING, "fd argument must be valid PHP stream resource or a file descriptor of type long");
-+                      RETURN_FALSE;
-+#endif
-+              }
-+      } else if (Z_TYPE_P(zfd) == IS_LONG) {
-+              fd = Z_LVAL_P(zfd);
-+      } else {
-+#ifdef LIBEVENT_SOCKETS_SUPPORT
-+              php_error_docref(NULL TSRMLS_CC, E_WARNING, "fd argument must be valid PHP stream or socket resource or a file descriptor of type long");
-+#else
-+              php_error_docref(NULL TSRMLS_CC, E_WARNING, "fd argument must be valid PHP stream resource or a file descriptor of type long");
-+#endif
-+              RETURN_FALSE;
-+      }
-+
-+      if (Z_TYPE_P(zreadcb) != IS_NULL) {
-+              if (!zend_is_callable(zreadcb, 0, &func_name TSRMLS_CC)) {
-+                      php_error_docref(NULL TSRMLS_CC, E_WARNING, "'%s' is not a valid read callback", func_name);
-+                      efree(func_name);
-+                      RETURN_FALSE;
-+              }
-+              efree(func_name);
-+      } else {
-+              zreadcb = NULL;
-+      }
-+
-+      if (Z_TYPE_P(zwritecb) != IS_NULL) {
-+              if (!zend_is_callable(zwritecb, 0, &func_name TSRMLS_CC)) {
-+                      php_error_docref(NULL TSRMLS_CC, E_WARNING, "'%s' is not a valid write callback", func_name);
-+                      efree(func_name);
-+                      RETURN_FALSE;
-+              }
-+              efree(func_name);
-+      } else {
-+              zwritecb = NULL;
-+      }
-+
-+      if (!zend_is_callable(zerrorcb, 0, &func_name TSRMLS_CC)) {
-+              php_error_docref(NULL TSRMLS_CC, E_WARNING, "'%s' is not a valid error callback", func_name);
-+              efree(func_name);
-+              RETURN_FALSE;
-+      }
-+      efree(func_name);
-+
-+      bevent = emalloc(sizeof(php_bufferevent_t));
-+      bevent->bevent = bufferevent_new(fd, _php_bufferevent_readcb, _php_bufferevent_writecb, _php_bufferevent_errorcb, bevent);
-+
-+      bevent->base = NULL;
-+
-+      if (zreadcb) {
-+              zval_add_ref(&zreadcb);
-+      }
-+      bevent->readcb = zreadcb;
-+      
-+      if (zwritecb) {
-+              zval_add_ref(&zwritecb);
-+      }
-+      bevent->writecb = zwritecb;
-+              
-+      zval_add_ref(&zerrorcb);
-+      bevent->errorcb = zerrorcb;
-+
-+      if (zarg) {
-+              zval_add_ref(&zarg);
-+              bevent->arg = zarg;
-+      } else {
-+              ALLOC_INIT_ZVAL(bevent->arg);
-+      }
-+
-+      TSRMLS_SET_CTX(bevent->thread_ctx);
-+
-+#if PHP_MAJOR_VERSION >= 5 && PHP_MINOR_VERSION >= 4
-+      bevent->rsrc_id = zend_list_insert(bevent, le_bufferevent TSRMLS_CC);
-+#else
-+      bevent->rsrc_id = zend_list_insert(bevent, le_bufferevent);
-+#endif
-+      RETURN_RESOURCE(bevent->rsrc_id);
-+}
-+/* }}} */
-+
-+/* {{{ proto void event_buffer_free(resource bevent) 
-+ */
-+static PHP_FUNCTION(event_buffer_free)
-+{
-+      zval *zbevent;
-+      php_bufferevent_t *bevent;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zbevent) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_BEVENT(zbevent, bevent);
-+      zend_list_delete(bevent->rsrc_id);
-+}
-+/* }}} */
-+
-+/* {{{ proto bool event_buffer_base_set(resource bevent, resource base) 
-+ */
-+static PHP_FUNCTION(event_buffer_base_set)
-+{
-+      zval *zbase, *zbevent;
-+      php_event_base_t *base, *old_base;
-+      php_bufferevent_t *bevent;
-+      int ret;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rr", &zbevent, &zbase) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_BASE(zbase, base);
-+      ZVAL_TO_BEVENT(zbevent, bevent);
-+
-+      old_base = bevent->base;
-+      ret = bufferevent_base_set(base->base, bevent->bevent);
-+
-+      if (ret == 0) {
-+              if (base != old_base) {
-+                      /* make sure the base is destroyed after the event */
-+                      zend_list_addref(base->rsrc_id);
-+                      ++base->events;
-+              }
-+
-+              if (old_base) {
-+                      --old_base->events;
-+                      zend_list_delete(old_base->rsrc_id);
-+              }
-+
-+              bevent->base = base;
-+              RETURN_TRUE;
-+      }
-+      RETURN_FALSE;
-+}
-+/* }}} */
-+
-+/* {{{ proto bool event_buffer_priority_set(resource bevent, int priority) 
-+ */
-+static PHP_FUNCTION(event_buffer_priority_set)
-+{
-+      zval *zbevent;
-+      php_bufferevent_t *bevent;
-+      long priority;
-+      int ret;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &zbevent, &priority) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_BEVENT(zbevent, bevent);
-+
-+      if (!bevent->base) {
-+              php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to set event priority without an event base");
-+              RETURN_FALSE;
-+      }
-+
-+      ret = bufferevent_priority_set(bevent->bevent, priority);
-+
-+      if (ret == 0) {
-+              RETURN_TRUE;
-+      }
-+      RETURN_FALSE;
-+}
-+/* }}} */
-+
-+/* {{{ proto bool event_buffer_write(resource bevent, string data[, int data_size]) 
-+ */
-+static PHP_FUNCTION(event_buffer_write)
-+{
-+      zval *zbevent;
-+      php_bufferevent_t *bevent;
-+      char *data;
-+      int data_len;
-+      long data_size = -1;
-+      int ret;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|l", &zbevent, &data, &data_len, &data_size) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_BEVENT(zbevent, bevent);
-+
-+      if (ZEND_NUM_ARGS() < 3 || data_size < 0) {
-+              data_size = data_len;
-+      } else if (data_size > data_len) {
-+              php_error_docref(NULL TSRMLS_CC, E_WARNING, "data_size out of range");
-+              RETURN_FALSE;
-+      }
-+
-+      ret = bufferevent_write(bevent->bevent, (const void *)data, data_size);
-+
-+      if (ret == 0) {
-+              RETURN_TRUE;
-+      }
-+      RETURN_FALSE;
-+}
-+/* }}} */
-+
-+/* {{{ proto string event_buffer_read(resource bevent, int data_size) 
-+ */
-+static PHP_FUNCTION(event_buffer_read)
-+{
-+      zval *zbevent;
-+      php_bufferevent_t *bevent;
-+      char *data;
-+      long data_size;
-+      int ret;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &zbevent, &data_size) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_BEVENT(zbevent, bevent);
-+
-+      if (data_size == 0) {
-+              RETURN_EMPTY_STRING();
-+      } else if (data_size < 0) {
-+              php_error_docref(NULL TSRMLS_CC, E_WARNING, "data_size cannot be less than zero");
-+              RETURN_FALSE;
-+      }
-+
-+      data = safe_emalloc((int)data_size, sizeof(char), 1);
-+
-+      ret = bufferevent_read(bevent->bevent, data, data_size);
-+      if (ret > 0) {
-+              if (ret > data_size) { /* paranoia */
-+                      ret = data_size;
-+              }
-+              data[ret] = '\0';
-+              RETURN_STRINGL(data, ret, 0);
-+      }
-+      efree(data);
-+      RETURN_EMPTY_STRING();
-+}
-+/* }}} */
-+
-+/* {{{ proto bool event_buffer_enable(resource bevent, int events) 
-+ */
-+static PHP_FUNCTION(event_buffer_enable)
-+{
-+      zval *zbevent;
-+      php_bufferevent_t *bevent;
-+      long events;
-+      int ret;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &zbevent, &events) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_BEVENT(zbevent, bevent);
-+
-+      ret = bufferevent_enable(bevent->bevent, events);
-+
-+      if (ret == 0) {
-+              RETURN_TRUE;
-+      }
-+      RETURN_FALSE;
-+}
-+/* }}} */
-+
-+/* {{{ proto bool event_buffer_disable(resource bevent, int events) 
-+ */
-+static PHP_FUNCTION(event_buffer_disable)
-+{
-+      zval *zbevent;
-+      php_bufferevent_t *bevent;
-+      long events;
-+      int ret;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &zbevent, &events) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_BEVENT(zbevent, bevent);
-+
-+      ret = bufferevent_disable(bevent->bevent, events);
-+
-+      if (ret == 0) {
-+              RETURN_TRUE;
-+      }
-+      RETURN_FALSE;
-+}
-+/* }}} */
-+
-+/* {{{ proto void event_buffer_timeout_set(resource bevent, int read_timeout, int write_timeout) 
-+ */
-+static PHP_FUNCTION(event_buffer_timeout_set)
-+{
-+      zval *zbevent;
-+      php_bufferevent_t *bevent;
-+      long read_timeout, write_timeout;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll", &zbevent, &read_timeout, &write_timeout) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_BEVENT(zbevent, bevent);
-+      bufferevent_settimeout(bevent->bevent, read_timeout, write_timeout);
-+}
-+/* }}} */
-+
-+/* {{{ proto void event_buffer_watermark_set(resource bevent, int events, int lowmark, int highmark) 
-+ */
-+static PHP_FUNCTION(event_buffer_watermark_set)
-+{
-+      zval *zbevent;
-+      php_bufferevent_t *bevent;
-+      long events, lowmark, highmark;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlll", &zbevent, &events, &lowmark, &highmark) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_BEVENT(zbevent, bevent);
-+      bufferevent_setwatermark(bevent->bevent, events, lowmark, highmark);
-+}
-+/* }}} */
-+
-+/* {{{ proto void event_buffer_fd_set(resource bevent, resource fd) 
-+ */
-+static PHP_FUNCTION(event_buffer_fd_set)
-+{
-+      zval *zbevent, *zfd;
-+      php_stream *stream;
-+      php_bufferevent_t *bevent;
-+      php_socket_t fd;
-+#ifdef LIBEVENT_SOCKETS_SUPPORT
-+      php_socket *php_sock;
-+#endif
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rz", &zbevent, &zfd) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_BEVENT(zbevent, bevent);
-+
-+      if (Z_TYPE_P(zfd) == IS_RESOURCE) {
-+              if (ZEND_FETCH_RESOURCE_NO_RETURN(stream, php_stream *, &zfd, -1, NULL, php_file_le_stream())) {
-+                      if (php_stream_cast(stream, PHP_STREAM_AS_FD_FOR_SELECT | PHP_STREAM_CAST_INTERNAL, (void*)&fd, 1) != SUCCESS || fd < 0) {
-+                              RETURN_FALSE;
-+                      }
-+              } else {
-+#ifdef LIBEVENT_SOCKETS_SUPPORT
-+                      if (ZEND_FETCH_RESOURCE_NO_RETURN(php_sock, php_socket *, &zfd, -1, NULL, php_sockets_le_socket())) {
-+                              fd = php_sock->bsd_socket;
-+                      } else {
-+                              php_error_docref(NULL TSRMLS_CC, E_WARNING, "fd argument must be valid PHP stream or socket resource or a file descriptor of type long");
-+                              RETURN_FALSE;
-+                      }
-+#else
-+                      php_error_docref(NULL TSRMLS_CC, E_WARNING, "fd argument must be valid PHP stream resource or a file descriptor of type long");
-+                      RETURN_FALSE;
-+#endif
-+              }
-+      } else if (Z_TYPE_P(zfd) == IS_LONG) {
-+              fd = Z_LVAL_P(zfd);
-+      } else {
-+#ifdef LIBEVENT_SOCKETS_SUPPORT
-+              php_error_docref(NULL TSRMLS_CC, E_WARNING, "fd argument must be valid PHP stream or socket resource or a file descriptor of type long");
-+#else
-+              php_error_docref(NULL TSRMLS_CC, E_WARNING, "fd argument must be valid PHP stream resource or a file descriptor of type long");
-+#endif
-+              RETURN_FALSE;
-+      }
-+
-+      bufferevent_setfd(bevent->bevent, fd);
-+}
-+/* }}} */
-+
-+/* {{{ proto resource event_buffer_set_callback(resource bevent, mixed readcb, mixed writecb, mixed errorcb[, mixed arg]) 
-+ */
-+static PHP_FUNCTION(event_buffer_set_callback)
-+{
-+      php_bufferevent_t *bevent;
-+      zval *zbevent, *zreadcb, *zwritecb, *zerrorcb, *zarg = NULL;
-+      char *func_name;
-+
-+      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rzzz|z", &zbevent, &zreadcb, &zwritecb, &zerrorcb, &zarg) != SUCCESS) {
-+              return;
-+      }
-+
-+      ZVAL_TO_BEVENT(zbevent, bevent);
-+
-+      if (Z_TYPE_P(zreadcb) != IS_NULL) {
-+              if (!zend_is_callable(zreadcb, 0, &func_name TSRMLS_CC)) {
-+                      php_error_docref(NULL TSRMLS_CC, E_WARNING, "'%s' is not a valid read callback", func_name);
-+                      efree(func_name);
-+                      RETURN_FALSE;
-+              }
-+              efree(func_name);
-+      } else {
-+              zreadcb = NULL;
-+      }
-+
-+      if (Z_TYPE_P(zwritecb) != IS_NULL) {
-+              if (!zend_is_callable(zwritecb, 0, &func_name TSRMLS_CC)) {
-+                      php_error_docref(NULL TSRMLS_CC, E_WARNING, "'%s' is not a valid write callback", func_name);
-+                      efree(func_name);
-+                      RETURN_FALSE;
-+              }
-+              efree(func_name);
-+      } else {
-+              zwritecb = NULL;
-+      }
-+
-+      if (Z_TYPE_P(zerrorcb) != IS_NULL) {
-+              if (!zend_is_callable(zerrorcb, 0, &func_name TSRMLS_CC)) {
-+                      php_error_docref(NULL TSRMLS_CC, E_WARNING, "'%s' is not a valid error callback", func_name);
-+                      efree(func_name);
-+                      RETURN_FALSE;
-+              }
-+              efree(func_name);
-+      } else {
-+              zerrorcb = NULL;
-+      }
-+
-+      if (zreadcb) {
-+              zval_add_ref(&zreadcb);
-+              
-+              if (bevent->readcb) {
-+                      zval_ptr_dtor(&bevent->readcb);
-+              }
-+              bevent->readcb = zreadcb;
-+      } else {
-+              if (bevent->readcb) {
-+                      zval_ptr_dtor(&bevent->readcb);
-+              }
-+              bevent->readcb = NULL;
-+      }
-+
-+      if (zwritecb) {
-+              zval_add_ref(&zwritecb);
-+              
-+              if (bevent->writecb) {
-+                      zval_ptr_dtor(&bevent->writecb);
-+              }
-+              bevent->writecb = zwritecb;
-+      } else {
-+              if (bevent->writecb) {
-+                      zval_ptr_dtor(&bevent->writecb);
-+              }
-+              bevent->writecb = NULL;
-+      }
-+      
-+      if (zerrorcb) {
-+              zval_add_ref(&zerrorcb);
-+              
-+              if (bevent->errorcb) {
-+                      zval_ptr_dtor(&bevent->errorcb);
-+              }
-+              bevent->errorcb = zerrorcb;
-+      }
-+      
-+      if (zarg) {
-+              zval_add_ref(&zarg);
-+              if (bevent->arg) {
-+                      zval_ptr_dtor(&bevent->arg);
-+              }
-+              bevent->arg = zarg;
-+      }
-+
-+      RETURN_TRUE;
-+}
-+/* }}} */
-+
-+
-+/* {{{ PHP_MINIT_FUNCTION
-+ */
-+static PHP_MINIT_FUNCTION(libevent)
-+{
-+      le_event_base = zend_register_list_destructors_ex(_php_event_base_dtor, NULL, "event base", module_number);
-+      le_event = zend_register_list_destructors_ex(_php_event_dtor, NULL, "event", module_number);
-+      le_bufferevent = zend_register_list_destructors_ex(_php_bufferevent_dtor, NULL, "buffer event", module_number);
-+
-+      REGISTER_LONG_CONSTANT("EV_TIMEOUT", EV_TIMEOUT, CONST_CS | CONST_PERSISTENT);
-+      REGISTER_LONG_CONSTANT("EV_READ", EV_READ, CONST_CS | CONST_PERSISTENT);
-+      REGISTER_LONG_CONSTANT("EV_WRITE", EV_WRITE, CONST_CS | CONST_PERSISTENT);
-+      REGISTER_LONG_CONSTANT("EV_SIGNAL", EV_SIGNAL, CONST_CS | CONST_PERSISTENT);
-+      REGISTER_LONG_CONSTANT("EV_PERSIST", EV_PERSIST, CONST_CS | CONST_PERSISTENT);
-+      REGISTER_LONG_CONSTANT("EVLOOP_NONBLOCK", EVLOOP_NONBLOCK, CONST_CS | CONST_PERSISTENT);
-+      REGISTER_LONG_CONSTANT("EVLOOP_ONCE", EVLOOP_ONCE, CONST_CS | CONST_PERSISTENT);
-+      
-+      REGISTER_LONG_CONSTANT("EVBUFFER_READ", EVBUFFER_READ, CONST_CS | CONST_PERSISTENT);
-+      REGISTER_LONG_CONSTANT("EVBUFFER_WRITE", EVBUFFER_WRITE, CONST_CS | CONST_PERSISTENT);
-+      REGISTER_LONG_CONSTANT("EVBUFFER_EOF", EVBUFFER_EOF, CONST_CS | CONST_PERSISTENT);
-+      REGISTER_LONG_CONSTANT("EVBUFFER_ERROR", EVBUFFER_ERROR, CONST_CS | CONST_PERSISTENT);
-+      REGISTER_LONG_CONSTANT("EVBUFFER_TIMEOUT", EVBUFFER_TIMEOUT, CONST_CS | CONST_PERSISTENT);
-+
-+      return SUCCESS;
-+}
-+/* }}} */
-+
-+/* {{{ PHP_MINFO_FUNCTION
-+ */
-+static PHP_MINFO_FUNCTION(libevent)
-+{
-+      char buf[64];
-+
-+
-+      php_info_print_table_start();
-+      php_info_print_table_header(2, "libevent support", "enabled");
-+      php_info_print_table_row(2, "extension version", PHP_LIBEVENT_VERSION);
-+      php_info_print_table_row(2, "Revision", "$Revision: 318910 $");
-+      
-+      snprintf(buf, sizeof(buf) - 1, "%s", event_get_version());
-+      php_info_print_table_row(2, "libevent version", buf);
-+
-+      php_info_print_table_end();
-+}
-+/* }}} */
-+
-+#if PHP_MAJOR_VERSION >= 5
-+/* {{{ arginfo */
-+#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 3) || PHP_MAJOR_VERSION > 5
-+# define EVENT_ARGINFO
-+#else
-+# define EVENT_ARGINFO static
-+#endif
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_base_loop, 0, 0, 1)
-+      ZEND_ARG_INFO(0, base)
-+      ZEND_ARG_INFO(0, flags)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_base_loopbreak, 0, 0, 1)
-+      ZEND_ARG_INFO(0, base)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_base_loopexit, 0, 0, 1)
-+      ZEND_ARG_INFO(0, base)
-+      ZEND_ARG_INFO(0, timeout)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_base_set, 0, 0, 2)
-+      ZEND_ARG_INFO(0, event)
-+      ZEND_ARG_INFO(0, base)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_base_priority_init, 0, 0, 2)
-+      ZEND_ARG_INFO(0, base)
-+      ZEND_ARG_INFO(0, npriorities)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO(arginfo_event_new, 0)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_add, 0, 0, 1)
-+      ZEND_ARG_INFO(0, event)
-+      ZEND_ARG_INFO(0, timeout)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_set, 0, 0, 4)
-+      ZEND_ARG_INFO(0, event)
-+      ZEND_ARG_INFO(0, fd)
-+      ZEND_ARG_INFO(0, events)
-+      ZEND_ARG_INFO(0, callback)
-+      ZEND_ARG_INFO(0, arg)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_del, 0, 0, 1)
-+      ZEND_ARG_INFO(0, event)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_priority_set, 0, 0, 2)
-+      ZEND_ARG_INFO(0, event)
-+      ZEND_ARG_INFO(0, priority)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_buffer_new, 0, 0, 4)
-+      ZEND_ARG_INFO(0, stream)
-+      ZEND_ARG_INFO(0, readcb)
-+      ZEND_ARG_INFO(0, writecb)
-+      ZEND_ARG_INFO(0, errorcb)
-+      ZEND_ARG_INFO(0, arg)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_buffer_free, 0, 0, 1)
-+      ZEND_ARG_INFO(0, bevent)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_buffer_base_set, 0, 0, 2)
-+      ZEND_ARG_INFO(0, bevent)
-+      ZEND_ARG_INFO(0, base)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_buffer_priority_set, 0, 0, 2)
-+      ZEND_ARG_INFO(0, bevent)
-+      ZEND_ARG_INFO(0, priority)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_buffer_write, 0, 0, 2)
-+      ZEND_ARG_INFO(0, bevent)
-+      ZEND_ARG_INFO(0, data)
-+      ZEND_ARG_INFO(0, data_size)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_buffer_read, 0, 0, 2)
-+      ZEND_ARG_INFO(0, bevent)
-+      ZEND_ARG_INFO(0, data_size)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_buffer_disable, 0, 0, 2)
-+      ZEND_ARG_INFO(0, bevent)
-+      ZEND_ARG_INFO(0, events)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_buffer_timeout_set, 0, 0, 3)
-+      ZEND_ARG_INFO(0, bevent)
-+      ZEND_ARG_INFO(0, read_timeout)
-+      ZEND_ARG_INFO(0, write_timeout)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_buffer_watermark_set, 0, 0, 4)
-+      ZEND_ARG_INFO(0, bevent)
-+      ZEND_ARG_INFO(0, events)
-+      ZEND_ARG_INFO(0, lowmark)
-+      ZEND_ARG_INFO(0, highmark)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_buffer_fd_set, 0, 0, 2)
-+      ZEND_ARG_INFO(0, bevent)
-+      ZEND_ARG_INFO(0, fd)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_buffer_set_callback, 0, 0, 4)
-+      ZEND_ARG_INFO(0, bevent)
-+      ZEND_ARG_INFO(0, readcb)
-+      ZEND_ARG_INFO(0, writecb)
-+      ZEND_ARG_INFO(0, errorcb)
-+      ZEND_ARG_INFO(0, arg)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_timer_set, 0, 0, 2)
-+      ZEND_ARG_INFO(0, event)
-+      ZEND_ARG_INFO(0, callback)
-+      ZEND_ARG_INFO(0, arg)
-+ZEND_END_ARG_INFO()
-+
-+EVENT_ARGINFO
-+ZEND_BEGIN_ARG_INFO_EX(arginfo_event_timer_pending, 0, 0, 1)
-+      ZEND_ARG_INFO(0, event)
-+      ZEND_ARG_INFO(0, timeout)
-+ZEND_END_ARG_INFO()
-+/* }}} */
-+
-+/* {{{ libevent_functions[]
-+ */
-+#if ZEND_MODULE_API_NO >= 20071006
-+const 
-+#endif
-+zend_function_entry libevent_functions[] = {
-+      PHP_FE(event_base_new,                          arginfo_event_new)
-+      PHP_FE(event_base_free,                         arginfo_event_base_loopbreak)
-+      PHP_FE(event_base_loop,                         arginfo_event_base_loop)
-+      PHP_FE(event_base_loopbreak,            arginfo_event_base_loopbreak)
-+      PHP_FE(event_base_loopexit,             arginfo_event_base_loopexit)
-+      PHP_FE(event_base_set,                          arginfo_event_base_set)
-+      PHP_FE(event_base_priority_init,        arginfo_event_base_priority_init)
-+      PHP_FE(event_new,                                       arginfo_event_new)
-+      PHP_FE(event_free,                                      arginfo_event_del)
-+      PHP_FE(event_add,                                       arginfo_event_add)
-+      PHP_FE(event_set,                                       arginfo_event_set)
-+      PHP_FE(event_del,                                       arginfo_event_del)
-+      PHP_FE(event_priority_set,                      arginfo_event_priority_set)
-+      PHP_FE(event_buffer_new,                        arginfo_event_buffer_new)
-+      PHP_FE(event_buffer_free,                       arginfo_event_buffer_free)
-+      PHP_FE(event_buffer_base_set,           arginfo_event_buffer_base_set)
-+      PHP_FE(event_buffer_priority_set,       arginfo_event_buffer_priority_set)
-+      PHP_FE(event_buffer_write,                      arginfo_event_buffer_write)
-+      PHP_FE(event_buffer_read,                       arginfo_event_buffer_read)
-+      PHP_FE(event_buffer_enable,             arginfo_event_buffer_disable)
-+      PHP_FE(event_buffer_disable,            arginfo_event_buffer_disable)
-+      PHP_FE(event_buffer_timeout_set,        arginfo_event_buffer_timeout_set)
-+      PHP_FE(event_buffer_watermark_set,      arginfo_event_buffer_watermark_set)
-+      PHP_FE(event_buffer_fd_set,             arginfo_event_buffer_fd_set)
-+      PHP_FE(event_buffer_set_callback,       arginfo_event_buffer_set_callback)
-+      PHP_FALIAS(event_timer_new,                     event_new,              arginfo_event_new)
-+      PHP_FE(event_timer_set,                         arginfo_event_timer_set)
-+      PHP_FE(event_timer_pending,                     arginfo_event_timer_pending)
-+      PHP_FALIAS(event_timer_add,                     event_add,              arginfo_event_add)
-+      PHP_FALIAS(event_timer_del,                     event_del,              arginfo_event_del)
-+      {NULL, NULL, NULL}
-+};
-+/* }}} */
-+#else
-+/* {{{ libevent_functions[]
-+ */
-+zend_function_entry libevent_functions[] = {
-+      PHP_FE(event_base_new,                          NULL)
-+      PHP_FE(event_base_free,                         NULL)
-+      PHP_FE(event_base_loop,                         NULL)
-+      PHP_FE(event_base_loopbreak,            NULL)
-+      PHP_FE(event_base_loopexit,             NULL)
-+      PHP_FE(event_base_set,                          NULL)
-+      PHP_FE(event_base_priority_init,        NULL)
-+      PHP_FE(event_new,                                       NULL)
-+      PHP_FE(event_free,                                      NULL)
-+      PHP_FE(event_add,                                       NULL)
-+      PHP_FE(event_set,                                       NULL)
-+      PHP_FE(event_del,                                       NULL)
-+      PHP_FE(event_priority_set,                      NULL)
-+      PHP_FE(event_buffer_new,                        NULL)
-+      PHP_FE(event_buffer_free,                       NULL)
-+      PHP_FE(event_buffer_base_set,           NULL)
-+      PHP_FE(event_buffer_priority_set,       NULL)
-+      PHP_FE(event_buffer_write,                      NULL)
-+      PHP_FE(event_buffer_read,                       NULL)
-+      PHP_FE(event_buffer_enable,             NULL)
-+      PHP_FE(event_buffer_disable,            NULL)
-+      PHP_FE(event_buffer_timeout_set,        NULL)
-+      PHP_FE(event_buffer_watermark_set,      NULL)
-+      PHP_FE(event_buffer_fd_set,             NULL)
-+      PHP_FALIAS(event_timer_new,                     event_new,      NULL)
-+      PHP_FE(event_timer_set,                         NULL)
-+      PHP_FE(event_timer_pending,                     NULL)
-+      PHP_FALIAS(event_timer_add,                     event_add,      NULL)
-+      PHP_FALIAS(event_timer_del,                     event_del,      NULL)
-+      {NULL, NULL, NULL}
-+};
-+/* }}} */
-+#endif
-+
-+static const zend_module_dep libevent_deps[] = { /* {{{ */
-+      ZEND_MOD_OPTIONAL("sockets")
-+      {NULL, NULL, NULL}
-+};
-+/* }}} */
-+
-+/* {{{ libevent_module_entry
-+ */
-+zend_module_entry libevent_module_entry = {
-+      STANDARD_MODULE_HEADER_EX,
-+      NULL,
-+      libevent_deps,
-+      "libevent",
-+      libevent_functions,
-+      PHP_MINIT(libevent),
-+      NULL,
-+      NULL,
-+      NULL,
-+      PHP_MINFO(libevent),
-+      PHP_LIBEVENT_VERSION,
-+      STANDARD_MODULE_PROPERTIES
-+};
-+/* }}} */
-+
-+/*
-+ * Local variables:
-+ * tab-width: 4
-+ * c-basic-offset: 4
-+ * End:
-+ * vim600: noet sw=4 ts=4 fdm=marker
-+ * vim<600: noet sw=4 ts=4
-+ */
---- /dev/null
-+++ b/ext/libevent/libevent.php
-@@ -0,0 +1,58 @@
-+<?php
-+
-+/* poll STDIN using basic API */
-+
-+function foo($fd, $events, $arg)
-+{
-+      static $i;
-+
-+      $i++;
-+
-+      if ($i == 10) {
-+              event_base_loopexit($arg[1]);
-+      }
-+      var_dump(fread($fd, 1000));
-+}
-+
-+
-+$base = event_base_new();
-+$event = event_new();
-+
-+$fd = STDIN;
-+
-+var_dump(event_set($event, $fd, EV_READ | EV_PERSIST, "foo", array($event, $base)));
-+var_dump(event_set($event, $fd, EV_READ | EV_PERSIST, "foo", array($event, $base)));
-+
-+event_base_set($event, $base);
-+
-+var_dump(event_add($event));
-+var_dump(event_base_loop($base));
-+
-+exit;
-+
-+/* poll STDIN using event_buffer API */
-+
-+function foo2($buf, $arg)
-+{
-+      static $i;
-+
-+      $i++;
-+
-+      if ($i == 10) {
-+              event_base_loopexit($arg);
-+      }
-+      var_dump($buf);
-+      var_dump(event_buffer_read($buf, 10));
-+}
-+
-+$base = event_base_new();
-+$b = event_buffer_new(STDIN, "foo2", NULL, "foo2", $base);
-+
-+event_buffer_base_set($b, $base);
-+event_buffer_enable($b, EV_READ);
-+
-+event_base_loop($base);
-+
-+
-+
-+?>
---- /dev/null
-+++ b/ext/libevent/php_libevent.h
-@@ -0,0 +1,68 @@
-+/*
-+  +----------------------------------------------------------------------+
-+  | PHP Version 5                                                        |
-+  +----------------------------------------------------------------------+
-+  | Copyright (c) 1997-2008 The PHP Group                                |
-+  +----------------------------------------------------------------------+
-+  | This source file is subject to version 3.01 of the PHP license,      |
-+  | that is bundled with this package in the file LICENSE, and is        |
-+  | available through the world-wide-web at the following url:           |
-+  | http://www.php.net/license/3_01.txt                                  |
-+  | If you did not receive a copy of the PHP license and are unable to   |
-+  | obtain it through the world-wide-web, please send a note to          |
-+  | license@php.net so we can mail you a copy immediately.               |
-+  +----------------------------------------------------------------------+
-+  | Author: Antony Dovgal <tony@daylessday.org>                          |
-+  |         Arnaud Le Blanc <lbarnaud@php.net>                           |
-+  +----------------------------------------------------------------------+
-+*/
-+
-+/* $Id: php_libevent.h 300687 2010-06-23 08:13:24Z tony2001 $ */
-+
-+#ifndef PHP_LIBEVENT_H
-+#define PHP_LIBEVENT_H
-+
-+#define PHP_LIBEVENT_VERSION "0.0.4"
-+
-+extern zend_module_entry libevent_module_entry;
-+#define phpext_libevent_ptr &libevent_module_entry
-+
-+#ifdef ZTS
-+#include "TSRM.h"
-+#endif
-+
-+#ifndef zend_always_inline
-+# if defined(__GNUC__)
-+#  define zend_always_inline inline __attribute__((always_inline))
-+# elif defined(_MSC_VER)
-+#  define zend_always_inline __forceinline
-+# else
-+#  define zend_always_inline inline
-+# endif
-+#endif
-+
-+#ifndef Z_ADDREF_P
-+#define Z_ADDREF_P(pz)                        zval_addref_p(pz)
-+static zend_always_inline zend_uint zval_addref_p(zval* pz) {
-+      return ++pz->refcount;
-+}
-+#endif
-+
-+#ifndef Z_DELREF_P
-+#define Z_DELREF_P(pz)                        zval_delref_p(pz)
-+static zend_always_inline zend_uint zval_delref_p(zval* pz) {
-+      return --pz->refcount;
-+}
-+#endif
-+
-+#endif        /* PHP_LIBEVENT_H */
-+
-+
-+/*
-+ * Local variables:
-+ * tab-width: 4
-+ * c-basic-offset: 4
-+ * End:
-+ * vim600: noet sw=4 ts=4 fdm=marker
-+ * vim<600: noet sw=4 ts=4
-+ */