[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] r10877: Windows Bufferevent implementation mostly complete but not y (in libevent-urz/trunk: . loaders sample)



Author: Urz
Date: 2007-07-19 03:58:47 -0400 (Thu, 19 Jul 2007)
New Revision: 10877

Added:
   libevent-urz/trunk/sample/cp-be-connector.c
   libevent-urz/trunk/sample/cp-be-listener.c
   libevent-urz/trunk/sample/crossplat-bufferevent-test.c
   libevent-urz/trunk/win_evbuffer.c
Modified:
   libevent-urz/trunk/Makefile.am
   libevent-urz/trunk/Makefile.in
   libevent-urz/trunk/evbuffer.c
   libevent-urz/trunk/event.h
   libevent-urz/trunk/loaders/IOCPloader.c
   libevent-urz/trunk/loaders/IOCPloader.h
   libevent-urz/trunk/sample/IOCPloader-test.c
   libevent-urz/trunk/sample/Makefile.am
   libevent-urz/trunk/sample/Makefile.in
Log:
Windows Bufferevent implementation mostly complete but not yet fully tested. libevent regression tests fail to compile badly on windows (missing netdb.h?) so I re-wrote sa_bufferevent to be platform independent (ongoing) and will use that to test with.
Todo: socket close function

Modified: libevent-urz/trunk/Makefile.am
===================================================================
--- libevent-urz/trunk/Makefile.am	2007-07-19 07:46:11 UTC (rev 10876)
+++ libevent-urz/trunk/Makefile.am	2007-07-19 07:58:47 UTC (rev 10877)
@@ -27,6 +27,10 @@
 SYS_LIBS = -lws2_32
 SYS_SRC = WIN32-Code/misc.c WIN32-Code/win32.c
 SYS_INCLUDES = -IWIN32-Code
+libevent_la_SOURCES = event.c buffer.c sa_evbuffer.c win_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 \
+	$(SYS_SRC)
 
 else
 
@@ -34,13 +38,13 @@
 SYS_LIBS =
 SYS_SRC =
 SYS_INCLUDES =
-
-endif
-
 libevent_la_SOURCES = event.c buffer.c sa_evbuffer.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 \
 	$(SYS_SRC)
+
+endif
+
 libevent_la_LIBADD = @LTLIBOBJS@ $(SYS_LIBS)
 libevent_la_LDFLAGS = -release @VERSION@ -version-info 1:3:0
 libevent_la_CFLAGS = -g

Modified: libevent-urz/trunk/Makefile.in
===================================================================
--- libevent-urz/trunk/Makefile.in	2007-07-19 07:46:11 UTC (rev 10876)
+++ libevent-urz/trunk/Makefile.in	2007-07-19 07:58:47 UTC (rev 10877)
@@ -36,7 +36,6 @@
 PRE_UNINSTALL = :
 POST_UNINSTALL = :
 host_triplet = @host@
-@BUILD_WIN32_TRUE@am__append_1 = loaders/IOCPloader.h loaders/IOCPloader.c
 ACLOCAL = @ACLOCAL@
 AMDEP_FALSE = @AMDEP_FALSE@
 AMDEP_TRUE = @AMDEP_TRUE@
@@ -167,11 +166,17 @@
 @BUILD_WIN32_TRUE@SYS_INCLUDES = -IWIN32-Code
 @BUILD_WIN32_FALSE@SYS_INCLUDES = 
 
-libevent_la_SOURCES = event.c buffer.c sa_evbuffer.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 \
-	$(SYS_SRC)\
-$(am__append_1)
+@BUILD_WIN32_TRUE@libevent_la_SOURCES = event.c buffer.c sa_evbuffer.c win_evbuffer.c log.c event_tagging.c \
+@BUILD_WIN32_TRUE@	http.c evhttp.h http-internal.h evdns.c evdns.h strlcpy.c \
+@BUILD_WIN32_TRUE@	strlcpy-internal.h strlcpy-internal.h \
+@BUILD_WIN32_TRUE@	$(SYS_SRC)\
+@BUILD_WIN32_TRUE@loaders/IOCPloader.h loaders/IOCPloader.c
+@BUILD_WIN32_FALSE@libevent_la_SOURCES = event.c buffer.c sa_evbuffer.c evbuffer.c log.c event_tagging.c \
+@BUILD_WIN32_FALSE@	http.c evhttp.h http-internal.h evdns.c evdns.h strlcpy.c \
+@BUILD_WIN32_FALSE@	strlcpy-internal.h strlcpy-internal.h \
+@BUILD_WIN32_FALSE@	$(SYS_SRC)
+
+
 libevent_la_LIBADD = @LTLIBOBJS@ $(SYS_LIBS)
 libevent_la_LDFLAGS = -release @VERSION@ -version-info 1:3:0
 libevent_la_CFLAGS = -g
@@ -192,19 +197,30 @@
 
 @BUILD_WIN32_TRUE@libevent_la_DEPENDENCIES = @LTLIBOBJS@
 @BUILD_WIN32_FALSE@libevent_la_DEPENDENCIES = @LTLIBOBJS@
