Problems with IPv6-related include files on Windows
Stefan Puiu
stefanpuiu at itcnetworks.ro
Thu Feb 10 18:21:16 UTC 2005
I've tried to write a simple wrapper library around the functionality
provided by cfg_parse_file()/bind9_check_namedconf() and the zone
parsing stuff, mainly inspired by what the named-check* binaries do; I'm
using the BIND 9.3.0 headers and libraries. I've tried building the
library on Windows 2000 using MS VC++ 6.0 (SP6), but I've stumbled on a
problem we're familiar with here: conflicts between BIND 9 includes and
various stuff in winsock2.h, mostly IPv6-related. We already have an app
that uses BIND 9.2.3 libraries and includes and a lot of the source
files are prefixed by an:
#ifdef WIN32
# ifndef ISC_IPV6_H
# define ISC_IPV6_H 1
# endif
#endif
because otherwise sockaddr_in6 from isc/include/isc/ipv6.h would show up
as redefined - it's already defined in ws2tcpip.h in the MSDEV includes.
Now with BIND 9.3.0, doing that doesn't help for my test library, since
I'm getting another error about:
d:\src\bind\bind-9.3.0\lib\isc\win32\include\isc\net.h(116) : error
C2079: 'ipi6_addr' uses undefined struct 'in6_addr'
Digging a bit I see MSDEV 6 only has in_addr6 defined (ws2tcpip.h), not
in6_addr. In the lib/isc/include/isc/platform.h for Solaris, I noticed
this:
/*
* If this system has in_addr6, rather than in6_addr,
ISC_PLATFORM_HAVEINADDR6
* will be defined.
*/
#undef ISC_PLATFORM_HAVEINADDR6
And in lib/isc/unix/include/isc/net.h:
#ifdef ISC_PLATFORM_HAVEINADDR6
#define in6_addr in_addr6 /* Required for pre RFC2133
implementations. */
#endif
Adding #define ISC_PLATFORM_HAVEINADDR6 to the Win32 platform.h and the
part above to lib/isc/win32/include/isc/net.h right before the line that
gives the said error fixes the problem - this is a fix I'd really love
to see in 9.3.1. I've checked, it isn't in 9.3.1beta2, and neither is
the one I'm talking about below.
Another fix I needed to apply was in lib/isc/win32/include/isc/net.h by
wrapping the "#include <isc/ipv6.h>" line in a "#ifndef
ISC_PLATFORM_HAVEIPV6" block, just like things are right now in its UNIX
counterpart. These two fixes would make all compile errors go away. I've
attached two diffs, one for each file I had to edit.
Any reason not to apply these simple changes? I don't know about MSDEV
7, though, maybe some #ifdefs to detect compiler/include file version
would also be needed in order to maintain compatibility.
-- Attached file included as plaintext by Ecartis --
-- File: platform.h.diff
--- platform.h 2004-04-19 09:39:56.000000000 +0300
+++ /d/src/bind/bind-9.3.0/lib/isc/win32/include/isc/platform.h 2005-02-10 20:05:26.269750000 +0200
@@ -33,7 +33,8 @@
#define ISC_PLATFORM_HAVEIPV6
#if _MSC_VER > 1200
#define ISC_PLATFORM_HAVEIN6PKTINFO
-#endif
+#endif
+#define ISC_PLATFORM_HAVEINADDR6 1
#define ISC_PLATFORM_NEEDPORTT
#undef MSG_TRUNC
#define ISC_PLATFORM_NEEDNTOP
-- Attached file included as plaintext by Ecartis --
-- File: net.h.diff
--- net.h 2004-04-29 04:31:23.000000000 +0300
+++ /d/src/bind/bind-9.3.0/lib/isc/win32/include/isc/net.h 2005-02-10 20:06:21.894750000 +0200
@@ -98,7 +98,13 @@
#include <isc/types.h>
#include <ws2tcpip.h>
-#include <isc/ipv6.h>
+#ifndef ISC_PLATFORM_HAVEIPV6
+#include <isc/ipv6.h>
+#endif
+
+#ifdef ISC_PLATFORM_HAVEINADDR6
+#define in6_addr in_addr6 /* Required for pre RFC2133 implementations. */
+#endif
/*
* This is here because named client, interfacemgr.c, etc. use the name as
More information about the bind-users
mailing list