Merge branch 'master' into config-checks-ipv6
[mono.git] / mono / metadata / w32socket.c
index e39863e0dd11278239be184d80e208f6c9acb23e..4775c4dfe805c4d1eaf65a668f83a017e717579b 100644 (file)
@@ -1,5 +1,6 @@
-/*
- * socket-io.c: Socket IO internal calls
+/**
+ * \file
+ * Socket IO internal calls
  *
  * Authors:
  *     Dick Porter (dick@ximian.com)
@@ -47,7 +48,7 @@
 
 #include <mono/metadata/object.h>
 #include <mono/metadata/exception.h>
-#include <mono/metadata/assembly.h>
+#include <mono/metadata/assembly-internals.h>
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/w32file.h>
 #include <mono/metadata/threads.h>
@@ -203,9 +204,17 @@ convert_family (MonoAddressFamily mono_family)
        case AddressFamily_InterNetwork:
                return AF_INET;
        case AddressFamily_AppleTalk:
+#ifdef AF_APPLETALK
                return AF_APPLETALK;
+#else
+               return -1;
+#endif
        case AddressFamily_InterNetworkV6:
+#ifdef HAVE_STRUCT_SOCKADDR_IN6
                return AF_INET6;
+#else
+               return -1;
+#endif
        case AddressFamily_DecNet:
 #ifdef AF_DECnet
                return AF_DECnet;
@@ -258,10 +267,14 @@ convert_to_mono_family (guint16 af_family)
        case AF_DECnet:
                return AddressFamily_DecNet;
 #endif
+#ifdef AF_APPLETALK
        case AF_APPLETALK:
                return AddressFamily_AppleTalk;
+#endif
+#ifdef HAVE_STRUCT_SOCKADDR_IN6
        case AF_INET6:
                return AddressFamily_InterNetworkV6;
+#endif
 #ifdef AF_IRDA
        case AF_IRDA:
                return AddressFamily_Irda;
@@ -289,7 +302,11 @@ convert_type (MonoSocketType mono_type)
                return -1;
 #endif
        case SocketType_Seqpacket:
+#ifdef SOCK_SEQPACKET
                return SOCK_SEQPACKET;
+#else
+               return -1;
+#endif
        case SocketType_Unknown:
                g_warning ("System.Net.Sockets.SocketType has unsupported value 0x%x", mono_type);
                return -1;
@@ -343,8 +360,10 @@ convert_socketflags (gint32 sflags)
                /* Contains invalid flag values */
                return -1;
 
+#ifdef MSG_OOB
        if (sflags & SocketFlags_OutOfBand)
                flags |= MSG_OOB;
+#endif
        if (sflags & SocketFlags_Peek)
                flags |= MSG_PEEK;
        if (sflags & SocketFlags_DontRoute)
