X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fw32socket.c;h=9c0053455829860be455830da6f617c57ffb73c4;hb=537a24f852eed5bb612e5713497970d5836962fc;hp=bd802a67bb1c2c1f7c07a14c70e3b1e9f8a8c468;hpb=23058b943f6275767388767559086870e2fa98d7;p=mono.git diff --git a/mono/metadata/w32socket.c b/mono/metadata/w32socket.c index bd802a67bb1..9c005345582 100644 --- a/mono/metadata/w32socket.c +++ b/mono/metadata/w32socket.c @@ -116,61 +116,101 @@ create_sockaddr_from_handle (MonoObjectHandle saddr_obj, socklen_t *sa_size, gin static SOCKET mono_w32socket_socket (int domain, int type, int protocol) { - return WSASocket (domain, type, protocol, NULL, 0, WSA_FLAG_OVERLAPPED); + SOCKET ret; + MONO_ENTER_GC_SAFE; + ret = WSASocket (domain, type, protocol, NULL, 0, WSA_FLAG_OVERLAPPED); + MONO_EXIT_GC_SAFE; + return ret; } static gint mono_w32socket_bind (SOCKET sock, struct sockaddr *addr, socklen_t addrlen) { - return bind (sock, addr, addrlen); + gint ret; + MONO_ENTER_GC_SAFE; + ret = bind (sock, addr, addrlen); + MONO_EXIT_GC_SAFE; + return ret; } static gint mono_w32socket_getpeername (SOCKET sock, struct sockaddr *name, socklen_t *namelen) { - return getpeername (sock, name, namelen); + gint ret; + MONO_ENTER_GC_SAFE; + ret = getpeername (sock, name, namelen); + MONO_EXIT_GC_SAFE; + return ret; } static gint mono_w32socket_getsockname (SOCKET sock, struct sockaddr *name, socklen_t *namelen) { - return getsockname (sock, name, namelen); + gint ret; + MONO_ENTER_GC_SAFE; + ret = getsockname (sock, name, namelen); + MONO_EXIT_GC_SAFE; + return ret; } static gint mono_w32socket_getsockopt (SOCKET sock, gint level, gint optname, gpointer optval, socklen_t *optlen) { - return getsockopt (sock, level, optname, optval, optlen); + gint ret; + MONO_ENTER_GC_SAFE; + ret = getsockopt (sock, level, optname, optval, optlen); + MONO_EXIT_GC_SAFE; + return ret; } static gint mono_w32socket_setsockopt (SOCKET sock, gint level, gint optname, const gpointer optval, socklen_t optlen) { - return setsockopt (sock, level, optname, optval, optlen); + gint ret; + MONO_ENTER_GC_SAFE; + ret = setsockopt (sock, level, optname, optval, optlen); + MONO_EXIT_GC_SAFE; + return ret; } static gint mono_w32socket_listen (SOCKET sock, gint backlog) { - return listen (sock, backlog); + gint ret; + MONO_ENTER_GC_SAFE; + ret = listen (sock, backlog); + MONO_EXIT_GC_SAFE; + return ret; } static gint mono_w32socket_shutdown (SOCKET sock, gint how) { - return shutdown (sock, how); + gint ret; + MONO_ENTER_GC_SAFE; + ret = shutdown (sock, how); + MONO_EXIT_GC_SAFE; + return ret; } static gint mono_w32socket_ioctl (SOCKET sock, gint32 command, gchar *input, gint inputlen, gchar *output, gint outputlen, glong *written) { - return WSAIoctl (sock, command, input, inputlen, output, outputlen, written, NULL, NULL); + gint ret; + MONO_ENTER_GC_SAFE; + ret = WSAIoctl (sock, command, input, inputlen, output, outputlen, written, NULL, NULL); + MONO_EXIT_GC_SAFE; + return ret; } static gboolean mono_w32socket_close (SOCKET sock) { - return CloseHandle (sock); + gboolean ret; + MONO_ENTER_GC_SAFE; + ret = CloseHandle (sock); + MONO_EXIT_GC_SAFE; + return ret; } #endif /* HOST_WIN32 */ @@ -745,9 +785,7 @@ ves_icall_System_Net_Sockets_Socket_Close_internal (gsize sock, gint32 *werror, * polling system does not notify when the socket is closed */ mono_threadpool_io_remove_socket (GPOINTER_TO_INT (sock)); - MONO_ENTER_GC_SAFE; mono_w32socket_close ((SOCKET) sock); - MONO_EXIT_GC_SAFE; } gint32 @@ -805,10 +843,7 @@ ves_icall_System_Net_Sockets_Socket_Accept_internal (gsize sock, gint32 *werror, return NULL; } - MONO_ENTER_GC_SAFE; newsock = mono_w32socket_accept (sock, NULL, 0, blocking); - MONO_EXIT_GC_SAFE; - if (newsock == INVALID_SOCKET) *werror = mono_w32socket_get_last_error (); @@ -830,12 +865,7 @@ ves_icall_System_Net_Sockets_Socket_Listen_internal(gsize sock, guint32 backlog, error_init (error); *werror = 0; - MONO_ENTER_GC_SAFE; - ret = mono_w32socket_listen (sock, backlog); - - MONO_EXIT_GC_SAFE; - if (ret == SOCKET_ERROR) *werror = mono_w32socket_get_last_error (); } @@ -1031,12 +1061,7 @@ ves_icall_System_Net_Sockets_Socket_LocalEndPoint_internal (gsize sock, gint32 a } sa = (salen <= 128) ? (gchar *)alloca (salen) : (gchar *)g_malloc0 (salen); - MONO_ENTER_GC_SAFE; - ret = mono_w32socket_getsockname (sock, (struct sockaddr *)sa, &salen); - - MONO_EXIT_GC_SAFE; - if (ret == SOCKET_ERROR) { *werror = mono_w32socket_get_last_error (); if (salen > 128) @@ -1070,12 +1095,7 @@ ves_icall_System_Net_Sockets_Socket_RemoteEndPoint_internal (gsize sock, gint32 sa = (salen <= 128) ? (gchar *)alloca (salen) : (gchar *)g_malloc0 (salen); /* Note: linux returns just 2 for AF_UNIX. Always. */ - MONO_ENTER_GC_SAFE; - ret = mono_w32socket_getpeername (sock, (struct sockaddr *)sa, &salen); - - MONO_EXIT_GC_SAFE; - if (ret == SOCKET_ERROR) { *werror = mono_w32socket_get_last_error (); if (salen > 128) @@ -1358,10 +1378,7 @@ ves_icall_System_Net_Sockets_Socket_Connect_internal (gsize sock, MonoObjectHand return; } - MONO_ENTER_GC_SAFE; ret = mono_w32socket_connect (sock, sa, sa_size, blocking); - MONO_EXIT_GC_SAFE; - if (ret == SOCKET_ERROR) *werror = mono_w32socket_get_last_error (); @@ -1389,9 +1406,7 @@ ves_icall_System_Net_Sockets_Socket_Disconnect_internal (gsize sock, MonoBoolean return; } - MONO_ENTER_GC_SAFE; *werror = mono_w32socket_disconnect (sock, reuse); - MONO_EXIT_GC_SAFE; mono_thread_info_uninstall_interrupt (&interrupted); if (interrupted) @@ -1399,6 +1414,20 @@ ves_icall_System_Net_Sockets_Socket_Disconnect_internal (gsize sock, MonoBoolean } #endif /* G_HAVE_API_SUPPORT(HAVE_CLASSIC_WINAPI_SUPPORT | HAVE_UWP_WINAPI_SUPPORT) */ +MonoBoolean +ves_icall_System_Net_Sockets_Socket_Duplicate_internal (gpointer handle, gint32 targetProcessId, gpointer *duplicate_handle, gint32 *werror, MonoError *error) +{ + error_init (error); + + *werror = 0; + if (!mono_w32socket_duplicate (handle, targetProcessId, duplicate_handle)) { + *werror = mono_w32error_get_last (); + return FALSE; + } + + return TRUE; +} + gint32 ves_icall_System_Net_Sockets_Socket_Receive_internal (gsize sock, MonoArrayHandle buffer, gint32 offset, gint32 count, gint32 flags, gint32 *werror, gboolean blocking, MonoError *error) { @@ -1428,9 +1457,7 @@ ves_icall_System_Net_Sockets_Socket_Receive_internal (gsize sock, MonoArrayHandl uint32_t gchandle; gchar *buf = MONO_ARRAY_HANDLE_PIN (buffer, gchar, offset, &gchandle); - MONO_ENTER_GC_SAFE; ret = mono_w32socket_recv (sock, buf, count, recvflags, blocking); - MONO_EXIT_GC_SAFE; mono_gchandle_free (gchandle); @@ -1475,9 +1502,7 @@ ves_icall_System_Net_Sockets_Socket_Receive_array_internal (gsize sock, MonoArra uint32_t gchandle; WSABUF *wsabufs = MONO_ARRAY_HANDLE_PIN (buffers, WSABUF, 0, &gchandle); - MONO_ENTER_GC_SAFE; ret = mono_w32socket_recvbuffers (sock, wsabufs, count, &recv, &recvflags, NULL, NULL, blocking); - MONO_EXIT_GC_SAFE; mono_gchandle_free (gchandle); @@ -1534,9 +1559,7 @@ ves_icall_System_Net_Sockets_Socket_ReceiveFrom_internal (gsize sock, MonoArrayH uint32_t gchandle; buf = MONO_ARRAY_HANDLE_PIN (buffer, gchar, offset, &gchandle); - MONO_ENTER_GC_SAFE; ret = mono_w32socket_recvfrom (sock, buf, count, recvflags, sa, &sa_size, blocking); - MONO_EXIT_GC_SAFE; mono_gchandle_free (gchandle); @@ -1606,9 +1629,7 @@ ves_icall_System_Net_Sockets_Socket_Send_internal (gsize sock, MonoArrayHandle b uint32_t gchandle; gchar *buf = MONO_ARRAY_HANDLE_PIN (buffer, gchar, offset, &gchandle); - MONO_ENTER_GC_SAFE; ret = mono_w32socket_send (sock, buf, count, sendflags, blocking); - MONO_EXIT_GC_SAFE; mono_gchandle_free (gchandle); @@ -1653,9 +1674,7 @@ ves_icall_System_Net_Sockets_Socket_Send_array_internal (gsize sock, MonoArrayHa uint32_t gchandle; WSABUF *wsabufs = MONO_ARRAY_HANDLE_PIN (buffers, WSABUF, 0, &gchandle); - MONO_ENTER_GC_SAFE; ret = mono_w32socket_sendbuffers (sock, wsabufs, count, &sent, sendflags, NULL, NULL, blocking); - MONO_EXIT_GC_SAFE; mono_gchandle_free (gchandle); @@ -1715,9 +1734,7 @@ ves_icall_System_Net_Sockets_Socket_SendTo_internal (gsize sock, MonoArrayHandle uint32_t gchandle; gchar *buf = MONO_ARRAY_HANDLE_PIN (buffer, gchar, offset, &gchandle); - MONO_ENTER_GC_SAFE; ret = mono_w32socket_sendto (sock, buf, count, sendflags, sa, sa_size, blocking); - MONO_EXIT_GC_SAFE; mono_gchandle_free (gchandle); @@ -1965,8 +1982,6 @@ ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal (gsize sock, gi return; } - MONO_ENTER_GC_SAFE; - /* No need to deal with MulticastOption names here, because * you cant getsockopt AddMembership or DropMembership (the * int getsockopt will error, causing an exception) @@ -1992,8 +2007,6 @@ ves_icall_System_Net_Sockets_Socket_GetSocketOption_obj_internal (gsize sock, gi ret = mono_w32socket_getsockopt (sock, system_level, system_name, &val, &valsize); } - MONO_EXIT_GC_SAFE; - if (ret == SOCKET_ERROR) { *werror = mono_w32socket_get_last_error (); return; @@ -2111,12 +2124,8 @@ ves_icall_System_Net_Sockets_Socket_GetSocketOption_arr_internal (gsize sock, gi uint32_t gchandle; guchar *buf = MONO_ARRAY_HANDLE_PIN (byte_val, guchar, 0, &gchandle); - MONO_ENTER_GC_SAFE; - ret = mono_w32socket_getsockopt (sock, system_level, system_name, buf, &valsize); - MONO_EXIT_GC_SAFE; - mono_gchandle_free (gchandle); if (ret == SOCKET_ERROR) @@ -2425,13 +2434,8 @@ ves_icall_System_Net_Sockets_Socket_Shutdown_internal (gsize sock, gint32 how, g return; } - MONO_ENTER_GC_SAFE; - /* Currently, the values for how (recv=0, send=1, both=2) match the BSD API */ ret = mono_w32socket_shutdown (sock, how); - - MONO_EXIT_GC_SAFE; - if (ret == SOCKET_ERROR) *werror = mono_w32socket_get_last_error (); @@ -2476,12 +2480,8 @@ ves_icall_System_Net_Sockets_Socket_IOControl_internal (gsize sock, gint32 code, o_buffer = MONO_ARRAY_HANDLE_PIN (output, gchar, 0, &o_gchandle); } - MONO_ENTER_GC_SAFE; - ret = mono_w32socket_ioctl (sock, code, i_buffer, i_len, o_buffer, o_len, &output_bytes); - MONO_EXIT_GC_SAFE; - if (i_gchandle) mono_gchandle_free (i_gchandle); if (o_gchandle) @@ -2709,14 +2709,14 @@ ves_icall_System_Net_Dns_GetHostByAddr_internal (MonoStringHandle addr, MonoStri g_free (address); - MONO_ENTER_GC_SAFE; - switch (family) { case AF_INET: { #if HAVE_SOCKADDR_IN_SIN_LEN saddr.sin_len = sizeof (saddr); #endif + MONO_ENTER_GC_SAFE; ret = getnameinfo ((struct sockaddr*)&saddr, sizeof (saddr), hostname, sizeof (hostname), NULL, 0, 0) == 0; + MONO_EXIT_GC_SAFE; break; } #ifdef HAVE_STRUCT_SOCKADDR_IN6 @@ -2724,7 +2724,9 @@ ves_icall_System_Net_Dns_GetHostByAddr_internal (MonoStringHandle addr, MonoStri #if HAVE_SOCKADDR_IN6_SIN_LEN saddr6.sin6_len = sizeof (saddr6); #endif + MONO_ENTER_GC_SAFE; ret = getnameinfo ((struct sockaddr*)&saddr6, sizeof (saddr6), hostname, sizeof (hostname), NULL, 0, 0) == 0; + MONO_EXIT_GC_SAFE; break; } #endif @@ -2732,8 +2734,6 @@ ves_icall_System_Net_Dns_GetHostByAddr_internal (MonoStringHandle addr, MonoStri g_assert_not_reached (); } - MONO_EXIT_GC_SAFE; - if (!ret) return FALSE; @@ -2807,9 +2807,7 @@ ves_icall_System_Net_Sockets_Socket_SendFile_internal (gsize sock, MonoStringHan buffers.TailLength = mono_array_handle_length (post_buffer); } - MONO_ENTER_GC_SAFE; ret = mono_w32socket_transmit_file (sock, file, &buffers, flags, blocking); - MONO_EXIT_GC_SAFE; if (pre_buffer_gchandle) mono_gchandle_free (pre_buffer_gchandle);