Merge pull request #2619 from directhex/dont_remap_npgsql
[mono.git] / mono / metadata / socket-io.c
index f8d36e36bd2d139e86c876862549351e24f44597..7ddf9d3e4686faa5023da5d0e7bdd947e45d8180 100644 (file)
@@ -99,7 +99,7 @@
 static void
 abort_syscall (gpointer data)
 {
-       mono_thread_info_abort_socket_syscall_for_close ((MonoThreadInfo*) data);
+       mono_thread_info_abort_socket_syscall_for_close ((MonoNativeThreadId) (gsize) data);
 }
 
 static gint32
@@ -648,19 +648,19 @@ ves_icall_System_Net_Sockets_Socket_Socket_internal (MonoObject *this_obj, gint3
        
        *error = 0;
        
-       sock_family=convert_family(family);
+       sock_family = convert_family ((MonoAddressFamily)family);
        if(sock_family==-1) {
                *error = WSAEAFNOSUPPORT;
                return(NULL);
        }
 
-       sock_proto=convert_proto(proto);
+       sock_proto = convert_proto ((MonoProtocolType)proto);
        if(sock_proto==-1) {
                *error = WSAEPROTONOSUPPORT;
                return(NULL);
        }
        
-       sock_type=convert_type(type);
+       sock_type = convert_type ((MonoSocketType)type);
        if(sock_type==-1) {
                *error = WSAESOCKTNOSUPPORT;
                return(NULL);
@@ -690,7 +690,10 @@ ves_icall_System_Net_Sockets_Socket_Close_internal (SOCKET sock, gint32 *error)
        /* Clear any pending work item from this socket if the underlying
         * polling system does not notify when the socket is closed */
        mono_threadpool_ms_io_remove_socket (GPOINTER_TO_INT (sock));
+
+       MONO_PREPARE_BLOCKING;
        closesocket(sock);
+       MONO_FINISH_BLOCKING;
 }
 
 gint32
@@ -746,7 +749,7 @@ ves_icall_System_Net_Sockets_Socket_Accept_internal (SOCKET sock, gint32 *error,
 
        *error = 0;
 
-       mono_thread_info_install_interrupt (abort_syscall, mono_thread_info_current (), &interrupted);
+       mono_thread_info_install_interrupt (abort_syscall, (gpointer) (gsize) mono_native_thread_id_get (), &interrupted);
        if (interrupted) {
                *error = WSAEINTR;
                return NULL;
@@ -821,6 +824,7 @@ is_ipv4_mapped_any (const struct in6_addr *addr)
 static MonoObject*
 create_object_from_sockaddr(struct sockaddr *saddr, int sa_size, gint32 *error)
 {
+       MonoError merror;
        MonoDomain *domain = mono_domain_get ();
        MonoObject *sockaddr_obj;
        MonoArray *data;
@@ -831,7 +835,8 @@ create_object_from_sockaddr(struct sockaddr *saddr, int sa_size, gint32 *error)
                domain->sockaddr_class=mono_class_from_name (get_socket_assembly (), "System.Net", "SocketAddress");
                g_assert (domain->sockaddr_class);
        }
-       sockaddr_obj=mono_object_new(domain, domain->sockaddr_class);
+       sockaddr_obj=mono_object_new_checked(domain, domain->sockaddr_class, &merror);
+       mono_error_raise_exception (&merror); /* FIXME don't raise here */
        
        /* Locate the SocketAddress data buffer in the object */
        if (!domain->sockaddr_data_field) {
@@ -964,12 +969,12 @@ ves_icall_System_Net_Sockets_Socket_LocalEndPoint_internal (SOCKET sock, gint32
        
        *error = 0;
        
-       salen = get_sockaddr_size (convert_family (af));
+       salen = get_sockaddr_size (convert_family ((MonoAddressFamily)af));
        if (salen == 0) {
                *error = WSAEAFNOSUPPORT;
                return NULL;
        }
-       sa = (salen <= 128) ? alloca (salen) : g_malloc0 (salen);
+       sa = (salen <= 128) ? (gchar *)alloca (salen) : (gchar *)g_malloc0 (salen);
 
        MONO_PREPARE_BLOCKING;
 
@@ -1002,12 +1007,12 @@ ves_icall_System_Net_Sockets_Socket_RemoteEndPoint_internal (SOCKET sock, gint32
        
        *error = 0;
        
-       salen = get_sockaddr_size (convert_family (af));
+       salen = get_sockaddr_size (convert_family ((MonoAddressFamily)af));
        if (salen == 0) {
                *error = WSAEAFNOSUPPORT;
                return NULL;
        }
-       sa = (salen <= 128) ? alloca (salen) : g_malloc0 (salen);
+       sa = (salen <= 128) ? (gchar *)alloca (salen) : (gchar *)g_malloc0 (salen);
        /* Note: linux returns just 2 for AF_UNIX. Always. */
 
        MONO_PREPARE_BLOCKING;
@@ -1057,7 +1062,7 @@ create_sockaddr_from_object(MonoObject *saddr_obj, socklen_t *sa_size, gint32 *e
                mono_raise_exception (mono_exception_from_name(mono_get_corlib (), "System", "SystemException"));
        }
        
-       family = convert_family (mono_array_get (data, guint8, 0) + (mono_array_get (data, guint8, 1) << 8));
+       family = convert_family ((MonoAddressFamily)(mono_array_get (data, guint8, 0) + (mono_array_get (data, guint8, 1) << 8)));
        if (family == AF_INET) {
                struct sockaddr_in *sa;
                guint16 port;
@@ -1197,7 +1202,7 @@ ves_icall_System_Net_Sockets_Socket_Poll_internal (SOCKET sock, gint mode,
        start = time (NULL);
 
        do {
-               mono_thread_info_install_interrupt (abort_syscall, mono_thread_info_current (), &interrupted);
+               mono_thread_info_install_interrupt (abort_syscall, (gpointer) (gsize) mono_native_thread_id_get (), &interrupted);
                if (interrupted) {
                        g_free (pfds);
                        *error = WSAEINTR;
@@ -1230,7 +1235,7 @@ ves_icall_System_Net_Sockets_Socket_Poll_internal (SOCKET sock, gint mode,
                }
 
                if (ret == -1 && errno == EINTR) {
-                       if (mono_thread_test_state (thread, ThreadState_AbortRequested | ThreadState_StopRequested)) {
+                       if (mono_thread_test_state (thread, (MonoThreadState)(ThreadState_AbortRequested | ThreadState_StopRequested))) {
                                g_free (pfds);
                                return FALSE;
                        }
@@ -1272,7 +1277,7 @@ ves_icall_System_Net_Sockets_Socket_Connect_internal (SOCKET sock, MonoObject *s
 
        LOGDEBUG (g_message("%s: connecting to %s port %d", __func__, inet_ntoa(((struct sockaddr_in *)sa)->sin_addr), ntohs (((struct sockaddr_in *)sa)->sin_port)));
 
-       mono_thread_info_install_interrupt (abort_syscall, mono_thread_info_current (), &interrupted);
+       mono_thread_info_install_interrupt (abort_syscall, (gpointer) (gsize) mono_native_thread_id_get (), &interrupted);
        if (interrupted) {
                *error = WSAEINTR;
                return;
@@ -1332,8 +1337,8 @@ ves_icall_System_Net_Sockets_Socket_Disconnect_internal (SOCKET sock, MonoBoolea
         * pointers to functions in managed objects that still works
         * on 64bit platforms.
         */
-       ret = WSAIoctl (sock, SIO_GET_EXTENSION_FUNCTION_POINTER, (void *)&disco_guid, sizeof(GUID),
-                       (void *)&_wapi_disconnectex, sizeof(void *), &output_bytes, NULL, NULL);
+       ret = WSAIoctl (sock, SIO_GET_EXTENSION_FUNCTION_POINTER, (gchar *)&disco_guid, sizeof(GUID),
+                       (gchar *)&_wapi_disconnectex, sizeof(void *), &output_bytes, NULL, NULL);
 
        MONO_FINISH_BLOCKING;
 
@@ -1353,8 +1358,8 @@ ves_icall_System_Net_Sockets_Socket_Disconnect_internal (SOCKET sock, MonoBoolea
                 * For an explanation of why this is done, you can read
                 * the article at http://www.codeproject.com/internet/jbsocketserver3.asp
                 */
-               ret = WSAIoctl (sock, SIO_GET_EXTENSION_FUNCTION_POINTER, (void *)&trans_guid, sizeof(GUID),
-                               (void *)&_wapi_transmitfile, sizeof(void *), &output_bytes, NULL, NULL);
+               ret = WSAIoctl (sock, SIO_GET_EXTENSION_FUNCTION_POINTER, (gchar *)&trans_guid, sizeof(GUID),
+                               (gchar *)&_wapi_transmitfile, sizeof(void *), &output_bytes, NULL, NULL);
 
                MONO_FINISH_BLOCKING;
 
@@ -1362,7 +1367,7 @@ ves_icall_System_Net_Sockets_Socket_Disconnect_internal (SOCKET sock, MonoBoolea
                        _wapi_transmitfile = NULL;
        }
 
-       mono_thread_info_install_interrupt (abort_syscall, mono_thread_info_current (), &interrupted);
+       mono_thread_info_install_interrupt (abort_syscall, (gpointer) (gsize) mono_native_thread_id_get (), &interrupted);
        if (interrupted) {
                *error = WSAEINTR;
                return;
@@ -1412,7 +1417,7 @@ ves_icall_System_Net_Sockets_Socket_Receive_internal (SOCKET sock, MonoArray *bu
                return (0);
        }
 
-       mono_thread_info_install_interrupt (abort_syscall, mono_thread_info_current (), &interrupted);
+       mono_thread_info_install_interrupt (abort_syscall, (gpointer) (gsize) mono_native_thread_id_get (), &interrupted);
        if (interrupted)
                return 0;
 
@@ -1464,7 +1469,7 @@ ves_icall_System_Net_Sockets_Socket_Receive_array_internal (SOCKET sock, MonoArr
                return(0);
        }
 
-       mono_thread_info_install_interrupt (abort_syscall, mono_thread_info_current (), &interrupted);
+       mono_thread_info_install_interrupt (abort_syscall, (gpointer) (gsize) mono_native_thread_id_get (), &interrupted);
        if (interrupted) {
                *error = WSAEINTR;
                return 0;
@@ -1521,7 +1526,7 @@ ves_icall_System_Net_Sockets_Socket_ReceiveFrom_internal (SOCKET sock, MonoArray
                return (0);
        }
 
-       mono_thread_info_install_interrupt (abort_syscall, mono_thread_info_current (), &interrupted);
+       mono_thread_info_install_interrupt (abort_syscall, (gpointer) (gsize) mono_native_thread_id_get (), &interrupted);
        if (interrupted) {
                g_free(sa);
                *error = WSAEINTR;
@@ -1589,7 +1594,7 @@ ves_icall_System_Net_Sockets_Socket_Send_internal (SOCKET sock, MonoArray *buffe
                return (0);
        }
 
-       mono_thread_info_install_interrupt (abort_syscall, mono_thread_info_current (), &interrupted);
+       mono_thread_info_install_interrupt (abort_syscall, (gpointer) (gsize) mono_native_thread_id_get (), &interrupted);
        if (interrupted) {
                *error = WSAEINTR;
                return 0;
@@ -1635,7 +1640,7 @@ ves_icall_System_Net_Sockets_Socket_Send_array_internal(SOCKET sock, MonoArray *
                return(0);
        }
 
-       mono_thread_info_install_interrupt (abort_syscall, mono_thread_info_current (), &interrupted);
+       mono_thread_info_install_interrupt (abort_syscall, (gpointer) (gsize) mono_native_thread_id_get (), &interrupted);
        if (interrupted) {
                *error = WSAEINTR;
                return 0;
@@ -1697,7 +1702,7 @@ ves_icall_System_Net_Sockets_Socket_SendTo_internal(SOCKET sock, MonoArray *buff
                return (0);
        }
 
-       mono_thread_info_install_interrupt (abort_syscall, mono_thread_info_current (), &interrupted);
+       mono_thread_info_install_interrupt (abort_syscall, (gpointer) (gsize) mono_native_thread_id_get (), &interrupted);
        if (interrupted) {
                g_free (sa);
                *error = WSAEINTR;
@@ -1744,6 +1749,7 @@ static SOCKET Socket_to_SOCKET(MonoObject *sockobj)
 void
 ves_icall_System_Net_Sockets_Socket_Select_internal (MonoArray **sockets, gint32 timeout, gint32 *error)
 {
+       MonoError monoerror;
        MonoInternalThread *thread = mono_thread_internal_current ();
        MonoObject *obj;
        mono_pollfd *pfds;
@@ -1786,7 +1792,7 @@ ves_icall_System_Net_Sockets_Socket_Select_internal (MonoArray **sockets, gint32
        timeout = (timeout >= 0) ? (timeout / 1000) : -1;
        start = time (NULL);
        do {
-               mono_thread_info_install_interrupt (abort_syscall, mono_thread_info_current (), &interrupted);
+               mono_thread_info_install_interrupt (abort_syscall, (gpointer) (gsize) mono_native_thread_id_get (), &interrupted);
                if (interrupted) {
                        g_free (pfds);
                        *error = WSAEINTR;
@@ -1817,7 +1823,7 @@ ves_icall_System_Net_Sockets_Socket_Select_internal (MonoArray **sockets, gint32
                }
 
                if (ret == -1 && errno == EINTR) {
-                       if (mono_thread_test_state (thread, ThreadState_AbortRequested | ThreadState_StopRequested)) {
+                       if (mono_thread_test_state (thread, (MonoThreadState)(ThreadState_AbortRequested | ThreadState_StopRequested))) {
                                g_free (pfds);
                                *sockets = NULL;
                                return;
@@ -1848,7 +1854,8 @@ ves_icall_System_Net_Sockets_Socket_Select_internal (MonoArray **sockets, gint32
 
        sock_arr_class= ((MonoObject *)*sockets)->vtable->klass;
        socks_size = ((uintptr_t)ret) + 3; /* space for the NULL delimiters */
-       socks = mono_array_new_full (mono_domain_get (), sock_arr_class, &socks_size, NULL);
+       socks = mono_array_new_full_checked (mono_domain_get (), sock_arr_class, &socks_size, NULL, &monoerror);
+       mono_error_raise_exception (&monoerror);
 
        mode = idx = 0;
        for (i = 0; i < count && ret > 0; i++) {
@@ -1905,6 +1912,7 @@ ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal (SOCKET sock, g
 #  endif
        socklen_t credsize = sizeof(cred);
 #endif
+       MonoError merror;
        MonoDomain *domain=mono_domain_get();
        MonoObject *obj;
        MonoClass *obj_class;
@@ -1921,7 +1929,7 @@ ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal (SOCKET sock, g
 #endif
        {
 
-               ret = convert_sockopt_level_and_name (level, name, &system_level, &system_name);
+               ret = convert_sockopt_level_and_name ((MonoSocketOptionLevel)level, (MonoSocketOptionName)name, &system_level, &system_name);
        }
 
        if(ret==-1) {
@@ -1973,15 +1981,16 @@ ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal (SOCKET sock, g
                obj_class=mono_class_from_name(get_socket_assembly (),
                                               "System.Net.Sockets",
                                               "LingerOption");
-               obj=mono_object_new(domain, obj_class);
-               
+               obj=mono_object_new_checked(domain, obj_class, &merror);
+               mono_error_raise_exception (&merror); /* FIXME don't raise here */
+
                /* Locate and set the fields "bool enabled" and "int
-                * seconds"
+                * lingerTime"
                 */
                field=mono_class_get_field_from_name(obj_class, "enabled");
                *(guint8 *)(((char *)obj)+field->offset)=linger.l_onoff;
 
-               field=mono_class_get_field_from_name(obj_class, "seconds");
+               field=mono_class_get_field_from_name(obj_class, "lingerTime");
                *(guint32 *)(((char *)obj)+field->offset)=linger.l_linger;
                
                break;
@@ -2021,7 +2030,8 @@ ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal (SOCKET sock, g
                obj_class = mono_class_from_name(mono_posix_image,
                                                 "Mono.Posix",
                                                 "PeerCredData");
-               obj = mono_object_new(domain, obj_class);
+               obj = mono_object_new_checked(domain, obj_class, &merror);
+               mono_error_raise_exception (&merror); /* FIXME don't raise here */
                cred_data = (MonoPeerCredData *)obj;
                cred_data->pid = cred.pid;
                cred_data->uid = cred.uid;
@@ -2051,7 +2061,7 @@ ves_icall_System_Net_Sockets_Socket_GetSocketOption_arr_internal (SOCKET sock, g
        
        *error = 0;
        
-       ret=convert_sockopt_level_and_name(level, name, &system_level,
+       ret=convert_sockopt_level_and_name((MonoSocketOptionLevel)level, (MonoSocketOptionName)name, &system_level,
                                           &system_name);
        if(ret==-1) {
                *error = WSAENOPROTOOPT;
@@ -2167,7 +2177,7 @@ ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal (SOCKET sock, gint3
        sol_ipv6 = mono_networking_get_ipv6_protocol ();
        sol_ip = mono_networking_get_ip_protocol ();
 
-       ret=convert_sockopt_level_and_name(level, name, &system_level,
+       ret=convert_sockopt_level_and_name((MonoSocketOptionLevel)level, (MonoSocketOptionName)name, &system_level,
                                           &system_name);
 
 #if !defined(SO_EXCLUSIVEADDRUSE) && defined(SO_REUSEADDR)
@@ -2193,12 +2203,12 @@ ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal (SOCKET sock, gint3
                
                switch(name) {
                case SocketOptionName_Linger:
-                       /* Dig out "bool enabled" and "int seconds"
+                       /* Dig out "bool enabled" and "int lingerTime"
                         * fields
                         */
                        field=mono_class_get_field_from_name(obj_val->vtable->klass, "enabled");
                        linger.l_onoff=*(guint8 *)(((char *)obj_val)+field->offset);
-                       field=mono_class_get_field_from_name(obj_val->vtable->klass, "seconds");
+                       field=mono_class_get_field_from_name(obj_val->vtable->klass, "lingerTime");
                        linger.l_linger=*(guint32 *)(((char *)obj_val)+field->offset);
                        
                        valsize=sizeof(linger);
@@ -2217,14 +2227,14 @@ ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal (SOCKET sock, gint3
                                /*
                                 *      Get group address
                                 */
-                               field = mono_class_get_field_from_name (obj_val->vtable->klass, "group");
-                               address = *(gpointer *)(((char *)obj_val) + field->offset);
+                               field = mono_class_get_field_from_name (obj_val->vtable->klass, "m_Group");
+                               address = *(MonoObject **)(((char *)obj_val) + field->offset);
                                
                                if(address) {
                                        mreq6.ipv6mr_multiaddr = ipaddress_to_struct_in6_addr (address);
                                }
 
-                               field=mono_class_get_field_from_name(obj_val->vtable->klass, "ifIndex");
+                               field=mono_class_get_field_from_name(obj_val->vtable->klass, "m_Interface");
                                mreq6.ipv6mr_interface =*(guint64 *)(((char *)obj_val)+field->offset);
                                
 #if defined(__APPLE__) || defined(__FreeBSD__)
@@ -2257,7 +2267,7 @@ ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal (SOCKET sock, gint3
                                 * those :-(
                                 */
                                field = mono_class_get_field_from_name (obj_val->vtable->klass, "group");
-                               address = *(gpointer *)(((char *)obj_val) + field->offset);
+                               address = *(MonoObject **)(((char *)obj_val) + field->offset);
 
                                /* address might not be defined and if so, set the address to ADDR_ANY.
                                 */
@@ -2265,15 +2275,15 @@ ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal (SOCKET sock, gint3
                                        mreq.imr_multiaddr = ipaddress_to_struct_in_addr (address);
                                }
 
-                               field = mono_class_get_field_from_name (obj_val->vtable->klass, "local");
-                               address = *(gpointer *)(((char *)obj_val) + field->offset);
+                               field = mono_class_get_field_from_name (obj_val->vtable->klass, "localAddress");
+                               address = *(MonoObject **)(((char *)obj_val) + field->offset);
 
 #ifdef HAVE_STRUCT_IP_MREQN
                                if(address) {
                                        mreq.imr_address = ipaddress_to_struct_in_addr (address);
                                }
 
-                               field = mono_class_get_field_from_name(obj_val->vtable->klass, "iface_index");
+                               field = mono_class_get_field_from_name(obj_val->vtable->klass, "ifIndex");
                                mreq.imr_ifindex = *(gint32 *)(((char *)obj_val)+field->offset);
 #else
                                if(address) {
@@ -2365,7 +2375,7 @@ ves_icall_System_Net_Sockets_Socket_Shutdown_internal(SOCKET sock, gint32 how, g
 
        *error = 0;
 
-       mono_thread_info_install_interrupt (abort_syscall, mono_thread_info_current (), &interrupted);
+       mono_thread_info_install_interrupt (abort_syscall, (gpointer) (gsize) mono_native_thread_id_get (), &interrupted);
        if (interrupted) {
                *error = WSAEINTR;
                return;
@@ -2692,7 +2702,7 @@ ves_icall_System_Net_Sockets_Socket_SendFile_internal (SOCKET sock, MonoString *
                buffers.TailLength = mono_array_length (post_buffer);
        }
 
-       mono_thread_info_install_interrupt (abort_syscall, mono_thread_info_current (), &interrupted);
+       mono_thread_info_install_interrupt (abort_syscall, (gpointer) (gsize) mono_native_thread_id_get (), &interrupted);
        if (interrupted) {
                CloseHandle (file);
                SetLastError (WSAEINTR);
@@ -2748,15 +2758,11 @@ void
 icall_cancel_blocking_socket_operation (MonoThread *thread)
 {
        MonoInternalThread *internal;
-       MonoThreadInfo *info;
 
        internal = thread->internal_thread;
        g_assert (internal);
 
-       info = mono_thread_info_lookup (MONO_UINT_TO_NATIVE_THREAD_ID (internal->tid));
-       g_assert (info);
-
-       mono_thread_info_abort_socket_syscall_for_close (info);
+       mono_thread_info_abort_socket_syscall_for_close (MONO_UINT_TO_NATIVE_THREAD_ID (internal->tid));
 }
 
 #endif /* #ifndef DISABLE_SOCKETS */