From 0f33fc5b84ccdd73f6c899a275c11053710682b1 Mon Sep 17 00:00:00 2001 From: Niels Provos Date: Wed, 27 Sep 2006 03:18:45 +0000 Subject: integrate from trunk: mingw support from Nick svn:r236 --- Makefile.am | 23 +++++++++++++++++++---- WIN32-Code/misc.c | 8 ++++++++ WIN32-Code/misc.h | 5 +++++ WIN32-Code/win32.c | 16 +++++++++------- buffer.c | 2 +- configure.in | 15 +++++++++++++++ evbuffer.c | 8 ++++++++ 7 files changed, 65 insertions(+), 12 deletions(-) diff --git a/Makefile.am b/Makefile.am index 3dbee885..d36eec03 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,5 @@ AUTOMAKE_OPTIONS = foreign no-dependencies -SUBDIRS = . sample test EXTRA_DIST = acconfig.h event.h event-internal.h log.h evsignal.h event.3 \ kqueue.c epoll_sub.c epoll.c select.c rtsig.c poll.c signal.c \ @@ -20,13 +19,29 @@ EXTRA_DIST = acconfig.h event.h event-internal.h log.h evsignal.h event.3 \ lib_LTLIBRARIES = libevent.la -libevent_la_SOURCES = event.c buffer.c evbuffer.c log.c -libevent_la_LIBADD = @LTLIBOBJS@ +if BUILD_WIN32 + +SUBDIRS = . sample +SYS_LIBS = -lws2_32 +SYS_SRC = WIN32-Code/misc.c WIN32-Code/win32.c +SYS_INCLUDES = -IWIN32-Code + +else + +SUBDIRS = . sample test +SYS_LIBS = +SYS_SRC = +SYS_INCLUDES = + +endif + +libevent_la_SOURCES = event.c buffer.c evbuffer.c log.c $(SYS_SRC) +libevent_la_LIBADD = @LTLIBOBJS@ $(SYS_LIBS) libevent_la_LDFLAGS = -release @VERSION@ -version-info 1:2:0 include_HEADERS = event.h -INCLUDES = -Icompat +INCLUDES = -Icompat $(SYS_INCLUDES) man_MANS = event.3 diff --git a/WIN32-Code/misc.c b/WIN32-Code/misc.c index 7329242b..6f63ddfe 100644 --- a/WIN32-Code/misc.c +++ b/WIN32-Code/misc.c @@ -4,6 +4,12 @@ #include #include +#ifdef __GNUC__ +/*our prototypes for timeval and timezone are in here, just in case the above + headers don't have them*/ +#include "misc.h" +#endif + /**************************************************************************** * * Function: gettimeofday(struct timeval *, struct timezone *) @@ -17,6 +23,7 @@ * ****************************************************************************/ +#ifndef HAVE_GETTIMEOFDAY int gettimeofday(struct timeval *tv, struct timezone *tz) { struct _timeb tb; @@ -28,6 +35,7 @@ int gettimeofday(struct timeval *tv, struct timezone *tz) { tv->tv_usec = ((int) tb.millitm) * 1000; return 0; } +#endif int win_read(int fd, void *buf, unsigned int length) diff --git a/WIN32-Code/misc.h b/WIN32-Code/misc.h index 84f1eb2a..aced5746 100644 --- a/WIN32-Code/misc.h +++ b/WIN32-Code/misc.h @@ -1,6 +1,11 @@ #ifndef MISC_H #define MISC_H +struct timezone; +struct timeval; + +#ifndef HAVE_GETTIMEOFDAY int gettimeofday(struct timeval *,struct timezone *); +#endif #endif diff --git a/WIN32-Code/win32.c b/WIN32-Code/win32.c index 90a663a5..d8740ac9 100644 --- a/WIN32-Code/win32.c +++ b/WIN32-Code/win32.c @@ -60,7 +60,8 @@ volatile sig_atomic_t signal_caught = 0; /* MSDN says this is required to handle SIGFPE */ volatile double SIGFPE_REQ = 0.0f; -int signal_handler(int sig); +static void signal_handler(int sig); + void signal_process(void); int signal_recalc(void); @@ -205,8 +206,9 @@ win32_recalc(struct event_base *base, void *arg, int max) } int -win32_insert(struct win32op *win32op, struct event *ev) +win32_insert(void *op, struct event *ev) { + struct win32op *win32op = op; int i; if (ev->ev_events & EV_SIGNAL) { @@ -251,8 +253,9 @@ win32_insert(struct win32op *win32op, struct event *ev) } int -win32_del(struct win32op *win32op, struct event *ev) +win32_del(void *op, struct event *ev) { + struct win32op *win32op = op; int i, found; if (ev->ev_events & EV_SIGNAL) @@ -302,9 +305,10 @@ fd_set_copy(struct win_fd_set *out, const struct win_fd_set *in) */ int -win32_dispatch(struct event_base *base, struct win32op *win32op, +win32_dispatch(struct event_base *base, void *op, struct timeval *tv) { + struct win32op *win32op = op; int res = 0; int i; int fd_count; @@ -366,13 +370,11 @@ win32_dispatch(struct event_base *base, struct win32op *win32op, } -static int +static void signal_handler(int sig) { evsigcaught[sig]++; signal_caught = 1; - - return 0; } int diff --git a/buffer.c b/buffer.c index e641e91f..e09cc3d3 100644 --- a/buffer.c +++ b/buffer.c @@ -197,7 +197,7 @@ evbuffer_readline(struct evbuffer *buffer) u_char *data = EVBUFFER_DATA(buffer); size_t len = EVBUFFER_LENGTH(buffer); char *line; - u_int i; + unsigned int i; for (i = 0; i < len; i++) { if (data[i] == '\r' || data[i] == '\n') diff --git a/configure.in b/configure.in index a27959f9..4d6b2df6 100644 --- a/configure.in +++ b/configure.in @@ -111,6 +111,21 @@ if test "x$ac_cv_header_sys_time_h" = "xyes"; then ) fi +dnl - check if the macro WIN32 is defined on this compiler. +dnl - (this is how we check for a windows version of GCC) +AC_MSG_CHECKING(for WIN32) +AC_TRY_COMPILE(, + [ + #ifndef WIN32 + #error + #endif + ], + bwin32=true; AC_MSG_RESULT(yes), + bwin32=false; AC_MSG_RESULT(no), +) + +AM_CONDITIONAL(BUILD_WIN32, test x$bwin32 = xtrue) + dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_C_INLINE diff --git a/evbuffer.c b/evbuffer.c index e9f7e43a..684b325d 100644 --- a/evbuffer.c +++ b/evbuffer.c @@ -154,12 +154,20 @@ bufferevent_writecb(int fd, short event, void *arg) if (EVBUFFER_LENGTH(bufev->output)) { res = evbuffer_write(bufev->output, fd); if (res == -1) { +#ifndef WIN32 +/*todo. evbuffer uses WriteFile when WIN32 is set. WIN32 system calls do not + *set errno. thus this error checking is not portable*/ if (errno == EAGAIN || errno == EINTR || errno == EINPROGRESS) goto reschedule; /* error case */ what |= EVBUFFER_ERROR; + +#else + goto reschedule; +#endif + } else if (res == 0) { /* eof case */ what |= EVBUFFER_EOF; -- cgit v1.2.1