Add autoconf checks for platforms without IPv6
authorJosh Peterson <petersonjm1@gmail.com>
Wed, 19 Apr 2017 15:11:21 +0000 (11:11 -0400)
committerJosh Peterson <petersonjm1@gmail.com>
Wed, 19 Apr 2017 15:24:39 +0000 (11:24 -0400)
* There is an existing check for the `sockaddr_in6` struct.
* Use it to wrap code that implements IPv6.
* This makes porting to platforms that don't support IPv6 easier.
* It should have no impact on platforms that do support IPv6.

mono/metadata/w32socket.c

index 90ee4869efeb90136f3b552f0ff7602624153051..3f47bdf7c6a520040ee929c0821451138ce368e6 100644 (file)
@@ -206,7 +206,11 @@ convert_family (MonoAddressFamily mono_family)
        case AddressFamily_AppleTalk:
                return AF_APPLETALK;
        case AddressFamily_InterNetworkV6:
+#ifdef HAVE_STRUCT_SOCKADDR_IN6
                return AF_INET6;
+#else
+               return -1;
+#endif
        case AddressFamily_DecNet:
 #ifdef AF_DECnet
                return AF_DECnet;
@@ -261,7 +265,9 @@ convert_to_mono_family (guint16 af_family)
 #endif
        case AF_APPLETALK:
                return AddressFamily_AppleTalk;
+#ifdef HAVE_STRUCT_SOCKADDR_IN6
        case AF_INET6:
+#endif
                return AddressFamily_InterNetworkV6;
 #ifdef AF_IRDA
        case AF_IRDA:
@@ -799,6 +805,7 @@ ves_icall_System_Net_Sockets_Socket_Listen_internal(gsize sock, guint32 backlog,
                *werror = mono_w32socket_get_last_error ();
 }
 
+#ifdef HAVE_STRUCT_SOCKADDR_IN6
 // Check whether it's ::ffff::0:0.
 static gboolean
 is_ipv4_mapped_any (const struct in6_addr *addr)
@@ -817,6 +824,7 @@ is_ipv4_mapped_any (const struct in6_addr *addr)
        }
        return TRUE;
 }
+#endif
 
 static MonoObject*
 create_object_from_sockaddr (struct sockaddr *saddr, int sa_size, gint32 *werror, MonoError *error)