-am__libevent_la_SOURCES_DIST = event.c buffer.c sa_evbuffer.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 \
-	WIN32-Code/win32.c loaders/IOCPloader.h loaders/IOCPloader.c
+am__libevent_la_SOURCES_DIST = event.c buffer.c sa_evbuffer.c \
+	win_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 WIN32-Code/win32.c loaders/IOCPloader.h \
+	loaders/IOCPloader.c evbuffer.c
 @BUILD_WIN32_TRUE@am__objects_1 = libevent_la-misc.lo \
 @BUILD_WIN32_TRUE@	libevent_la-win32.lo
 @BUILD_WIN32_FALSE@am__objects_1 =
-@BUILD_WIN32_TRUE@am__objects_2 = libevent_la-IOCPloader.lo
-am_libevent_la_OBJECTS = libevent_la-event.lo libevent_la-buffer.lo \
-	libevent_la-sa_evbuffer.lo libevent_la-evbuffer.lo \
-	libevent_la-log.lo libevent_la-event_tagging.lo \
-	libevent_la-http.lo libevent_la-evdns.lo libevent_la-strlcpy.lo \
-	$(am__objects_1) $(am__objects_2)
+@BUILD_WIN32_TRUE@am_libevent_la_OBJECTS = libevent_la-event.lo \
+@BUILD_WIN32_TRUE@	libevent_la-buffer.lo \
+@BUILD_WIN32_TRUE@	libevent_la-sa_evbuffer.lo \
+@BUILD_WIN32_TRUE@	libevent_la-win_evbuffer.lo \
+@BUILD_WIN32_TRUE@	libevent_la-log.lo \
+@BUILD_WIN32_TRUE@	libevent_la-event_tagging.lo \
+@BUILD_WIN32_TRUE@	libevent_la-http.lo libevent_la-evdns.lo \
+@BUILD_WIN32_TRUE@	libevent_la-strlcpy.lo $(am__objects_1) \
+@BUILD_WIN32_TRUE@	libevent_la-IOCPloader.lo
+@BUILD_WIN32_FALSE@am_libevent_la_OBJECTS = libevent_la-event.lo \
+@BUILD_WIN32_FALSE@	libevent_la-buffer.lo \
+@BUILD_WIN32_FALSE@	libevent_la-sa_evbuffer.lo \
+@BUILD_WIN32_FALSE@	libevent_la-evbuffer.lo libevent_la-log.lo \
+@BUILD_WIN32_FALSE@	libevent_la-event_tagging.lo \
+@BUILD_WIN32_FALSE@	libevent_la-http.lo libevent_la-evdns.lo \
+@BUILD_WIN32_FALSE@	libevent_la-strlcpy.lo $(am__objects_1)
 libevent_la_OBJECTS = $(am_libevent_la_OBJECTS)
 SCRIPTS = $(bin_SCRIPTS)
 
@@ -308,7 +324,7 @@
 libevent_la-event.lo: event.c
 libevent_la-buffer.lo: buffer.c
 libevent_la-sa_evbuffer.lo: sa_evbuffer.c
-libevent_la-evbuffer.lo: evbuffer.c
+libevent_la-win_evbuffer.lo: win_evbuffer.c
 libevent_la-log.lo: log.c
 libevent_la-event_tagging.lo: event_tagging.c
 libevent_la-http.lo: http.c
@@ -317,6 +333,7 @@
 libevent_la-misc.lo: WIN32-Code/misc.c
 libevent_la-win32.lo: WIN32-Code/win32.c
 libevent_la-IOCPloader.lo: loaders/IOCPloader.c
+libevent_la-evbuffer.lo: evbuffer.c
 libevent.la: $(libevent_la_OBJECTS) $(libevent_la_DEPENDENCIES) 
 	$(LINK) -rpath $(libdir) $(libevent_la_LDFLAGS) $(libevent_la_OBJECTS) $(libevent_la_LIBADD) $(LIBS)
 binSCRIPT_INSTALL = $(INSTALL_SCRIPT)
@@ -382,14 +399,14 @@
 libevent_la-sa_evbuffer.lo: sa_evbuffer.c
 	$(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libevent_la_CFLAGS) $(CFLAGS) -c -o libevent_la-sa_evbuffer.lo `test -f 'sa_evbuffer.c' || echo '$(srcdir)/'`sa_evbuffer.c
 
-libevent_la-evbuffer.o: evbuffer.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libevent_la_CFLAGS) $(CFLAGS) -c -o libevent_la-evbuffer.o `test -f 'evbuffer.c' || echo '$(srcdir)/'`evbuffer.c
+libevent_la-win_evbuffer.o: win_evbuffer.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libevent_la_CFLAGS) $(CFLAGS) -c -o libevent_la-win_evbuffer.o `test -f 'win_evbuffer.c' || echo '$(srcdir)/'`win_evbuffer.c
 
-libevent_la-evbuffer.obj: evbuffer.c
-	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libevent_la_CFLAGS) $(CFLAGS) -c -o libevent_la-evbuffer.obj `if test -f 'evbuffer.c'; then $(CYGPATH_W) 'evbuffer.c'; else $(CYGPATH_W) '$(srcdir)/evbuffer.c'`
+libevent_la-win_evbuffer.obj: win_evbuffer.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libevent_la_CFLAGS) $(CFLAGS) -c -o libevent_la-win_evbuffer.obj `if test -f 'win_evbuffer.c'; then $(CYGPATH_W) 'win_evbuffer.c'; else $(CYGPATH_W) '$(srcdir)/win_evbuffer.c'`
 
