$NetBSD: patch-am,v 1.2 2009/06/07 08:36:36 tron Exp $

--- src/ip/IpAddress.cc.orig	2009-04-18 15:12:22.000000000 +0200
+++ src/ip/IpAddress.cc	2009-04-18 15:38:23.000000000 +0200
@@ -247,11 +247,7 @@
 #if USE_IPV6
 
     return IsAnyAddr() || IsNoAddr() ||
-           ( m_SocketAddr.sin6_addr.s6_addr32[0] == htonl(0x00000000) &&
-             m_SocketAddr.sin6_addr.s6_addr32[1] == htonl(0x00000000) &&
-             m_SocketAddr.sin6_addr.s6_addr32[2] == htonl(0x0000FFFF)
-           );
-
+           IN6_IS_ADDR_V4MAPPED( &m_SocketAddr.sin6_addr );
 #else
     return true; // enforce IPv4 in IPv4-only mode.
 #endif
@@ -262,10 +258,7 @@
 #if USE_IPV6
 
     return IsAnyAddr() || IsNoAddr() ||
-           !( m_SocketAddr.sin6_addr.s6_addr32[0] == htonl(0x00000000) &&
-              m_SocketAddr.sin6_addr.s6_addr32[1] == htonl(0x00000000) &&
-              m_SocketAddr.sin6_addr.s6_addr32[2] == htonl(0x0000FFFF)
-            );
+           !IN6_IS_ADDR_V4MAPPED( &m_SocketAddr.sin6_addr );
 #else
     return false; // enforce IPv4 in IPv4-only mode.
 #endif
@@ -274,11 +267,7 @@
 bool IpAddress::IsAnyAddr() const
 {
 #if USE_IPV6
-    return     m_SocketAddr.sin6_addr.s6_addr32[0] == 0
-               && m_SocketAddr.sin6_addr.s6_addr32[1] == 0
-               && m_SocketAddr.sin6_addr.s6_addr32[2] == 0
-               && m_SocketAddr.sin6_addr.s6_addr32[3] == 0
-               ;
+    return     IN6_IS_ADDR_UNSPECIFIED( &m_SocketAddr.sin6_addr );
 #else
 
     return (INADDR_ANY == m_SocketAddr.sin_addr.s_addr);
@@ -304,15 +293,20 @@
 bool IpAddress::SetIPv4()
 {
 #if USE_IPV6
+    static const struct in6_addr v4_localhost =
+	{{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	    0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x01 }}};
+    static const struct in6_addr v4_any =
+	{{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	    0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }}};
 
     if ( IsLocalhost() ) {
-        m_SocketAddr.sin6_addr.s6_addr32[2] = htonl(0xffff);
-        m_SocketAddr.sin6_addr.s6_addr32[3] = htonl(0x7F000001);
+        m_SocketAddr.sin6_addr = v4_localhost;
         return true;
     }
 
     if ( IsAnyAddr() ) {
-        m_SocketAddr.sin6_addr.s6_addr32[2] = htonl(0xffff);
+        m_SocketAddr.sin6_addr = v4_any;
         return true;
     }
 
@@ -329,17 +323,13 @@
 bool IpAddress::IsLocalhost() const
 {
 #if USE_IPV6
-    return    (   m_SocketAddr.sin6_addr.s6_addr32[0] == 0
-                  && m_SocketAddr.sin6_addr.s6_addr32[1] == 0
-                  && m_SocketAddr.sin6_addr.s6_addr32[2] == 0
-                  && m_SocketAddr.sin6_addr.s6_addr32[3] == htonl(0x1)
-              )
+    static const struct in6_addr v4_localhost =
+	{{{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	    0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x01 }}};
+
+    return    IN6_IS_ADDR_LOOPBACK( &m_SocketAddr.sin6_addr )
               ||
-              (   m_SocketAddr.sin6_addr.s6_addr32[0] == 0
-                  && m_SocketAddr.sin6_addr.s6_addr32[1] == 0
-                  && m_SocketAddr.sin6_addr.s6_addr32[2] == htonl(0xffff)
-                  && m_SocketAddr.sin6_addr.s6_addr32[3] == htonl(0x7F000001)
-              );
+	      IN6_ARE_ADDR_EQUAL( &m_SocketAddr.sin6_addr, &v4_localhost );
 #else
 
     return (htonl(0x7F000001) == m_SocketAddr.sin_addr.s_addr);
@@ -363,11 +353,11 @@
 {
     // IFF the address == 0xff..ff (all ones)
 #if USE_IPV6
-    return     m_SocketAddr.sin6_addr.s6_addr32[0] == 0xFFFFFFFF
-               && m_SocketAddr.sin6_addr.s6_addr32[1] == 0xFFFFFFFF
-               && m_SocketAddr.sin6_addr.s6_addr32[2] == 0xFFFFFFFF
-               && m_SocketAddr.sin6_addr.s6_addr32[3] == 0xFFFFFFFF
-               ;
+    static const struct in6_addr v6_noaddr =
+	{{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+	    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }}};
+
+    return     IN6_ARE_ADDR_EQUAL( &m_SocketAddr.sin6_addr, &v6_noaddr );
 #else
 
     return 0xFFFFFFFF == m_SocketAddr.sin_addr.s_addr;
@@ -440,7 +430,7 @@
     if (show_type == AF_INET && IsIPv4()) {
 #if USE_IPV6
 
-        return GetReverseString4(buf, *(struct in_addr*)&m_SocketAddr.sin6_addr.s6_addr32[3] );
+        return GetReverseString4(buf, *(struct in_addr*)&m_SocketAddr.sin6_addr.s6_addr[12] );
     } else if ( show_type == AF_INET6 && IsIPv6() ) {
         return GetReverseString6(buf, m_SocketAddr.sin6_addr);
 #else
@@ -1157,17 +1147,17 @@
     } else if ( in.s_addr == 0xFFFFFFFF) {
         /* NOADDR */
 
-        out.s6_addr32[0] = 0xFFFFFFFF;
-        out.s6_addr32[1] = 0xFFFFFFFF;
-        out.s6_addr32[2] = 0xFFFFFFFF;
-        out.s6_addr32[3] = 0xFFFFFFFF;
-
+        memset(&out, 255, sizeof(struct in6_addr));
     } else {
         /* general */
 
         memset(&out, 0, sizeof(struct in6_addr));
-        out.s6_addr32[2] = htonl(0xFFFF);
-        out.s6_addr32[3] = in.s_addr;
+        out.s6_addr[10] = 0xFF;
+        out.s6_addr[11] = 0xFF;
+        out.s6_addr[12] = ((uint8_t *)&in.s_addr)[0];
+        out.s6_addr[13] = ((uint8_t *)&in.s_addr)[1];
+        out.s6_addr[14] = ((uint8_t *)&in.s_addr)[2];
+        out.s6_addr[15] = ((uint8_t *)&in.s_addr)[3];
     }
 }
 
@@ -1177,7 +1167,10 @@
     /* general */
 
     memset(&out, 0, sizeof(struct in_addr));
-    out.s_addr = in.s6_addr32[3];
+    ((uint8_t *)&out.s_addr)[0] = in.s6_addr[12];
+    ((uint8_t *)&out.s_addr)[1] = in.s6_addr[13];
+    ((uint8_t *)&out.s_addr)[2] = in.s6_addr[14];
+    ((uint8_t *)&out.s_addr)[3] = in.s6_addr[15];
 }
 
 #endif