@@ -890,6 +898,7 @@ create_object_from_sockaddr (struct sockaddr *saddr, int sa_size, gint32 *werror
                mono_field_set_value (sockaddr_obj, domain->sockaddr_data_length_field, &buffer_size);
 
                return sockaddr_obj;
+#ifdef HAVE_STRUCT_SOCKADDR_IN6
        } else if (saddr->sa_family == AF_INET6) {
                struct sockaddr_in6 *sa_in = (struct sockaddr_in6 *)saddr;
                int i;
@@ -929,6 +938,7 @@ create_object_from_sockaddr (struct sockaddr *saddr, int sa_size, gint32 *werror
 
                return sockaddr_obj;
        }
+#endif
 #ifdef HAVE_SYS_UN_H
        else if (saddr->sa_family == AF_UNIX) {
                int i;
@@ -957,9 +967,11 @@ get_sockaddr_size (int family)
        size = 0;
        if (family == AF_INET) {
                size = sizeof (struct sockaddr_in);
+#ifdef HAVE_STRUCT_SOCKADDR_IN6
        } else if (family == AF_INET6) {
                size = sizeof (struct sockaddr_in6);
        }
+#endif
 #ifdef HAVE_SYS_UN_H
        else if (family == AF_UNIX) {
                size = sizeof (struct sockaddr_un);
@@ -1115,6 +1127,7 @@ create_sockaddr_from_object (MonoObject *saddr_obj, socklen_t *sa_size, gint32 *
 
                *sa_size = sizeof (struct sockaddr_in);
                return (struct sockaddr *)sa;
+#ifdef HAVE_STRUCT_SOCKADDR_IN6
        } else if (family == AF_INET6) {
                struct sockaddr_in6 *sa;
                int i;
@@ -1144,6 +1157,7 @@ create_sockaddr_from_object (MonoObject *saddr_obj, socklen_t *sa_size, gint32 *
                *sa_size = sizeof (struct sockaddr_in6);
                return (struct sockaddr *)sa;
        }
+#endif
 #ifdef HAVE_SYS_UN_H
        else if (family == AF_UNIX) {
                struct sockaddr_un *sock_un;
@@ -2063,6 +2077,7 @@ ipaddress_to_struct_in_addr (MonoObject *ipaddr)
        return inaddr;
 }
 
+#ifdef HAVE_STRUCT_SOCKADDR_IN6
 static struct in6_addr
 ipaddress_to_struct_in6_addr (MonoObject *ipaddr)
 {
@@ -2089,6 +2104,7 @@ ipaddress_to_struct_in6_addr (MonoObject *ipaddr)
        return in6addr;
 }
 #endif
+#endif
 
 #if defined(__APPLE__) || defined(__FreeBSD__)
 
@@ -2181,7 +2197,7 @@ ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal (gsize sock, gint32
 #if defined(HAVE_STRUCT_IP_MREQN) || defined(HAVE_STRUCT_IP_MREQ)
                {
                        MonoObject *address = NULL;
-
+#ifdef HAVE_STRUCT_SOCKADDR_IN6
                        if (system_level == sol_ipv6) {
                                struct ipv6_mreq mreq6;
 
@@ -2214,7 +2230,10 @@ ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal (gsize sock, gint32
 #endif
                                        
                                ret = mono_w32socket_setsockopt (sock, system_level, system_name, &mreq6, sizeof (mreq6));
-                       } else if (system_level == sol_ip) {
+                       
+                       } else
+#endif
+                       if (system_level == sol_ip) {
 #ifdef HAVE_STRUCT_IP_MREQN
                                struct ip_mreqn mreq = {{0}};
 #else
@@ -2434,7 +2453,7 @@ addrinfo_to_IPHostEntry (MonoAddressInfo *info, MonoString **h_name, MonoArray *
                                        }
                                }
                        }
-
+#ifdef HAVE_STRUCT_SOCKADDR_IN6
                        if (nlocal_in6) {
                                MonoString *addr_string;
                                int i;
@@ -2449,7 +2468,7 @@ addrinfo_to_IPHostEntry (MonoAddressInfo *info, MonoString **h_name, MonoArray *
                                        }
                                }
                        }
-
+#endif
                leave:
                        g_free (local_in);
                        g_free (local_in6);
@@ -2557,7 +2576,9 @@ ves_icall_System_Net_Dns_GetHostByAddr_internal (MonoString *addr, MonoString **
 {
        char *address;
        struct sockaddr_in saddr;
+#ifdef HAVE_STRUCT_SOCKADDR_IN6
        struct sockaddr_in6 saddr6;
+#endif
        MonoAddressInfo *info = NULL;
        MonoError error;
        gint32 family;
@@ -2571,9 +2592,11 @@ ves_icall_System_Net_Dns_GetHostByAddr_internal (MonoString *addr, MonoString **
        if (inet_pton (AF_INET, address, &saddr.sin_addr ) == 1) {
                family = AF_INET;
                saddr.sin_family = AF_INET;
+#ifdef HAVE_STRUCT_SOCKADDR_IN6
        } else if (inet_pton (AF_INET6, address, &saddr6.sin6_addr) == 1) {
                family = AF_INET6;
                saddr6.sin6_family = AF_INET6;
+#endif
        } else {
                g_free (address);
                return FALSE;
@@ -2591,6 +2614,7 @@ ves_icall_System_Net_Dns_GetHostByAddr_internal (MonoString *addr, MonoString **
                ret = getnameinfo ((struct sockaddr*)&saddr, sizeof (saddr), hostname, sizeof (hostname), NULL, 0, 0) == 0;
                break;
        }
+#ifdef HAVE_STRUCT_SOCKADDR_IN6
        case AF_INET6: {
 #if HAVE_SOCKADDR_IN6_SIN_LEN
                saddr6.sin6_len = sizeof (saddr6);
@@ -2598,6 +2622,7 @@ ves_icall_System_Net_Dns_GetHostByAddr_internal (MonoString *addr, MonoString **
                ret = getnameinfo ((struct sockaddr*)&saddr6, sizeof (saddr6), hostname, sizeof (hostname), NULL, 0, 0) == 0;
                break;
        }
+#endif
        default:
                g_assert_not_reached ();
        }