Move <sys/types.h> higher for integer types (#4884)
[mono.git] / mono / metadata / w32socket.c
index 5312790ad644b21b43d518ab238c73ab15ea2458..0ce2b04e6258bdf10bcb66305f9285306ea4b134 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)
@@ -889,7 +918,9 @@ 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;
-       } else if (saddr->sa_family == AF_INET6) {
+       }
+#ifdef HAVE_STRUCT_SOCKADDR_IN6
+       else if (saddr->sa_family == AF_INET6) {
                struct sockaddr_in6 *sa_in = (struct sockaddr_in6 *)saddr;
                int i;
                int buffer_size = 28;
@@ -928,6 +959,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 +988,12 @@ get_sockaddr_size (int family)
        size = 0;
        if (family == AF_INET) {
                size = sizeof (struct sockaddr_in);
-       } else if (family == AF_INET6) {
+       }
+#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);
@@ -1114,7 +1149,9 @@ create_sockaddr_from_object (MonoObject *saddr_obj, socklen_t *sa_size, gint32 *
 
                *sa_size = sizeof (struct sockaddr_in);
                return (struct sockaddr *)sa;
-       } else if (family == AF_INET6) {
+       }
+#ifdef HAVE_STRUCT_SOCKADDR_IN6
+       else if (family == AF_INET6) {
                struct sockaddr_in6 *sa;
                int i;
                guint16 port;
@@ -1143,6 +1180,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 +1308,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 +1815,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 +2011,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 +2100,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 +2127,7 @@ ipaddress_to_struct_in6_addr (MonoObject *ipaddr)
        return in6addr;
 }
 #endif
+#endif
 
 #if defined(__APPLE__) || defined(__FreeBSD__)
 
@@ -2180,7 +2220,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 +2253,11 @@ 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) {
+
+                               break; // Don't check sol_ip
+                       }
+#endif
+                       if (system_level == sol_ip) {
 #ifdef HAVE_STRUCT_IP_MREQN
                                struct ip_mreqn mreq = {{0}};
 #else
@@ -2427,13 +2471,15 @@ addrinfo_to_IPHostEntry (MonoAddressInfo *info, MonoString **h_name, MonoArray *
                                        MonoAddress maddr;
                                        mono_address_init (&maddr, AF_INET, &local_in [i]);
                                        if (mono_networking_addr_to_str (&maddr, addr, sizeof (addr))) {
-                                               addr_string = mono_string_new (domain, addr);
+                                               addr_string = mono_string_new_checked (domain, addr, error);
+                                               if (!is_ok (error))
+                                                       goto leave;
                                                mono_array_setref (*h_addr_list, addr_index, addr_string);
                                                addr_index++;
                                        }
                                }
                        }
-
+#ifdef HAVE_STRUCT_SOCKADDR_IN6
                        if (nlocal_in6) {
                                MonoString *addr_string;
                                int i;
@@ -2442,13 +2488,15 @@ addrinfo_to_IPHostEntry (MonoAddressInfo *info, MonoString **h_name, MonoArray *
                                        MonoAddress maddr;
                                        mono_address_init (&maddr, AF_INET6, &local_in6 [i]);
                                        if (mono_networking_addr_to_str (&maddr, addr, sizeof (addr))) {
-                                               addr_string = mono_string_new (domain, addr);
+                                               addr_string = mono_string_new_checked (domain, addr, error);
+                                               if (!is_ok (error))
+                                                       goto leave;
                                                mono_array_setref (*h_addr_list, addr_index, addr_string);
                                                addr_index++;
                                        }
                                }
                        }
-
+#endif
                leave:
                        g_free (local_in);
                        g_free (local_in6);
@@ -2481,19 +2529,23 @@ addrinfo_to_IPHostEntry (MonoAddressInfo *info, MonoString **h_name, MonoArray *
 
                mono_address_init (&maddr, ai->family, &ai->address);
                if (mono_networking_addr_to_str (&maddr, buffer, sizeof (buffer)))
-                       addr_string = mono_string_new (domain, buffer);
+                       addr_string = mono_string_new_checked (domain, buffer, error);
                else
-                       addr_string = mono_string_new (domain, "");
+                       addr_string = mono_string_new_checked (domain, "", error);
+               if (!is_ok (error))
+                       goto leave2;
 
                mono_array_setref (*h_addr_list, addr_index, addr_string);
 
                if (!i) {
                        i++;
                        if (ai->canonical_name != NULL) {
-                               *h_name = mono_string_new (domain, ai->canonical_name);
+                               *h_name = mono_string_new_checked (domain, ai->canonical_name, error);
                        } else {
-                               *h_name = mono_string_new (domain, buffer);
+                               *h_name = mono_string_new_checked (domain, buffer, error);
                        }
+                       if (!is_ok (error))
+                               goto leave2;
                }
 
                addr_index++;
@@ -2556,7 +2608,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,10 +2624,14 @@ 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;
-       } else if (inet_pton (AF_INET6, address, &saddr6.sin6_addr) == 1) {
+       }
+#ifdef HAVE_STRUCT_SOCKADDR_IN6
+       else if (inet_pton (AF_INET6, address, &saddr6.sin6_addr) == 1) {
                family = AF_INET6;
                saddr6.sin6_family = AF_INET6;
-       } else {
+       }
+#endif
+       else {
                g_free (address);
                return FALSE;
        }
@@ -2590,6 +2648,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 +2656,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 ();
        }
@@ -2617,6 +2677,7 @@ ves_icall_System_Net_Dns_GetHostByAddr_internal (MonoString *addr, MonoString **
 MonoBoolean
 ves_icall_System_Net_Dns_GetHostName_internal (MonoString **h_name)
 {
+       MonoError error;
        gchar hostname [NI_MAXHOST] = { 0 };
        int ret;
 
@@ -2624,7 +2685,8 @@ ves_icall_System_Net_Dns_GetHostName_internal (MonoString **h_name)
        if (ret == -1)
                return FALSE;
 
-       *h_name = mono_string_new (mono_domain_get (), hostname);
+       *h_name = mono_string_new_checked (mono_domain_get (), hostname, &error);
+       mono_error_set_pending_exception (&error);
 
        return TRUE;
 }