-libevent_la-evbuffer.lo: evbuffer.c
-	$(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libevent_la_CFLAGS) $(CFLAGS) -c -o libevent_la-evbuffer.lo `test -f 'evbuffer.c' || echo '$(srcdir)/'`evbuffer.c
+libevent_la-win_evbuffer.lo: win_evbuffer.c
+	$(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libevent_la_CFLAGS) $(CFLAGS) -c -o libevent_la-win_evbuffer.lo `test -f 'win_evbuffer.c' || echo '$(srcdir)/'`win_evbuffer.c
 
 libevent_la-log.o: log.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libevent_la_CFLAGS) $(CFLAGS) -c -o libevent_la-log.o `test -f 'log.c' || echo '$(srcdir)/'`log.c
@@ -463,6 +480,15 @@
 libevent_la-IOCPloader.lo: loaders/IOCPloader.c
 	$(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libevent_la_CFLAGS) $(CFLAGS) -c -o libevent_la-IOCPloader.lo `test -f 'loaders/IOCPloader.c' || echo '$(srcdir)/'`loaders/IOCPloader.c
 
+libevent_la-evbuffer.o: evbuffer.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libevent_la_CFLAGS) $(CFLAGS) -c -o libevent_la-evbuffer.o `test -f 'evbuffer.c' || echo '$(srcdir)/'`evbuffer.c
+
+libevent_la-evbuffer.obj: evbuffer.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libevent_la_CFLAGS) $(CFLAGS) -c -o libevent_la-evbuffer.obj `if test -f 'evbuffer.c'; then $(CYGPATH_W) 'evbuffer.c'; else $(CYGPATH_W) '$(srcdir)/evbuffer.c'`
+
+libevent_la-evbuffer.lo: evbuffer.c
+	$(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libevent_la_CFLAGS) $(CFLAGS) -c -o libevent_la-evbuffer.lo `test -f 'evbuffer.c' || echo '$(srcdir)/'`evbuffer.c
+
 mostlyclean-libtool:
 	-rm -f *.lo
 

Modified: libevent-urz/trunk/evbuffer.c
===================================================================
--- libevent-urz/trunk/evbuffer.c	2007-07-19 07:46:11 UTC (rev 10876)
+++ libevent-urz/trunk/evbuffer.c	2007-07-19 07:58:47 UTC (rev 10877)
@@ -25,7 +25,8 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include <sys/types.h>
+#include <sys/types.h>
+#include <sys/socket.h>
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -50,6 +51,30 @@
 void bufferevent_setwatermark(struct bufferevent *, short, size_t, size_t);
 void bufferevent_read_pressure_cb(struct evbuffer *, size_t, size_t, void *);
 
+//socket
+int bufev_socket_new(void) {
+    return socket(AF_INET, SOCK_STREAM, 0);
+}
+// connect
+int bufev_socket_connect(struct bufferevent *bufev, struct sockaddr_in *addr) {
+    return connect(bufev->fd, (struct sockaddr*)addr, sizeof(addr));
+}
+// accept
+struct bufferevent *bufev_socket_accept(int listen_sock, evbuffercb readcb, evbuffercb writecb, everrorcb errorcb, void *cbarg) {
+    int returned;
+    returned = accept(listen_sock, NULL, NULL);
+    
+    return bufferevent_new(returned, readcb, writecb, errorcb, cbarg);
+}
+// listen
+int bufev_socket_listen(int sock, int backlog) {
+    return listen(sock, backlog);
+}
+// bind
+int bufev_socket_bind(int sock, struct sockaddr_in *bind_to) {
+    return bind(sock, (struct sockaddr*) bind_to, sizeof(bind_to));
+}
+
 static int
 bufferevent_add(struct event *ev, int timeout)
 {

Modified: libevent-urz/trunk/event.h
===================================================================
--- libevent-urz/trunk/event.h	2007-07-19 07:46:11 UTC (rev 10876)
+++ libevent-urz/trunk/event.h	2007-07-19 07:58:47 UTC (rev 10877)
@@ -34,15 +34,19 @@
 #include "config.h"
 #include "compat/sys/queue.h"
 #include <stdarg.h>
+#include <sys/types.h>
 
 #ifdef WIN32
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 #include <process.h>
+#include <Winsock2.h>
 /* #include "compat/sys/_time.h" */
 #undef WIN32_LEAN_AND_MEAN
 typedef unsigned char u_char;
 typedef unsigned short u_short;
+#else
+#include <sys/socket.h>
 #endif
 
 #define EVLIST_TIMEOUT	0x01
@@ -272,6 +276,17 @@
 	short enabled;	/* events that are currently enabled */
 };
 
