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 = closesocket (sock);
+ MONO_EXIT_GC_SAFE;
+ return ret;
}
#endif /* HOST_WIN32 */
* 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
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 ();
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 ();
}
}
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)
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)
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 ();
return;
}
- MONO_ENTER_GC_SAFE;
*werror = mono_w32socket_disconnect (sock, reuse);
- MONO_EXIT_GC_SAFE;
mono_thread_info_uninstall_interrupt (&interrupted);
if (interrupted)
}
#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)
+ves_icall_System_Net_Sockets_Socket_Receive_internal (gsize sock, gchar *buffer, gint32 count, gint32 flags, gint32 *werror, gboolean blocking, MonoError *error)
{
int ret;
- gint32 alen;
int recvflags = 0;
gboolean interrupted;
- MonoInternalThread* curthread G_GNUC_UNUSED = mono_thread_internal_current ();
error_init (error);
*werror = 0;
- alen = mono_array_handle_length (buffer);
- if (offset > alen - count)
- return 0;
-
recvflags = convert_socketflags (flags);
if (recvflags == -1) {
*werror = WSAEOPNOTSUPP;
if (interrupted)
return 0;
- 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);
+ ret = mono_w32socket_recv (sock, buffer, count, recvflags, blocking);
if (ret == SOCKET_ERROR)
*werror = mono_w32socket_get_last_error ();
}
gint32
-ves_icall_System_Net_Sockets_Socket_Receive_array_internal (gsize sock, MonoArrayHandle buffers, gint32 flags, gint32 *werror, gboolean blocking, MonoError *error)
+ves_icall_System_Net_Sockets_Socket_Receive_array_internal (gsize sock, WSABUF *buffers, gint32 count, gint32 flags, gint32 *werror, gboolean blocking, MonoError *error)
{
- int ret, count;
+ int ret;
gboolean interrupted;
guint32 recv;
guint32 recvflags = 0;
error_init (error);
*werror = 0;
- count = mono_array_handle_length (buffers);
-
recvflags = convert_socketflags (flags);
if (recvflags == -1) {
*werror = WSAEOPNOTSUPP;
return 0;
}
- 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);
+ ret = mono_w32socket_recvbuffers (sock, buffers, count, &recv, &recvflags, NULL, NULL, blocking);
if (ret == SOCKET_ERROR)
*werror = mono_w32socket_get_last_error ();
}
gint32
-ves_icall_System_Net_Sockets_Socket_ReceiveFrom_internal (gsize sock, MonoArrayHandle buffer, gint32 offset, gint32 count, gint32 flags, MonoObjectHandle sockaddr, gint32 *werror, gboolean blocking, MonoError *error)
+ves_icall_System_Net_Sockets_Socket_ReceiveFrom_internal (gsize sock, gchar *buffer, gint32 count, gint32 flags, MonoObjectHandle sockaddr, gint32 *werror, gboolean blocking, MonoError *error)
{
int ret;
- gchar *buf;
- gint32 alen;
int recvflags = 0;
struct sockaddr *sa;
socklen_t sa_size;
error_init (error);
*werror = 0;
-
- alen = mono_array_handle_length (buffer);
- if (offset > alen - count)
- return 0;
sa = create_sockaddr_from_handle (sockaddr, &sa_size, werror, error);
if (*werror != 0)
return 0;
}
- 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);
+ ret = mono_w32socket_recvfrom (sock, buffer, count, recvflags, sa, &sa_size, blocking);
if (ret == SOCKET_ERROR)
*werror = mono_w32socket_get_last_error ();
}
gint32
-ves_icall_System_Net_Sockets_Socket_Send_internal (gsize sock, MonoArrayHandle buffer, gint32 offset, gint32 count, gint32 flags, gint32 *werror, gboolean blocking, MonoError *error)
+ves_icall_System_Net_Sockets_Socket_Send_internal (gsize sock, gchar *buffer, gint32 count, gint32 flags, gint32 *werror, gboolean blocking, MonoError *error)
{
int ret;
- gint32 alen;
int sendflags = 0;
gboolean interrupted;
error_init (error);
*werror = 0;
- alen = mono_array_handle_length (buffer);
- if (offset > alen - count)
- return 0;
-
- LOGDEBUG (g_message("%s: alen: %d", __func__, alen));
-
LOGDEBUG (g_message("%s: Sending %d bytes", __func__, count));
sendflags = convert_socketflags (flags);
return 0;
}
- 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);
+ ret = mono_w32socket_send (sock, buffer, count, sendflags, blocking);
if (ret == SOCKET_ERROR)
*werror = mono_w32socket_get_last_error ();
}
gint32
-ves_icall_System_Net_Sockets_Socket_Send_array_internal (gsize sock, MonoArrayHandle buffers, gint32 flags, gint32 *werror, gboolean blocking, MonoError *error)
+ves_icall_System_Net_Sockets_Socket_Send_array_internal (gsize sock, WSABUF *buffers, gint32 count, gint32 flags, gint32 *werror, gboolean blocking, MonoError *error)
{
- int ret, count;
+ int ret;
guint32 sent;
guint32 sendflags = 0;
gboolean interrupted;
error_init (error);
*werror = 0;
- count = mono_array_handle_length (buffers);
-
sendflags = convert_socketflags (flags);
if (sendflags == -1) {
*werror = WSAEOPNOTSUPP;
return 0;
}
- 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);
+ ret = mono_w32socket_sendbuffers (sock, buffers, count, &sent, sendflags, NULL, NULL, blocking);
if (ret == SOCKET_ERROR)
*werror = mono_w32socket_get_last_error ();
}
gint32
-ves_icall_System_Net_Sockets_Socket_SendTo_internal (gsize sock, MonoArrayHandle buffer, gint32 offset, gint32 count, gint32 flags, MonoObjectHandle sockaddr, gint32 *werror, gboolean blocking, MonoError *error)
+ves_icall_System_Net_Sockets_Socket_SendTo_internal (gsize sock, gchar *buffer, gint32 count, gint32 flags, MonoObjectHandle sockaddr, gint32 *werror, gboolean blocking, MonoError *error)
{
int ret;
- gint32 alen;
int sendflags = 0;
struct sockaddr *sa;
socklen_t sa_size;
gboolean interrupted;
*werror = 0;
-
- alen = mono_array_handle_length (buffer);
- if (offset > alen - count) {
- return 0;
- }
sa = create_sockaddr_from_handle (sockaddr, &sa_size, werror, error);
if (*werror != 0)
return 0;
return_val_if_nok (error, 0);
- LOGDEBUG (g_message ("%s: alen: %d", __func__, alen));
-
LOGDEBUG (g_message("%s: Sending %d bytes", __func__, count));
sendflags = convert_socketflags (flags);
return 0;
}
- 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);
+ ret = mono_w32socket_sendto (sock, buffer, count, sendflags, sa, sa_size, blocking);
if (ret == SOCKET_ERROR)
*werror = mono_w32socket_get_last_error ();
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)
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;
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)
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 ();
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)
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
#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
g_assert_not_reached ();
}
- MONO_EXIT_GC_SAFE;
-
if (!ret)
return FALSE;
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);