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