+//socket
+int bufev_socket_new(void);
+// connect
+int bufev_socket_connect(struct bufferevent *bufev, struct sockaddr_in *addr);
+// accept
+struct bufferevent *bufev_socket_accept(int listen_sock, evbuffercb readcb, evbuffercb writecb, everrorcb errorcb, void *cbarg);
+// listen
+int bufev_socket_listen(int sock, int backlog);
+// bind
+int bufev_socket_bind(int sock, struct sockaddr_in *bind_to);
+
 struct bufferevent *bufferevent_new(int fd,
     evbuffercb readcb, evbuffercb writecb, everrorcb errorcb, void *cbarg);
 int bufferevent_base_set(struct event_base *base, struct bufferevent *bufev);
@@ -318,7 +333,9 @@
     u_char del_read_event_set;
     u_char del_write_event_set;
     
-    LIST_ENTRY(sa_bufferevent) list_elem;	
+    LIST_ENTRY(sa_bufferevent) list_elem;
+    
+    void *connection_handle;
 };
 
 struct sa_bufferevent *sa_bufferevent_new(evsabuffercb readcb, 

Modified: libevent-urz/trunk/loaders/IOCPloader.c
===================================================================
--- libevent-urz/trunk/loaders/IOCPloader.c	2007-07-19 07:46:11 UTC (rev 10876)
+++ libevent-urz/trunk/loaders/IOCPloader.c	2007-07-19 07:58:47 UTC (rev 10877)
@@ -20,7 +20,6 @@
 mutex listLock;
 /*
  * Status :
- * Code should be functionally complete but untested and undocumented.
  * Code compiles, although it has the following warnings I do not understand:
  * loaders/IOCPloader.c: In function `iocp_worker_thread':
  * loaders/IOCPloader.c:209: warning: dereferencing type-punned pointer will break strict-aliasing rules
@@ -36,7 +35,7 @@
     printf("%x ]\n", (int) data[len-1]);
 }
  
-int IOCPloader_bind(SOCKET *s, struct sa_bufferevent * bufevent) {
+int IOCPloader_bind(SOCKET s, struct sa_bufferevent * bufevent) {
     DWORD myListElem;
     DWORD listSearch;
     char found = 0;
@@ -101,7 +100,7 @@
     connList[myListElem].inUse = 1;
     
     // Despite the name, this call associates the socket with the I/O Completion port
-    IOCP = CreateIoCompletionPort((HANDLE) *(connList[myListElem].sock), IOCP, (ULONG_PTR) myListElem, 0);
+    IOCP = CreateIoCompletionPort((HANDLE) connList[myListElem].sock, IOCP, (ULONG_PTR) myListElem, 0);
     ResetRead(&connList[myListElem]);
     
     ev_unlock(connList[myListElem].lock);
@@ -192,7 +191,7 @@
                 //printf("Presend buf: ");
                 //printhex(connList[listpos].sendbuf->buf, unloaded);
                 sendRet = WSASend(
-                    *(connList[listpos].sock),
+                    connList[listpos].sock,
                     // Socket to send on
                     connList[listpos].sendbuf,
                     // 'array' of WSA buffers to use
@@ -256,6 +255,8 @@
             );
         if(!GQCSRet) {
             printf("GetQueuedCompletionStatus error %d\n", (int) GetLastError());
+            Sleep(10000);
+            exit(0);
             continue;
         }
         
@@ -291,7 +292,7 @@
     UINT WSARecvRet;
     ULONG WSARecvFlags = 0;
     WSARecvRet = WSARecv(
-        *(Conn->sock),
+        Conn->sock,
         // The socket to recieve from
         Conn->recvbuf,
         // Pointer to an 'array' of WSABUFs.

Modified: libevent-urz/trunk/loaders/IOCPloader.h
===================================================================
--- libevent-urz/trunk/loaders/IOCPloader.h	2007-07-19 07:46:11 UTC (rev 10876)
+++ libevent-urz/trunk/loaders/IOCPloader.h	2007-07-19 07:58:47 UTC (rev 10877)
@@ -8,7 +8,7 @@
 void IOCPLoaderInit(void);
 DWORD WINAPI iocp_worker_thread(LPVOID);
 DWORD WINAPI iocp_writer_thread(LPVOID);
-int IOCPloader_bind(SOCKET *, struct sa_bufferevent *);
+int IOCPloader_bind(SOCKET, struct sa_bufferevent *);
 void printhex(char *data, size_t len);
 
 #define SUGGESTED_BUF_SIZE 4096
@@ -30,7 +30,7 @@
     struct sa_bufferevent *localbuf;
     WSABUF *recvbuf;
     WSABUF *sendbuf;
-    SOCKET *sock;
+    SOCKET sock;
     OLOPERATION recvol;
     OLOPERATION sendol;
     mutex lock;

Modified: libevent-urz/trunk/sample/IOCPloader-test.c
===================================================================
--- libevent-urz/trunk/sample/IOCPloader-test.c	2007-07-19 07:46:11 UTC (rev 10876)
+++ libevent-urz/trunk/sample/IOCPloader-test.c	2007-07-19 07:58:47 UTC (rev 10877)
@@ -171,7 +171,7 @@
     IOCPLoaderInit();
     // If we start this up before all the accepting is done it may interfere.
 
-    bindingHandle = IOCPloader_bind(&Accept, lsabe);
+    bindingHandle = IOCPloader_bind(Accept, lsabe);
     printf("IOCPLoader Bound (%d)\n", bindingHandle);
     
     gen_pattern_a(buf, BUF_SIZE);
@@ -253,7 +253,7 @@
     
     printf("Connected.\n");
     
-    bindingHandle = IOCPloader_bind(&Connect, csabe);
+    bindingHandle = IOCPloader_bind(Connect, csabe);
     
     printf("IOCPLoader Bound (%d)\n", bindingHandle);
     

Modified: libevent-urz/trunk/sample/Makefile.am
===================================================================
--- libevent-urz/trunk/sample/Makefile.am	2007-07-19 07:46:11 UTC (rev 10876)
+++ libevent-urz/trunk/sample/Makefile.am	2007-07-19 07:58:47 UTC (rev 10877)
@@ -5,15 +5,20 @@
 CFLAGS = -I../compat -g
 
 #noinst_PROGRAMS = event-test time-test signal-test
-noinst_PROGRAMS = time-test signal-test sa_evbuffer-test IOCPlistener IOCPconnector
+noinst_PROGRAMS = time-test signal-test sa_evbuffer-test IOCPlistener IOCPconnector cp-be-listener cp-be-connector
 
 event_test_sources = event-test.c
 time_test_sources = time-test.c
 signal_test_sources = signal-test.c
 sa_evbuffer_test_sources = sa_evbuffer-test.c
-IOCPlistener_sources = IOCPloader-test.c IOCPlistener.c
-IOCPconnector_sources = IOCPloader-test.c IOCPconnector.c
+IOCPlistener_sources = crossplat-bufferevent-test.c IOCPlistener.c
+IOCPconnector_sources = crossplat-bufferevent-test.c IOCPconnector.c
+cp-be-listener_sources = crossplat-bufferevent-test.c cp-be-listener.c
+cp-be-connector_sources = crossplat-bufferevent-test.c cp-be-connector.c
 
+cp-be-listener_CFLAGS = -g
+cp-be-connector_CFLAGS = -g
+
 IOCPlistener_CFLAGS = -g
 IOCPconnector_CFLAGS = -g
 

Modified: libevent-urz/trunk/sample/Makefile.in
===================================================================
--- libevent-urz/trunk/sample/Makefile.in	2007-07-19 07:46:11 UTC (rev 10876)
+++ libevent-urz/trunk/sample/Makefile.in	2007-07-19 07:58:47 UTC (rev 10877)
@@ -138,15 +138,20 @@
 CPPFPLAGS = -I.. 
 
 #noinst_PROGRAMS = event-test time-test signal-test
-noinst_PROGRAMS = time-test signal-test sa_evbuffer-test IOCPlistener IOCPconnector
+noinst_PROGRAMS = time-test signal-test sa_evbuffer-test IOCPlistener IOCPconnector cp-be-listener cp-be-connector
 
 event_test_sources = event-test.c
 time_test_sources = time-test.c
 signal_test_sources = signal-test.c
 sa_evbuffer_test_sources = sa_evbuffer-test.c
-IOCPlistener_sources = IOCPloader-test.c IOCPlistener.c
-IOCPconnector_sources = IOCPloader-test.c IOCPconnector.c
+IOCPlistener_sources = crossplat-bufferevent-test.c IOCPlistener.c
+IOCPconnector_sources = crossplat-bufferevent-test.c IOCPconnector.c
+cp-be-listener_sources = crossplat-bufferevent-test.c cp-be-listener.c
+cp-be-connector_sources = crossplat-bufferevent-test.c cp-be-connector.c
 
+cp-be-listener_CFLAGS = -g
+cp-be-connector_CFLAGS = -g
+
 IOCPlistener_CFLAGS = -g
 IOCPconnector_CFLAGS = -g
 
@@ -157,7 +162,8 @@
 CONFIG_CLEAN_FILES =
 noinst_PROGRAMS = time-test$(EXEEXT) signal-test$(EXEEXT) \
 	sa_evbuffer-test$(EXEEXT) IOCPlistener$(EXEEXT) \
-	IOCPconnector$(EXEEXT)
+	IOCPconnector$(EXEEXT) cp-be-listener$(EXEEXT) \
+	cp-be-connector$(EXEEXT)
 PROGRAMS = $(noinst_PROGRAMS)
 
 IOCPconnector_SOURCES = IOCPconnector.c
@@ -170,6 +176,16 @@
 IOCPlistener_LDADD = $(LDADD)
 IOCPlistener_DEPENDENCIES = ../libevent.la
 IOCPlistener_LDFLAGS =
+cp_be_connector_SOURCES = cp-be-connector.c
+cp_be_connector_OBJECTS = cp-be-connector.$(OBJEXT)
+cp_be_connector_LDADD = $(LDADD)
+cp_be_connector_DEPENDENCIES = ../libevent.la
+cp_be_connector_LDFLAGS =
+cp_be_listener_SOURCES = cp-be-listener.c
+cp_be_listener_OBJECTS = cp-be-listener.$(OBJEXT)
+cp_be_listener_LDADD = $(LDADD)
+cp_be_listener_DEPENDENCIES = ../libevent.la
+cp_be_listener_LDFLAGS =
 sa_evbuffer_test_SOURCES = sa_evbuffer-test.c
 sa_evbuffer_test_OBJECTS = sa_evbuffer-test.$(OBJEXT)
 sa_evbuffer_test_LDADD = $(LDADD)
@@ -196,10 +212,10 @@
 CCLD = $(CC)
 LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
 	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-DIST_SOURCES = IOCPconnector.c IOCPlistener.c sa_evbuffer-test.c \
-	signal-test.c time-test.c
+DIST_SOURCES = IOCPconnector.c IOCPlistener.c cp-be-connector.c \
+	cp-be-listener.c sa_evbuffer-test.c signal-test.c time-test.c
 DIST_COMMON = Makefile.am Makefile.in
-SOURCES = IOCPconnector.c IOCPlistener.c sa_evbuffer-test.c signal-test.c time-test.c
+SOURCES = IOCPconnector.c IOCPlistener.c cp-be-connector.c cp-be-listener.c sa_evbuffer-test.c signal-test.c time-test.c
 
 all: all-am
 
@@ -225,6 +241,12 @@
 IOCPlistener$(EXEEXT): $(IOCPlistener_OBJECTS) $(IOCPlistener_DEPENDENCIES) 
 	@rm -f IOCPlistener$(EXEEXT)
 	$(LINK) $(IOCPlistener_LDFLAGS) $(IOCPlistener_OBJECTS) $(IOCPlistener_LDADD) $(LIBS)
+cp-be-connector$(EXEEXT): $(cp_be_connector_OBJECTS) $(cp_be_connector_DEPENDENCIES) 
+	@rm -f cp-be-connector$(EXEEXT)
+	$(LINK) $(cp_be_connector_LDFLAGS) $(cp_be_connector_OBJECTS) $(cp_be_connector_LDADD) $(LIBS)
+cp-be-listener$(EXEEXT): $(cp_be_listener_OBJECTS) $(cp_be_listener_DEPENDENCIES) 
+	@rm -f cp-be-listener$(EXEEXT)
+	$(LINK) $(cp_be_listener_LDFLAGS) $(cp_be_listener_OBJECTS) $(cp_be_listener_LDADD) $(LIBS)
 sa_evbuffer-test$(EXEEXT): $(sa_evbuffer_test_OBJECTS) $(sa_evbuffer_test_DEPENDENCIES) 
 	@rm -f sa_evbuffer-test$(EXEEXT)
 	$(LINK) $(sa_evbuffer_test_LDFLAGS) $(sa_evbuffer_test_OBJECTS) $(sa_evbuffer_test_LDADD) $(LIBS)

Added: libevent-urz/trunk/sample/cp-be-connector.c
===================================================================
--- libevent-urz/trunk/sample/cp-be-connector.c	                        (rev 0)
+++ libevent-urz/trunk/sample/cp-be-connector.c	2007-07-19 07:58:47 UTC (rev 10877)
@@ -0,0 +1,6 @@
+#include "crossplat-bufferevent-test.c"
+
+int main() {
+    connector();
+    return 0;
+}
\ No newline at end of file

Added: libevent-urz/trunk/sample/cp-be-listener.c
===================================================================
--- libevent-urz/trunk/sample/cp-be-listener.c	                        (rev 0)
+++ libevent-urz/trunk/sample/cp-be-listener.c	2007-07-19 07:58:47 UTC (rev 10877)
@@ -0,0 +1,6 @@
+#include "crossplat-bufferevent-test.c"
+
+int main() {
+    listener();
+    return 0;
+}
\ No newline at end of file

Added: libevent-urz/trunk/sample/crossplat-bufferevent-test.c
===================================================================
--- libevent-urz/trunk/sample/crossplat-bufferevent-test.c	                        (rev 0)
+++ libevent-urz/trunk/sample/crossplat-bufferevent-test.c	2007-07-19 07:58:47 UTC (rev 10877)
@@ -0,0 +1,236 @@
+/*
+ * Copyright (c) 2007 Christian King <urzumph@xxxxxxxxx>
+ * 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.
+ */
+ 
+ /*
+  * On Windows and all kinds of lame:
+  * Windows has *no* fork, or anything which emulates fork.
+  * The closest is threading, or "CreateProcess" which is like fork() + exec()
+  * Thus, this file contains all code for both processes and is included from
+  * each processes' main c file.
+  */
+
+#include <Winsock2.h>
+#include "event.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <Windows.h>
+#include <unistd.h>
+
+#define BUF_SIZE 1000
+#define LISTEN_PORT 1025
+
+void doexit(int val) {
+    char data;
+    fread(&data, 1, 1, stdin);
+    exit(val);
+}
+
+void gen_pattern_a(char *buf, size_t len) {
+    size_t upto;
+    static char cycle = 0;
+    for(upto = 0; upto < len; upto++) {
+        buf[upto] = cycle++;
+    }
+}
+
+int check_pattern_a(char *buf, size_t len) {
+    size_t upto;
+    static char cycle = 0;
+    for(upto = 0; upto < len; upto++) {
+        if(buf[upto] != cycle++) {
+            return 0;
+        }
+    }
+    return 1;
+}
+
+void gen_pattern_b(char *buf, size_t len) {
+    size_t upto;
+    static char cycle = 255;
+    for(upto = 0; upto < len; upto++) {
+        buf[upto] = cycle--;
+    }
+}
+
+int check_pattern_b(char *buf, size_t len) {
+    size_t upto;
+    static char cycle = 255;
+    for(upto = 0; upto < len; upto++) {
+        if(buf[upto] != cycle--) {
+            return 0;
+        }
+    }
+    return 1;
+}
+
+// check incoming data
+void listener_on_read(struct bufferevent *sabe, void *isnull) {
+    char buf[BUF_SIZE+1];
+    size_t len_read;
+    
+    do {
+        len_read = bufferevent_read(sabe, buf, BUF_SIZE);
+    
+        if(!check_pattern_b(buf, len_read)) {
+            buf[BUF_SIZE] = '\0';
+            printf("Recieved buffer failed pattern check b: recieved ");
+            printhex(buf, BUF_SIZE);
+            doexit(0);
+        }
+    } while (len_read != 0);
+    
+    printf("R");
+}
+
+// when outgoing data is sent, queue up more.
+void listener_on_write(struct bufferevent *sabe, void *isnull) {
+    char buf[BUF_SIZE+1];
+    size_t len_read;
+    
+    gen_pattern_a(buf, BUF_SIZE);
+    //printf("Sending buffer: ");
+    //printhex(buf, BUF_SIZE);
+    bufferevent_write(sabe, buf, BUF_SIZE);
+    
+    printf("W");
+}
+
+void listener() {
+    WSADATA wsaData;
+    struct bufferevent* lsabe;
+    int Listen;
+    struct sockaddr_in listenAddr;
+    int Accept;
+    int bindingHandle = -1;
+    char buf[BUF_SIZE];
+    int error;
+    int AcceptRet;
+    
+    DWORD zero;
+    
+    WSAStartup(MAKEWORD( 2, 2 ), &wsaData);
+    event_init();
+    
+    printf("Creating Listen Socket\n");
+    Listen = bufev_socket_new();
+    //lsabe = bufferevent_new(bufev_socket_new(), listener_on_read, listener_on_write, NULL, NULL);
+    printf("Listen = %d\n", (int) Listen);
+    
+    listenAddr.sin_family = AF_INET;
+    listenAddr.sin_port = htons(LISTEN_PORT);
+    listenAddr.sin_addr.s_addr = htonl(INADDR_ANY);
+
+    printf("Binding Socket\n");
+    bufev_socket_bind(Listen, &listenAddr);
+    printf("Listening...\n");
+    bufev_socket_listen(Listen, 1);
+    
+    printf("Accepting...\n");
+
+    lsabe = bufev_socket_accept(Listen, listener_on_read, listener_on_write, NULL, NULL);
+    // accept() and overlapped IO do not play well together.
+    
+    printf("Client Accepted...\n");
+    
+    gen_pattern_a(buf, BUF_SIZE);
+    printf("Generating Initial Pattern\n");
+    //printf("Sending buffer: ");
+    //printhex(buf, BUF_SIZE);
+    
+    bufferevent_write(lsabe, buf, BUF_SIZE);
+    printf("Writing to buffer\n");
+    
+    printf("Starting Dispatch\n");
+    error = event_dispatch();
+    printf("Event dispach returned %d - error?\n", error);
+}
+
+void connector_on_read(struct bufferevent *sabe, void *isnull) {
+    char buf[BUF_SIZE+1];
+    size_t len_read;
+    
+    do {
+        len_read = bufferevent_read(sabe, buf, BUF_SIZE);
+    
+        if(!check_pattern_a(buf, len_read)) {
+            buf[BUF_SIZE] = '\0';
+            printf("Recieved buffer failed pattern check a: recieved ");
+            printhex(buf, BUF_SIZE);
+            doexit(0);
+        }
+    } while (len_read != 0);
+    
+    gen_pattern_b(buf, BUF_SIZE);
+    //printf("Sending buffer: ");
+    //printhex(buf, BUF_SIZE);
+    bufferevent_write(sabe, buf, BUF_SIZE);
+    
+    printf(".");
+}
+    
+
+void connector() {
+    WSADATA wsaData;
+    struct bufferevent* csabe;
+    struct sockaddr_in socketAddr;
+    struct hostent* hostp;
+    struct in_addr* ipAddress;
+    int Connect;
+    int bindingHandle = -1;
+    int error;
+    int conret;
+    
+    WSAStartup(MAKEWORD( 2, 2 ), &wsaData);
+    event_init();
+    
+    //csabe = sa_bufferevent_new(connector_on_read, NULL, NULL, NULL);
+    
+    hostp = gethostbyname("localhost");
+    // It may be depriciated, but it's a lot easier to use than getaddrinfo
+    ipAddress = (struct in_addr*)hostp->h_addr_list[0];
+
+    socketAddr.sin_family = AF_INET;
+    socketAddr.sin_port = htons(LISTEN_PORT);
+    socketAddr.sin_addr.s_addr = ipAddress->s_addr;
+
+    printf("Creating Socket\n");
+    Connect = bufev_socket_new();
+    
+    printf("Connect = %d\n", (int) Connect);
+    
+    printf("Creating Bufferevent\n");
+    csabe = bufferevent_new(Connect, connector_on_read, NULL, NULL, NULL);
+
+    printf("Connecting...\n");
+    bufev_socket_connect(csabe, &socketAddr);
+    
+    printf("Connected.\n");
+    
+    printf("Starting Event Dispatch\n");
+    error = event_dispatch();
+    printf("Event dispach returned %d - error?\n", error);
+}

Added: libevent-urz/trunk/win_evbuffer.c
===================================================================
--- libevent-urz/trunk/win_evbuffer.c	                        (rev 0)
+++ libevent-urz/trunk/win_evbuffer.c	2007-07-19 07:58:47 UTC (rev 10877)
@@ -0,0 +1,114 @@
+#include <sys/types.h>
+#include "event.h"
+#include <stdio.h>
+#include "loaders/IOCPloader.h"
+
+static char IOCPinit = 0;
+
+/* Warning: Here be some nasty typecasting
+ * OK so basically the sa_bufferevent and bufferevent structs
+ * are compatible. Thus, we can use sa_bufferevent_new and cast
+ * the return to a bufferevent, as well as casting the callbacks
+ * to the appropriate type.
+ */
+
+//socket
+int bufev_socket_new(void) {
+    SOCKET ret;
+    ret = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
+    if(ret == INVALID_SOCKET) {
+        printf("Get Socket failed\n");
+        return -1;
+    }
+    return (int) ret;
+}
+// connect
+int bufev_socket_connect(struct bufferevent *bufev, struct sockaddr_in *addr) {
+    int ret;
+    printf("Connecting with %d\n", (SOCKET)(((struct sa_bufferevent *)bufev)->connection_handle));
+    ret = connect((SOCKET)(((struct sa_bufferevent *)bufev)->connection_handle), (struct sockaddr*)addr, sizeof(struct sockaddr_in));
+    if(ret == SOCKET_ERROR) {
+        printf("Connecting failed with error %d\n", (int) GetLastError());
+        return -1;
+    }
+    return ret;
+}
+// accept
+struct bufferevent *bufev_socket_accept(int listen_sock, evbuffercb readcb, evbuffercb writecb, everrorcb errorcb, void *cbarg) {
+    SOCKET returned;
+    printf("WSAAccept Starting\n");
+    returned = WSAAccept(listen_sock, NULL, NULL, NULL, 0);
+    if(returned == INVALID_SOCKET) {
+        return NULL;
+    }
+    printf("Accept Creating new Bufferevent with %d\n", (int) returned);
+    return bufferevent_new((int)returned, readcb, writecb, errorcb, cbarg);
+}
+// listen
+int bufev_socket_listen(int sock, int backlog) {
+    printf("Listen given sock: %d\n", sock);
+    return listen((SOCKET)sock, backlog);
+}
+// bind
+int bufev_socket_bind(int sock, struct sockaddr_in *bind_to) {
+    int ret;
+    ret = bind((SOCKET) sock, (struct sockaddr*) bind_to, sizeof(struct sockaddr_in));
+    if(ret == SOCKET_ERROR) {
+        return -1;
+    }
+    return ret;
+}
+
+struct bufferevent *bufferevent_new(int fd,
+    evbuffercb readcb, evbuffercb writecb, everrorcb errorcb, void *cbarg) {
+    
+    struct sa_bufferevent *new;
+    
+    if(!IOCPinit) {
+        IOCPLoaderInit();
+        IOCPinit = 1;
+    }
+    
+    new = sa_bufferevent_new((evsabuffercb) readcb,(evsabuffercb) writecb,(evsaerrorcb) errorcb, cbarg);
+    new->connection_handle = (void *) fd;
+    
+    IOCPloader_bind((SOCKET) fd, new);
+    
+    return (struct bufferevent *) new;
+}
+
+int bufferevent_base_set(struct event_base *base, struct bufferevent *bufev) {
+    // As per nickm's request
+}
+
+int bufferevent_priority_set(struct bufferevent *bufev, int pri) {
+    // As per nickm's request
+}
+
+void bufferevent_free(struct bufferevent *bufev) {
+    sa_bufferevent_free((struct sa_bufferevent *) bufev);
+}
+
+int bufferevent_write(struct bufferevent *bufev, void *data, size_t size) {
+    return sa_bufferevent_write((struct sa_bufferevent *) bufev, data, size);
+}
+
+int bufferevent_write_buffer(struct bufferevent *bufev, struct evbuffer *buf) {
+    return sa_bufferevent_write_buffer((struct sa_bufferevent *) bufev, buf);
+}
+
+size_t bufferevent_read(struct bufferevent *bufev, void *data, size_t size) {
+    return sa_bufferevent_read((struct sa_bufferevent *) bufev, data, size);
+}
+
+int bufferevent_enable(struct bufferevent *bufev, short event) {
+    return sa_bufferevent_enable((struct sa_bufferevent *) bufev, event);
+}
+
+int bufferevent_disable(struct bufferevent *bufev, short event) {
+    return sa_bufferevent_disable((struct sa_bufferevent *) bufev, event);
+}
+
+void bufferevent_settimeout(struct bufferevent *bufev, int timeout_read, int timeout_write) {
+    sa_bufferevent_settimeout((struct sa_bufferevent *) bufev, timeout_read, timeout_write);
+}