Allow compiling for Windows XP and higher.
authorGuus Sliepen <guus@tinc-vpn.org>
Mon, 14 Sep 2009 22:24:31 +0000 (00:24 +0200)
committerGuus Sliepen <guus@tinc-vpn.org>
Mon, 14 Sep 2009 22:24:31 +0000 (00:24 +0200)
This allows us to use getaddrinfo(), getnameinfo() and related functions, which
allow tinc to make connections over existing IPv6 networks. These functions are
not available on Windows 2000 however. By default, support is enabled, but when
compiling for Windows 2000 the configure switch --with-windows2000 should be
used.

Since getaddrinfo() et al. are not functions but macros on Windows, we have to
use AC_CHECK_DECLS() instead of AC_CHECK_FUNCS() in configure.in.

configure.in
have.h
lib/dropin.h
lib/fake-getaddrinfo.c
lib/fake-getaddrinfo.h
lib/fake-getnameinfo.c
lib/fake-getnameinfo.h

index eff93a0881a59be8bda98d9f18453a0347f4f8b3..1ff36b3f8ebf96fa39457c04bb61992edda47689 100644 (file)
@@ -82,6 +82,11 @@ AC_ARG_ENABLE(tunemu,
   ]
 )
 
+AC_ARG_WITH(windows2000,
+  AS_HELP_STRING([--with-windows2000], [compile with support for Windows 2000. This disables support for tunneling over existing IPv6 networks.]),
+  [AC_DEFINE(WITH_WINDOWS2000, 1, [Compile with support for Windows 2000])]
+)
+
 AM_CONDITIONAL(TUNEMU, test "$tunemu" = true)
 
 AC_CACHE_SAVE
@@ -143,7 +148,7 @@ AC_CHECK_FUNC(gethostbyname, [], [
   AC_CHECK_LIB(nsl, gethostbyname)
 ])
 
-AC_CHECK_FUNCS([freeaddrinfo gai_strerror getaddrinfo getnameinfo inet_aton],
+AC_CHECK_DECLS([freeaddrinfo, gai_strerror, getaddrinfo, getnameinfo],
   [], [], [#include "have.h"]
 )
 
diff --git a/have.h b/have.h
index 8a58af33764954a40d21f524a7979513d1692a41..7e2930dcbbca15e95162f5a052a11cbd98f0d657 100644 (file)
--- a/have.h
+++ b/have.h
 #include <fcntl.h>
 #include <unistd.h>
 
+#ifdef HAVE_MINGW
+#ifdef WITH_WINDOWS2000
+#define WINVER Windows2000
+#else
+#define WINVER WindowsXP
+#endif
+#include <w32api.h>
+#include <windows.h>
+#include <ws2tcpip.h>
+#endif
+
 #ifdef HAVE_STDBOOL_H
 #include <stdbool.h>
 #endif
 #include <netinet/if_ether.h>
 #endif
 
-#ifdef HAVE_MINGW
-#include <windows.h>
-#include <winsock2.h>
-#endif
-
 #endif /* __TINC_SYSTEM_H__ */
index 72109c847accf42c51671cc4d820adf225ffc5b7..4db7d7e07a0a586c4bce3cb6fc880a0b3afa2b0f 100644 (file)
@@ -39,11 +39,6 @@ extern int asprintf(char **, const char *, ...);
 extern int vasprintf(char **, const char *, va_list ap);
 #endif
 
-#ifndef HAVE_GETNAMEINFO
-extern int getnameinfo(const struct sockaddr *sa, size_t salen, char *host,
-                                          size_t hostlen, char *serv, size_t servlen, int flags);
-#endif
-
 #ifndef HAVE_GETTIMEOFDAY
 extern int gettimeofday(struct timeval *, void *);
 #endif
index 14420b586d0ff261743f2aa65a7f228368ff9faa..10672b7e6f07eee8749a120c66eeff1a2703cbf8 100644 (file)
@@ -16,7 +16,7 @@
 #include "fake-getaddrinfo.h"
 #include "xalloc.h"
 
-#ifndef HAVE_GAI_STRERROR
+#if !HAVE_DECL_GAI_STRERROR
 char *gai_strerror(int ecode)
 {
        switch (ecode) {
@@ -32,7 +32,7 @@ char *gai_strerror(int ecode)
 }    
 #endif /* !HAVE_GAI_STRERROR */
 
-#ifndef HAVE_FREEADDRINFO
+#if !HAVE_DECL_FREEADDRINFO
 void freeaddrinfo(struct addrinfo *ai)
 {
        struct addrinfo *next;
@@ -45,7 +45,7 @@ void freeaddrinfo(struct addrinfo *ai)
 }
 #endif /* !HAVE_FREEADDRINFO */
 
-#ifndef HAVE_GETADDRINFO
+#if !HAVE_DECL_GETADDRINFO
 static struct addrinfo *malloc_ai(uint16_t port, uint32_t addr)
 {
        struct addrinfo *ai;
index d2b46f628c5f4b60a00ff3caf7baa789a132789b..d31a89a1b14da6e41db71be929cd7d19cd631623 100644 (file)
@@ -33,16 +33,16 @@ struct addrinfo {
 };
 #endif /* !HAVE_STRUCT_ADDRINFO */
 
-#ifndef HAVE_GETADDRINFO
+#if !HAVE_DECL_GETADDRINFO
 int getaddrinfo(const char *hostname, const char *servname, 
                 const struct addrinfo *hints, struct addrinfo **res);
 #endif /* !HAVE_GETADDRINFO */
 
-#ifndef HAVE_GAI_STRERROR
+#if !HAVE_DECL_GAI_STRERROR
 char *gai_strerror(int ecode);
 #endif /* !HAVE_GAI_STRERROR */
 
-#ifndef HAVE_FREEADDRINFO
+#if !HAVE_DECL_FREEADDRINFO
 void freeaddrinfo(struct addrinfo *ai);
 #endif /* !HAVE_FREEADDRINFO */
 
index 796efdf80cdf3c527024ce387630426954cd6b9e..804717309c809c05953a425f9c2e4ce5c9121e25 100644 (file)
@@ -14,7 +14,7 @@
 #include "fake-getnameinfo.h"
 #include "fake-getaddrinfo.h"
 
-#ifndef HAVE_GETNAMEINFO
+#if !HAVE_DECL_GETNAMEINFO
 
 int getnameinfo(const struct sockaddr *sa, size_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags)
 {
index 0f0b4bcc30582de526b72b362e10b736a58f4a1e..02ac77a1d1cf3d02bde0314a45c9f0d0ec16159a 100644 (file)
@@ -3,7 +3,7 @@
 #ifndef _FAKE_GETNAMEINFO_H
 #define _FAKE_GETNAMEINFO_H
 
-#ifndef HAVE_GETNAMEINFO
+#if !HAVE_DECL_GETNAMEINFO
 int getnameinfo(const struct sockaddr *sa, size_t salen, char *host, 
                 size_t hostlen, char *serv, size_t servlen, int flags);
 #endif /* !HAVE_GETNAMEINFO */