@@ -388,9 +407,11 @@ convert_sockopt_level_and_name (MonoSocketOptionLevel mono_level, MonoSocketOpti
                         */
                        *system_name = SO_LINGER;
                        break;
+#ifdef SO_DEBUG
                case SocketOptionName_Debug:
                        *system_name = SO_DEBUG;
                        break;
+#endif
 #ifdef SO_ACCEPTCONN
                case SocketOptionName_AcceptConnection:
                        *system_name = SO_ACCEPTCONN;
@@ -402,18 +423,22 @@ convert_sockopt_level_and_name (MonoSocketOptionLevel mono_level, MonoSocketOpti
                case SocketOptionName_KeepAlive:
                        *system_name = SO_KEEPALIVE;
                        break;
+#ifdef SO_DONTROUTE
                case SocketOptionName_DontRoute:
                        *system_name = SO_DONTROUTE;
                        break;
+#endif
                case SocketOptionName_Broadcast:
                        *system_name = SO_BROADCAST;
                        break;
                case SocketOptionName_Linger:
                        *system_name = SO_LINGER;
                        break;
+#ifdef SO_OOBINLINE
                case SocketOptionName_OutOfBandInline:
                        *system_name = SO_OOBINLINE;
                        break;
+#endif
                case SocketOptionName_SendBuffer:
                        *system_name = SO_SNDBUF;
                        break;
@@ -471,9 +496,11 @@ convert_sockopt_level_and_name (MonoSocketOptionLevel mono_level, MonoSocketOpti
                *system_level = mono_networking_get_ip_protocol ();
                
                switch (mono_name) {
+#ifdef IP_OPTIONS
                case SocketOptionName_IPOptions:
                        *system_name = IP_OPTIONS;
                        break;
+#endif
 #ifdef IP_HDRINCL
                case SocketOptionName_HeaderIncluded:
                        *system_name = IP_HDRINCL;
@@ -641,7 +668,7 @@ get_socket_assembly (void)
 
                socket_assembly = mono_image_loaded ("System");
                if (!socket_assembly) {
-                       MonoAssembly *sa = mono_assembly_open ("System.dll", NULL);
+                       MonoAssembly *sa = mono_assembly_open_predicate ("System.dll", FALSE, FALSE, NULL, NULL, NULL);
                
                        if (!sa) {
                                g_assert_not_reached ();
@@ -798,6 +825,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)
@@ -816,6 +844,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)
@@ -825,7 +854,7 @@ create_object_from_sockaddr (struct sockaddr *saddr, int sa_size, gint32 *werror
        MonoArray *data;
        MonoAddressFamily family;
 
-       mono_error_init (error);
+       error_init (error);
 
        /* Build a System.Net.SocketAddress object instance */
        if (!domain->sockaddr_class)
@@ -889,6 +918,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;
@@ -928,6 +958,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;
@@ -956,9 +987,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);
@@ -1058,7 +1091,7 @@ create_sockaddr_from_object (MonoObject *saddr_obj, socklen_t *sa_size, gint32 *
        gint32 family;
        int len;
 
-       mono_error_init (error);
+       error_init (error);
 
        if (!domain->sockaddr_class)
                domain->sockaddr_class = mono_class_load_from_name (get_socket_assembly (), "System.Net", "SocketAddress");
@@ -1114,6 +1147,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;
@@ -1143,6 +1177,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;
@@ -1270,7 +1305,7 @@ ves_icall_System_Net_Sockets_Socket_Poll_internal (gsize sock, gint mode,
                }
 
                if (ret == -1 && errno == EINTR) {
-                       if (mono_thread_test_state (thread, (MonoThreadState)(ThreadState_AbortRequested | ThreadState_StopRequested))) {
+                       if (mono_thread_test_state (thread, ThreadState_AbortRequested)) {
                                g_free (pfds);
                                return FALSE;
                        }
@@ -1777,7 +1812,7 @@ ves_icall_System_Net_Sockets_Socket_Select_internal (MonoArray **sockets, gint32
                }
 
                if (ret == -1 && errno == EINTR) {
-                       if (mono_thread_test_state (thread, (MonoThreadState)(ThreadState_AbortRequested | ThreadState_StopRequested))) {
+                       if (mono_thread_test_state (thread, ThreadState_AbortRequested)) {
                                g_free (pfds);
                                *sockets = NULL;
                                return;
@@ -1973,7 +2008,7 @@ ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal (gsize sock, gi
                if (mono_posix_image == NULL) {
                        mono_posix_image = mono_image_loaded ("Mono.Posix");
                        if (!mono_posix_image) {
-                               MonoAssembly *sa = mono_assembly_open ("Mono.Posix.dll", NULL);
+                               MonoAssembly *sa = mono_assembly_open_predicate ("Mono.Posix.dll", FALSE, FALSE, NULL, NULL, NULL);
                                if (!sa) {
                                        *werror = WSAENOPROTOOPT;
                                        return;
@@ -2062,6 +2097,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)
 {
@@ -2088,6 +2124,7 @@ ipaddress_to_struct_in6_addr (MonoObject *ipaddr)
        return in6addr;
 }
 #endif
+#endif
 
 #if defined(__APPLE__) || defined(__FreeBSD__)
 
@@ -2180,7 +2217,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;
 
@@ -2213,7 +2250,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
@@ -2406,7 +2446,7 @@ addrinfo_to_IPHostEntry (MonoAddressInfo *info, MonoString **h_name, MonoArray *
        int addr_index;
        MonoDomain *domain = mono_domain_get ();
 
-       mono_error_init (error);
+       error_init (error);
        addr_index = 0;
        *h_aliases = mono_array_new_checked (domain, mono_get_string_class (), 0, error);
        return_val_if_nok (error, FALSE);
@@ -2433,7 +2473,7 @@ addrinfo_to_IPHostEntry (MonoAddressInfo *info, MonoString **h_name, MonoArray *
                                        }
                                }
                        }
-
+#ifdef HAVE_STRUCT_SOCKADDR_IN6
                        if (nlocal_in6) {
                                MonoString *addr_string;
                                int i;
@@ -2448,7 +2488,7 @@ addrinfo_to_IPHostEntry (MonoAddressInfo *info, MonoString **h_name, MonoArray *
                                        }
                                }
                        }
-
+#endif
                leave:
                        g_free (local_in);
                        g_free (local_in6);
@@ -2556,7 +2596,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;
@@ -2570,9 +2612,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;
@@ -2590,6 +2634,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);
@@ -2597,6 +2642,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 ();
        }
@@ -2682,12 +2728,8 @@ ves_icall_System_Net_Sockets_Socket_SendFile_internal (gsize sock, MonoString *f
                return FALSE;
        }
 
-       MONO_ENTER_GC_SAFE;
-
        mono_w32file_close (file);
 
-       MONO_EXIT_GC_SAFE;
-
        if (*werror)
                return FALSE;