Commit 6ec9c109 authored by Mike Chiussi's avatar Mike Chiussi
Browse files

- made configure check if we are building for win32

- made configure link to required system dll's if building for win32
- added diffs for libevent 1.1b
- forced user to turn off eventdns if win32 is set 
- cleaned up tor_mmap_file()_win32 (not sure if it's stable)
- cleaned up some warnings and typos




svn:r8322
parent 585ae267
Changes related to compilation under MinGW/any sane win32 gcc
=============================================================
* event.c
- If gcc include "WIN32-Code/misc.h" instead of "misc.h"
* WIN32-Code/misc.h
- Add struct prototypes for timeval and timezone
* buffer.c
- changed type of "i" from "u_int" to "unsigned int". My MinGW wasn't
recognizing it. (u_int is normally typedef'ed to unsigned int, right?)
* evbuffer.c
- removed incorrect win32 error checking, see bufferevent_writecb().
(this needs to be fixed by anyone planning to use evbuffer on win32)
* log.c
- If gcc include "WIN32-Code/misc.h" instead of "misc.h"
* WIN32-Code/misc.c
- if gcc, include "misc.h"
- added newline at end of file to shut up gcc
* WIN32-Code/win32.c
- Altered the prototypes of win32_*() so their argument types didn't conflict
with the function definitions.
- Casted types of win32_* to void inside win32ops so that it didn't conflict
with the definition of eventops (gcc doesn't like this)
- Altered prototype of signal_handler to be static since definition is static
(why wasn't it like this before)
- Casted the second argument of signal() to be void*, some reason my MinGW
doesn't have sighandler_t typedef'ed.
* configure.in
- some code to check if we are compiling for WIN32.
* Makefile.am
- if BUILD_WIN32 is defined, include WIN32-Code/misc.c and
WIN32-Code/win32.c as source files.
- if WIN32, do not build test stuff. (not windows friendly)
- if WIN32, explicitly link to ws2_32.dll
Notes
-----
- We assume that if __GNUC__ is undefined we are building with MSVC
- If the user wishes to build a dll, they are on their own, the syntax is
compiler specific.
- Getting this warning from libtool, no idea why
"libtool: link: warning: undefined symbols not allowed in i686-pc-mingw32
shared libraries"
Changes related to "custom eventops"
====================================
* configure.in
- add argument --enable-custom-eventops, sets USE_CUSTOM_EVENTOPS in config.h
- add argument --enable-custom-code, sets USE_CUSTOM_CODE in Makefile
* Makefile.am
- if USE_CUSTOM_CODE, include custom/custom.c as a source file.
(I can't think of a way to pass a string to Makefile.am, so I'm stuck naming
the new source file custom.c. It just seems simpler this way, but I'm open
to suggestions)
* event.c
- if USE_CUSTOM_EVENTOPS, use eventops as defined in custom-eventops.h
Notes
-----
Just in case it isn't completely obvious, the goal of "custom eventops" is to
allow the user to include their own event processing system without requiring a
fork. This is accomplished through two parts. Firstly, by allowing the user to
redefine eventops. (for example, the user may wish to use epoll() exclusively).
Secondly, by allowing the user to include their own code to support a private
eventop (note, this may not be necessary, as the user may choose to include
already defined eventop's.
The current SVN version of Tor should compile with MinGW.
OpenSSL and libz both compile on MinGW out of the box.
libevent 1.1b will not build unless you apply the diff in this directory.
Only in libevent-1.1b: CHANGES
Only in libevent-1.1b: Makefile
diff -uwr libevent-1.1b-old/Makefile.am libevent-1.1b/Makefile.am
--- libevent-1.1b-old/Makefile.am Wed Aug 9 22:16:35 2006
+++ libevent-1.1b/Makefile.am Sat Sep 2 03:49:26 2006
@@ -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,8 +19,29 @@
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
+
+else
+
+SUBDIRS = . sample test
+SYS_LIBS =
+SYS_SRC =
+
+endif
+
+if USE_CUSTOM_CODE
+CUST_SRC = custom/custom.c
+else
+CUST_SRC =
+endif
+
+libevent_la_SOURCES = event.c buffer.c evbuffer.c log.c $(CUST_SRC) $(SYS_SRC)
+libevent_la_LIBADD = @LTLIBOBJS@ $(SYS_LIBS)
libevent_la_LDFLAGS = -release @VERSION@ -version-info 1:2:0
include_HEADERS = event.h
Only in libevent-1.1b: Makefile.in
diff -uwr libevent-1.1b-old/WIN32-Code/misc.c libevent-1.1b/WIN32-Code/misc.c
--- libevent-1.1b-old/WIN32-Code/misc.c Wed Aug 9 21:01:14 2006
+++ libevent-1.1b/WIN32-Code/misc.c Fri Sep 1 22:21:31 2006
@@ -4,6 +4,12 @@
#include <sys/timeb.h>
#include <time.h>
+#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 *)
diff -uwr libevent-1.1b-old/WIN32-Code/misc.h libevent-1.1b/WIN32-Code/misc.h
--- libevent-1.1b-old/WIN32-Code/misc.h Wed Aug 9 21:01:14 2006
+++ libevent-1.1b/WIN32-Code/misc.h Fri Sep 1 18:47:09 2006
@@ -1,6 +1,9 @@
#ifndef MISC_H
#define MISC_H
+struct timezone;
+struct timeval;
+
int gettimeofday(struct timeval *,struct timezone *);
#endif
diff -uwr libevent-1.1b-old/WIN32-Code/win32.c libevent-1.1b/WIN32-Code/win32.c
--- libevent-1.1b-old/WIN32-Code/win32.c Wed Aug 9 21:25:48 2006
+++ libevent-1.1b/WIN32-Code/win32.c Sat Sep 2 00:45:55 2006
@@ -60,7 +60,8 @@
/* MSDN says this is required to handle SIGFPE */
volatile double SIGFPE_REQ = 0.0f;
-int signal_handler(int sig);
+static int signal_handler(int sig);
+
void signal_process(void);
int signal_recalc(void);
@@ -77,20 +78,21 @@
};
void *win32_init (void);
-int win32_insert (void *, struct event *);
-int win32_del (void *, struct event *);
+int win32_insert (struct win32op *, struct event *);
+int win32_del (struct win32op *, struct event *);
int win32_recalc (struct event_base *base, void *, int);
-int win32_dispatch (struct event_base *base, void *, struct timeval *);
+int win32_dispatch (struct event_base *base, struct win32op *, struct timeval *);
struct eventop win32ops = {
"win32",
win32_init,
- win32_insert,
- win32_del,
+ (int (*) (void*, struct event*)) win32_insert,
+ (int (*) (void*, struct event*)) win32_del,
win32_recalc,
- win32_dispatch
+ (int (*) (struct event_base*, void*, struct timeval*)) win32_dispatch
};
+
#define FD_SET_ALLOC_SIZE(n) ((sizeof(struct win_fd_set) + ((n)-1)*sizeof(SOCKET)))
static int
@@ -213,7 +215,13 @@
if (ev->ev_events & (EV_READ|EV_WRITE))
event_errx(1, "%s: EV_SIGNAL incompatible use",
__func__);
+
+#ifndef __GNUC__
if((int)signal(EVENT_SIGNAL(ev), signal_handler) == -1)
+#else
+ if((int)signal(EVENT_SIGNAL(ev), (void*) signal_handler) == -1)
+#endif
+
return (-1);
return (0);
@@ -382,8 +390,13 @@
/* Reinstall our signal handler. */
TAILQ_FOREACH(ev, &signalqueue, ev_signal_next) {
+#ifndef __GNUC__
if((int)signal(EVENT_SIGNAL(ev), signal_handler) == -1)
+#else
+ if((int)signal(EVENT_SIGNAL(ev), (void*) signal_handler) == -1)
+#endif
return (-1);
+
}
return (0);
}
Only in libevent-1.1b-old/: aclocal.m4
Only in libevent-1.1b: autom4te.cache
diff -uwr libevent-1.1b-old/buffer.c libevent-1.1b/buffer.c
--- libevent-1.1b-old/buffer.c Wed Aug 9 22:01:40 2006
+++ libevent-1.1b/buffer.c Fri Sep 1 18:52:56 2006
@@ -197,7 +197,7 @@
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')
Only in libevent-1.1b: config.guess
Only in libevent-1.1b: config.h
diff -uwr libevent-1.1b-old/config.h.in libevent-1.1b/config.h.in
--- libevent-1.1b-old/config.h.in Wed Aug 9 21:27:37 2006
+++ libevent-1.1b/config.h.in Sat Sep 2 02:23:17 2006
@@ -223,6 +223,9 @@
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
#undef TIME_WITH_SYS_TIME
+/* Define to 1 if you want to use a custom eventops variable */
+#undef USE_CUSTOM_EVENTOPS
+
/* Version number of package */
#undef VERSION
@@ -232,11 +235,9 @@
/* Define to empty if `const' does not conform to ANSI C. */
#undef const
-/* Define to `__inline__' or `__inline' if that's what the C compiler
- calls it, or to nothing if 'inline' is not supported under any name. */
-#ifndef __cplusplus
+/* Define as `__inline' if that's what the C compiler calls it, or to nothing
+ if it is not supported. */
#undef inline
-#endif
/* Define to `int' if <sys/types.h> does not define. */
#undef pid_t
Only in libevent-1.1b: config.h.in~
Only in libevent-1.1b: config.log
Only in libevent-1.1b: config.status
Only in libevent-1.1b: configure
diff -uwr libevent-1.1b-old/configure.in libevent-1.1b/configure.in
--- libevent-1.1b-old/configure.in Wed Aug 9 22:05:17 2006
+++ libevent-1.1b/configure.in Sat Sep 2 03:40:15 2006
@@ -21,6 +21,18 @@
CFLAGS="$CFLAGS -Wall"
fi
+AC_ARG_ENABLE(custom-eventops,
+ [ --enable-custom-eventops Use custom eventops variable],
+ AC_DEFINE([USE_CUSTOM_EVENTOPS],[1],
+ [Define to 1 to use a custom eventops variable])
+ ,)
+AC_ARG_ENABLE(custom-code,
+ [ --enable-custom-code Use custom code from custom/],
+ customcodev=true,
+ customcodev=false)
+
+AM_CONDITIONAL(USE_CUSTOM_CODE, test x$customcodev = xtrue)
+
AC_PROG_LIBTOOL
dnl Uncomment "AC_DISABLE_SHARED" to make shared librraries not get
@@ -110,6 +122,22 @@
AC_MSG_RESULT(yes)] ,AC_MSG_RESULT(no)
)
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
diff -uwr libevent-1.1b-old/evbuffer.c libevent-1.1b/evbuffer.c
--- libevent-1.1b-old/evbuffer.c Wed Aug 9 21:01:14 2006
+++ libevent-1.1b/evbuffer.c Fri Sep 1 19:18:13 2006
@@ -154,12 +154,20 @@
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;
@@ -181,6 +189,7 @@
return;
reschedule:
+
if (EVBUFFER_LENGTH(bufev->output) != 0)
bufferevent_add(&bufev->ev_write, bufev->timeout_write);
return;
diff -uwr libevent-1.1b-old/event.c libevent-1.1b/event.c
--- libevent-1.1b-old/event.c Wed Aug 9 21:25:48 2006
+++ libevent-1.1b/event.c Sat Sep 2 04:22:05 2006
@@ -30,8 +30,14 @@
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#undef WIN32_LEAN_AND_MEAN
+
+#ifdef __GNUC__
+#include "WIN32-Code/misc.h"
+#else
#include "misc.h"
#endif
+
+#endif
#include <sys/types.h>
#include <sys/tree.h>
#ifdef HAVE_SYS_TIME_H
@@ -53,6 +59,7 @@
#include "event-internal.h"
#include "log.h"
+
#ifdef HAVE_SELECT
extern const struct eventop selectops;
#endif
@@ -75,6 +82,8 @@
extern const struct eventop win32ops;
#endif
+#ifndef USE_CUSTOM_EVENTOPS
+
/* In order of preference */
const struct eventop *eventops[] = {
#ifdef HAVE_WORKING_KQUEUE
@@ -101,6 +110,11 @@
NULL
};
+#else
+#include "custom-eventops.h"
+#endif //USE_CUSTOM_EVENTOPS
+
+
/* Global state */
struct event_list signalqueue;
Only in libevent-1.1b: libtool
diff -uwr libevent-1.1b-old/log.c libevent-1.1b/log.c
--- libevent-1.1b-old/log.c Wed Aug 9 21:01:14 2006
+++ libevent-1.1b/log.c Fri Sep 1 19:09:45 2006
@@ -45,8 +45,14 @@
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#undef WIN32_LEAN_AND_MEAN
+
+#ifdef __GNUC__
+#include "WIN32-Code/misc.h"
+#else
#include "misc.h"
#endif
+
+#endif
#include <sys/types.h>
#include <sys/tree.h>
#ifdef HAVE_SYS_TIME_H
Only in libevent-1.1b/sample: Makefile
Only in libevent-1.1b/sample: Makefile.in
Only in libevent-1.1b: stamp-h1
Only in libevent-1.1b/test: Makefile
Only in libevent-1.1b/test: Makefile.in
......@@ -74,6 +74,36 @@ AC_PROG_CC
AC_PROG_MAKE_SET
AC_PROG_RANLIB
# If WIN32 is defined and non-zero, we are building for win32
AC_MSG_CHECKING([for win32])
AC_TRY_COMPILE(,
[
#ifdef WIN32
#if WIN32
//all is well
#else
#error
#endif
#else
#error
#endif
],
bwin32=true; AC_MSG_RESULT([yes]),
bwin32=false; AC_MSG_RESULT([no])
)
if test $bwin32 = true; then
AC_DEFINE(MS_WINDOWS,1, [Define to 1 if we are building for a Windows platform.])
if test $eventdns = true; then
AC_MSG_ERROR([tor+eventdns not yet supported on Windows.])
fi
fi
# The big search for OpenSSL
# copied from openssh's configure.ac
tryssldir=""
......@@ -133,8 +163,13 @@ AC_CACHE_CHECK([for libevent directory], ac_cv_libevent_dir, [
le_found=no
for ledir in $trylibeventdir "" $prefix /usr/local ; do
LDFLAGS="$saved_LDFLAGS"
LIBS="$saved_LIBS -levent"
if test $bwin32 = true; then
LIBS="$saved_LIBS -levent -lws2_32"
else
LIBS="$saved_LIBS -levent"
fi
# Skip the directory if it isn't there.
if test ! -z "$ledir" -a ! -d "$ledir" ; then
continue;
......@@ -173,7 +208,12 @@ AC_CACHE_CHECK([for libevent directory], ac_cv_libevent_dir, [
AC_MSG_ERROR([Could not find a linkable libevent. You can specify an explicit path using --with-libevent-dir])
fi
])
if test $bwin32 = true; then
LIBS="$LIBS -levent -lws2_32"
else
LIBS="$LIBS -levent"
fi
if test $ac_cv_libevent_dir != "(system)"; then
if test -d "$ac_cv_libevent_dir/lib" ; then
LDFLAGS="-L$ac_cv_libevent_dir/lib $LDFLAGS"
......@@ -233,8 +273,13 @@ AC_CACHE_CHECK([for OpenSSL directory], ac_cv_openssl_dir, [
ssl_found=no
for ssldir in $tryssldir "" $prefix /usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /usr/pkg /opt /opt/openssl ; do
LDFLAGS="$saved_LDFLAGS"
LIBS="$saved_LIBS -lssl -lcrypto"
if test $bwin32 = true; then
LIBS="$LIBS -lssl -lcrypto -lws2_32 -lgdi32"
else
LIBS="$LIBS -lssl -lcrypto"
fi
# Skip the directory if it isn't there.
if test ! -z "$ssldir" -a ! -d "$ssldir" ; then
continue;
......@@ -272,7 +317,13 @@ AC_CACHE_CHECK([for OpenSSL directory], ac_cv_openssl_dir, [
AC_MSG_ERROR([Could not find a linkable OpenSSL. You can specify an explicit path using --with-ssl-dir])
fi
])
if test $bwin32 = true; then
LIBS="$LIBS -lssl -lcrypto -lws2_32 -lgdi32"
else
LIBS="$LIBS -lssl -lcrypto"
fi
if test "$ac_cv_openssl_dir" != "(system)"; then
if test -d "$ac_cv_openssl_dir/lib" ; then
LDFLAGS="-L$ac_cv_openssl_dir/lib $LDFLAGS"
......@@ -359,7 +410,18 @@ dnl The warning message here is no longer strictly accurate.
AC_CHECK_HEADERS(unistd.h string.h signal.h netdb.h ctype.h sys/stat.h sys/types.h fcntl.h sys/fcntl.h sys/ioctl.h sys/socket.h sys/time.h netinet/in.h arpa/inet.h errno.h assert.h time.h pwd.h grp.h, , AC_MSG_WARN(some headers were not found, compilation may fail))
AC_CHECK_HEADERS(event.h, , AC_MSG_ERROR(Libevent header (event.h) not found. Tor requires libevent to build.))
# if the user doesn't have timeval this will generate a nasty warning. if
# timeval isn't provided, define one
AC_CHECK_HEADERS(event.h, , AC_MSG_ERROR(Libevent header (event.h) not found. Tor requires libevent to build.),
[#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#else
struct timeval {
long tv_sec;
long tv_usec;
}
#endif]
)
AC_CHECK_HEADERS(zlib.h, , AC_MSG_ERROR(Zlib header (zlib.h) not found. Tor requires zlib to build. You may need to install a zlib development package.))
......
......@@ -163,47 +163,56 @@ typedef struct win_mmap_t {
tor_mmap_t *
tor_mmap_file(const char *filename)
{
win_mmap_t *res = tor_malloc_zero(sizeof(win_mmap_t));
struct win_mmap_t *res = tor_malloc_zero(sizeof(struct win_mmap_t));
res->mmap_handle = res->file_handle = INVALID_HANDLE_VALUE;
res->file_handle = CreateFileForMapping(filename,
GENERIC_READ,
0, NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
res->file_handle = CreateFile(filename,
GENERIC_READ,
0, NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if (res->file_handle == INVALID_HANDLE_VALUE)
goto err;
res->base.size = GetFileSize(res->file_handle, NULL);
res->mmap_handle = CreateFileMapping(res->file_handle,
NULL,
PAGE_READONLY,
(size >> 32),
(size & 0xfffffffful),
0,
res->base.size,
NULL);
if (res->mmap_handle != INVALID_HANDLE_VALUE)
goto err;
res->base.data = (char*) MapViewOfFile(res->mmap_handle,
access,
FILE_MAP_READ,
0, 0, 0);
if (!res->data)
if (!res->base.data)
goto err;
return &(res->base);
err:
tor_munmap_file(res);
tor_munmap_file(&res->base);
return NULL;
}
void
tor_munmap_file(tor_mmap_t *handle)
{
win_mmap_t *h = (win_mmap_t*)
(((char*)handle) - STRUCT_OFFSET(win_mmap_t, base));
struct win_mmap_t *h = (struct win_mmap_t*)
(((char*)handle) - STRUCT_OFFSET(struct win_mmap_t, base));
if (handle->data)
UnmapViewOfFile(handle->data);
if (res->mmap_handle != INVALID_HANDLE_VALUE)
CloseHandle(res->mmap_handle);
if (res->file_handle != INVALID_HANDLE_VALUE)
CloseHandle(self->file_handle);
tor_free(res);
/*this is an ugly cast, but without it, "data" in struct tor_mmap_t would
have to be redefined as const*/
UnmapViewOfFile( (LPVOID) handle->data);
if (h->mmap_handle != INVALID_HANDLE_VALUE)
CloseHandle(h->mmap_handle);
if (h->file_handle != INVALID_HANDLE_VALUE)
CloseHandle(h->file_handle);
tor_free(h);
}
#else
tor_mmap_t *
......@@ -417,8 +426,8 @@ void
set_socket_nonblocking(int socket)
{
#ifdef MS_WINDOWS
int nonblocking = 1;
ioctlsocket(socket, FIONBIO, (unsigned long*) &nonblocking);
unsigned long nonblocking = 1;
ioctlsocket(socket, FIONBIO, (unsigned long*) &nonblocking);
#else
fcntl(socket, F_SETFL, O_NONBLOCK);
#endif
......@@ -444,7 +453,8 @@ set_socket_nonblocking(int socket)
int
tor_socketpair(int family, int type, int protocol, int fd[2])
{
#ifdef HAVE_SOCKETPAIR
//don't use win32 socketpairs (they are always bad)
#if defined(HAVE_SOCKETPAIR) && !defined(MS_WINDOWS)
int r;
r = socketpair(family, type, protocol, fd);
return r < 0 ? -errno : r;
......@@ -562,7 +572,7 @@ set_max_file_descriptors(unsigned long limit, unsigned long cap)
log_fn(LOG_INFO, LD_NET,
"This platform is missing getrlimit(). Proceeding.");