X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fsocket-io.c;h=bc0b4e95f1084896d262e3b4f0c7964f25a99577;hb=7f519b3a28bde0d3ecc7e899f1eee0f2fb00d51c;hp=b4df2ba67edb2bc7a0b78b468c15f27f01bf5740;hpb=da80452cfdc8bd155fad42fe26ff812e93fa5045;p=mono.git diff --git a/mono/metadata/socket-io.c b/mono/metadata/socket-io.c index b4df2ba67ed..bc0b4e95f10 100644 --- a/mono/metadata/socket-io.c +++ b/mono/metadata/socket-io.c @@ -20,7 +20,7 @@ #include #include -#ifndef PLATFORM_WIN32 +#ifndef HOST_WIN32 #include #include #include @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -68,7 +69,7 @@ #include "mono/io-layer/socket-wrappers.h" -#ifdef PLATFORM_WIN32 +#ifdef HOST_WIN32 /* This is a kludge to make this file build under cygwin: * w32api/ws2tcpip.h has definitions for some AF_INET6 values and * prototypes for some but not all required functions (notably @@ -83,7 +84,16 @@ #undef AF_INET6 #endif -#undef DEBUG +#define LOGDEBUG(...) +/* define LOGDEBUG(...) g_message(__VA_ARGS__) */ + +/* + * Some older versions of libc provide IPV6 support without defining the AI_ADDRCONFIG + * flag for getaddrinfo. + */ +#ifndef AI_ADDRCONFIG +#define AI_ADDRCONFIG 0 +#endif static gint32 convert_family(MonoAddressFamily mono_family) { @@ -131,11 +141,15 @@ static gint32 convert_family(MonoAddressFamily mono_family) break; case AddressFamily_Sna: +#ifdef AF_SNA family=AF_SNA; +#endif break; case AddressFamily_DecNet: +#ifdef AF_DECnet family=AF_DECnet; +#endif break; case AddressFamily_AppleTalk: @@ -182,13 +196,17 @@ static MonoAddressFamily convert_to_mono_family(guint16 af_family) break; #endif +#ifdef AF_SNA case AF_SNA: family=AddressFamily_Sna; break; +#endif +#ifdef AF_DECnet case AF_DECnet: family=AddressFamily_DecNet; break; +#endif case AF_APPLETALK: family=AddressFamily_AppleTalk; @@ -230,7 +248,9 @@ static gint32 convert_type(MonoSocketType mono_type) break; case SocketType_Rdm: +#ifdef SOCK_RDM type=SOCK_RDM; +#endif break; case SocketType_Seqpacket: @@ -303,24 +323,22 @@ static gint32 convert_socketflags (gint32 sflags) flags |= MSG_PEEK; if (sflags & SocketFlags_DontRoute) flags |= MSG_DONTROUTE; -#if 0 + /* Ignore Partial - see bug 349688. Don't return -1, because * according to the comment in that bug ms runtime doesn't for * UDP sockets (this means we will silently ignore it for TCP * too) */ - if (sflags & SocketFlags_Partial) #ifdef MSG_MORE + if (sflags & SocketFlags_Partial) flags |= MSG_MORE; -#else - return -1; -#endif #endif +#if 0 + /* Don't do anything for MaxIOVectorLength */ if (sflags & SocketFlags_MaxIOVectorLength) - /* FIXME: Don't know what to do for MaxIOVectorLength query */ return -1; - - return (flags ? flags : -1); +#endif + return flags; } /* @@ -402,11 +420,23 @@ static gint32 convert_sockopt_level_and_name(MonoSocketOptionLevel mono_level, break; #endif case SocketOptionName_ExclusiveAddressUse: +#ifdef SO_EXCLUSIVEADDRUSE + *system_name = SO_EXCLUSIVEADDRUSE; + break; +#endif case SocketOptionName_UseLoopback: +#ifdef SO_USELOOPBACK + *system_name = SO_USELOOPBACK; + break; +#endif case SocketOptionName_MaxConnections: - /* Can't figure out how to map these, so fall - * through - */ +#ifdef SO_MAXCONN + *system_name = SO_MAXCONN; + break; +#elif defined(SOMAXCONN) + *system_name = SOMAXCONN; + break; +#endif default: g_warning("System.Net.Sockets.SocketOptionName 0x%x is not supported at Socket level", mono_name); return(-1); @@ -678,6 +708,7 @@ static gint32 get_family_hint(void) ipv4_field = mono_class_get_field_from_name (socket_class, "ipv4Supported"); ipv6_field = mono_class_get_field_from_name (socket_class, "ipv6Supported"); vtable = mono_class_vtable (mono_domain_get (), socket_class); + g_assert (vtable); mono_runtime_class_init (vtable); mono_field_static_get_value (vtable, ipv4_field, &ipv4_enabled); @@ -761,9 +792,7 @@ void ves_icall_System_Net_Sockets_Socket_Close_internal(SOCKET sock, { MONO_ARCH_SAVE_REGS; -#ifdef DEBUG - g_message (G_GNUC_PRETTY_FUNCTION ": closing 0x%x", sock); -#endif + LOGDEBUG (g_message ("%s: closing 0x%x", __func__, sock)); *error = 0; @@ -777,9 +806,7 @@ gint32 ves_icall_System_Net_Sockets_SocketException_WSAGetLastError_internal(voi { MONO_ARCH_SAVE_REGS; -#ifdef DEBUG - g_message(G_GNUC_PRETTY_FUNCTION ": returning %d", WSAGetLastError()); -#endif + LOGDEBUG (g_message("%s: returning %d", __func__, WSAGetLastError())); return(WSAGetLastError()); } @@ -794,14 +821,7 @@ gint32 ves_icall_System_Net_Sockets_Socket_Available_internal(SOCKET sock, *error = 0; -#if defined(PLATFORM_MACOSX) - { - socklen_t optlen = sizeof (amount); - ret=getsockopt (sock, SOL_SOCKET, SO_NREAD, &amount, &optlen); - } -#else ret=ioctlsocket(sock, FIONREAD, &amount); -#endif if(ret==SOCKET_ERROR) { *error = WSAGetLastError (); return(0); @@ -841,45 +861,16 @@ gpointer ves_icall_System_Net_Sockets_Socket_Accept_internal(SOCKET sock, MONO_ARCH_SAVE_REGS; *error = 0; - -#ifdef PLATFORM_WIN32 - /* Several applications are getting stuck during shutdown on Windows - * when an accept call is on a background thread. - * - */ - if (blocking) { - MonoThread* curthread = mono_thread_current (); - - if (curthread) { - for (;;) { - int selectret; - int optlen = sizeof (gint); - TIMEVAL timeout; - fd_set readfds; - FD_ZERO (&readfds); - FD_SET(sock, &readfds); - timeout.tv_sec = 0; - timeout.tv_usec = 1000; - selectret = select (0, &readfds, NULL, NULL, &timeout); - if (selectret > 0) - break; - if (curthread->state & ThreadState_StopRequested) - return NULL; - /* A negative return from select means that an error has occurred. - * Let _wapi_accept handle that.*/ - if (selectret != 0) - break; - /* The socket's state may have changed. If it is no longer listening, stop.*/ - if (!getsockopt (sock, SOL_SOCKET, SO_ACCEPTCONN, (char*)&selectret, &optlen)) { - if (!selectret) - break; - } - } - } +#ifdef HOST_WIN32 + { + MonoInternalThread* curthread = mono_thread_internal_current (); + curthread->interrupt_on_stop = (gpointer)TRUE; + newsock = _wapi_accept (sock, NULL, 0); + curthread->interrupt_on_stop = (gpointer)FALSE; } -#endif - +#else newsock = _wapi_accept (sock, NULL, 0); +#endif if(newsock==INVALID_SOCKET) { *error = WSAGetLastError (); return(NULL); @@ -915,25 +906,25 @@ static MonoObject *create_object_from_sockaddr(struct sockaddr *saddr, MonoAddressFamily family; /* Build a System.Net.SocketAddress object instance */ - sockaddr_class=mono_class_from_name(get_socket_assembly (), "System.Net", "SocketAddress"); + sockaddr_class=mono_class_from_name_cached (get_socket_assembly (), "System.Net", "SocketAddress"); sockaddr_obj=mono_object_new(domain, sockaddr_class); /* Locate the SocketAddress data buffer in the object */ - field=mono_class_get_field_from_name(sockaddr_class, "data"); + field=mono_class_get_field_from_name_cached (sockaddr_class, "data"); /* Make sure there is space for the family and size bytes */ #ifdef HAVE_SYS_UN_H if (saddr->sa_family == AF_UNIX) { /* sa_len includes the entire sockaddr size, so we don't need the * N bytes (sizeof (unsigned short)) of the family. */ - data=mono_array_new(domain, mono_get_byte_class (), sa_size); + data=mono_array_new_cached(domain, mono_get_byte_class (), sa_size); } else #endif { /* May be the +2 here is too conservative, as sa_len returns * the length of the entire sockaddr_in/in6, including * sizeof (unsigned short) of the family */ - data=mono_array_new(domain, mono_get_byte_class (), sa_size+2); + data=mono_array_new_cached(domain, mono_get_byte_class (), sa_size+2); } /* The data buffer is laid out as follows: @@ -1037,9 +1028,7 @@ extern MonoObject *ves_icall_System_Net_Sockets_Socket_LocalEndPoint_internal(SO return(NULL); } -#ifdef DEBUG - g_message(G_GNUC_PRETTY_FUNCTION ": bound to %s port %d", inet_ntoa(((struct sockaddr_in *)&sa)->sin_addr), ntohs(((struct sockaddr_in *)&sa)->sin_port)); -#endif + LOGDEBUG (g_message("%s: bound to %s port %d", __func__, inet_ntoa(((struct sockaddr_in *)&sa)->sin_addr), ntohs(((struct sockaddr_in *)&sa)->sin_port))); return(create_object_from_sockaddr((struct sockaddr *)sa, salen, error)); @@ -1063,9 +1052,7 @@ extern MonoObject *ves_icall_System_Net_Sockets_Socket_RemoteEndPoint_internal(S return(NULL); } -#ifdef DEBUG - g_message(G_GNUC_PRETTY_FUNCTION ": connected to %s port %d", inet_ntoa(((struct sockaddr_in *)&sa)->sin_addr), ntohs(((struct sockaddr_in *)&sa)->sin_port)); -#endif + LOGDEBUG (g_message("%s: connected to %s port %d", __func__, inet_ntoa(((struct sockaddr_in *)&sa)->sin_addr), ntohs(((struct sockaddr_in *)&sa)->sin_port))); return(create_object_from_sockaddr((struct sockaddr *)sa, salen, error)); @@ -1198,9 +1185,7 @@ extern void ves_icall_System_Net_Sockets_Socket_Bind_internal(SOCKET sock, MonoO return; } -#ifdef DEBUG - g_message(G_GNUC_PRETTY_FUNCTION ": binding to %s port %d", inet_ntoa(((struct sockaddr_in *)sa)->sin_addr), ntohs (((struct sockaddr_in *)sa)->sin_port)); -#endif + LOGDEBUG (g_message("%s: binding to %s port %d", __func__, inet_ntoa(((struct sockaddr_in *)sa)->sin_addr), ntohs (((struct sockaddr_in *)sa)->sin_port))); ret = _wapi_bind (sock, sa, sa_size); if(ret==SOCKET_ERROR) { @@ -1220,7 +1205,7 @@ MonoBoolean ves_icall_System_Net_Sockets_Socket_Poll_internal (SOCKET sock, gint mode, gint timeout, gint32 *error) { - MonoThread *thread = NULL; + MonoInternalThread *thread = NULL; mono_pollfd *pfds; int ret; time_t start; @@ -1256,7 +1241,7 @@ ves_icall_System_Net_Sockets_Socket_Poll_internal (SOCKET sock, gint mode, int leave = 0; if (thread == NULL) { - thread = mono_thread_current (); + thread = mono_thread_internal_current (); } leave = mono_thread_test_state (thread, ThreadState_AbortRequested | ThreadState_StopRequested); @@ -1273,7 +1258,7 @@ ves_icall_System_Net_Sockets_Socket_Poll_internal (SOCKET sock, gint mode, } while (ret == -1 && errno == EINTR); if (ret == -1) { -#ifdef PLATFORM_WIN32 +#ifdef HOST_WIN32 *error = WSAGetLastError (); #else *error = errno_to_WSA (errno, __func__); @@ -1306,9 +1291,7 @@ extern void ves_icall_System_Net_Sockets_Socket_Connect_internal(SOCKET sock, Mo return; } -#ifdef DEBUG - g_message(G_GNUC_PRETTY_FUNCTION ": connecting to %s port %d", inet_ntoa(((struct sockaddr_in *)sa)->sin_addr), ntohs (((struct sockaddr_in *)sa)->sin_port)); -#endif + 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))); ret = _wapi_connect (sock, sa, sa_size); if(ret==SOCKET_ERROR) { @@ -1346,10 +1329,7 @@ extern void ves_icall_System_Net_Sockets_Socket_Disconnect_internal(SOCKET sock, *error = 0; -#ifdef DEBUG - g_message("%s: disconnecting from socket %p (reuse %d)", __func__, - sock, reuse); -#endif + LOGDEBUG (g_message("%s: disconnecting from socket %p (reuse %d)", __func__, sock, reuse)); /* I _think_ the extension function pointers need to be looked * up for each socket. FIXME: check the best way to store @@ -1427,8 +1407,18 @@ gint32 ves_icall_System_Net_Sockets_Socket_Receive_internal(SOCKET sock, MonoArr *error = WSAEOPNOTSUPP; return (0); } - + +#ifdef HOST_WIN32 + { + MonoInternalThread* curthread = mono_thread_internal_current (); + curthread->interrupt_on_stop = (gpointer)TRUE; + ret = _wapi_recv (sock, buf, count, recvflags); + curthread->interrupt_on_stop = (gpointer)FALSE; + } +#else ret = _wapi_recv (sock, buf, count, recvflags); +#endif + if(ret==SOCKET_ERROR) { *error = WSAGetLastError (); return(0); @@ -1534,15 +1524,11 @@ gint32 ves_icall_System_Net_Sockets_Socket_Send_internal(SOCKET sock, MonoArray return(0); } -#ifdef DEBUG - g_message(G_GNUC_PRETTY_FUNCTION ": alen: %d", alen); -#endif + LOGDEBUG (g_message("%s: alen: %d", __func__, alen)); buf=mono_array_addr(buffer, guchar, offset); -#ifdef DEBUG - g_message(G_GNUC_PRETTY_FUNCTION ": Sending %d bytes", count); -#endif + LOGDEBUG (g_message("%s: Sending %d bytes", __func__, count)); sendflags = convert_socketflags (flags); if (sendflags == -1) { @@ -1611,15 +1597,11 @@ gint32 ves_icall_System_Net_Sockets_Socket_SendTo_internal(SOCKET sock, MonoArra return(0); } -#ifdef DEBUG - g_message(G_GNUC_PRETTY_FUNCTION ": alen: %d", alen); -#endif + LOGDEBUG (g_message("%s: alen: %d", __func__, alen)); buf=mono_array_addr(buffer, guchar, offset); -#ifdef DEBUG - g_message(G_GNUC_PRETTY_FUNCTION ": Sending %d bytes", count); -#endif + LOGDEBUG (g_message("%s: Sending %d bytes", __func__, count)); sendflags = convert_socketflags (flags); if (sendflags == -1) { @@ -1651,7 +1633,7 @@ static SOCKET Socket_to_SOCKET(MonoObject *sockobj) #define POLL_ERRORS (MONO_POLLERR | MONO_POLLHUP | MONO_POLLNVAL) void ves_icall_System_Net_Sockets_Socket_Select_internal(MonoArray **sockets, gint32 timeout, gint32 *error) { - MonoThread *thread = NULL; + MonoInternalThread *thread = NULL; MonoObject *obj; mono_pollfd *pfds; int nfds, idx; @@ -1661,7 +1643,7 @@ void ves_icall_System_Net_Sockets_Socket_Select_internal(MonoArray **sockets, gi MonoClass *sock_arr_class; MonoArray *socks; time_t start; - mono_array_size_t socks_size; + uintptr_t socks_size; MONO_ARCH_SAVE_REGS; @@ -1707,7 +1689,7 @@ void ves_icall_System_Net_Sockets_Socket_Select_internal(MonoArray **sockets, gi if (ret == -1 && errno == EINTR) { int leave = 0; if (thread == NULL) - thread = mono_thread_current (); + thread = mono_thread_internal_current (); leave = mono_thread_test_state (thread, ThreadState_AbortRequested | ThreadState_StopRequested); @@ -1724,7 +1706,7 @@ void ves_icall_System_Net_Sockets_Socket_Select_internal(MonoArray **sockets, gi } while (ret == -1 && errno == EINTR); if (ret == -1) { -#ifdef PLATFORM_WIN32 +#ifdef HOST_WIN32 *error = WSAGetLastError (); #else *error = errno_to_WSA (errno, __func__); @@ -1740,7 +1722,7 @@ void ves_icall_System_Net_Sockets_Socket_Select_internal(MonoArray **sockets, gi } sock_arr_class= ((MonoObject *)*sockets)->vtable->klass; - socks_size = ((mono_array_size_t)ret) + 3; /* space for the NULL delimiters */ + 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); mode = idx = 0; @@ -1992,6 +1974,7 @@ static struct in6_addr ipaddress_to_struct_in6_addr(MonoObject *ipaddr) void ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal(SOCKET sock, gint32 level, gint32 name, MonoObject *obj_val, MonoArray *byte_val, gint32 int_val, gint32 *error) { + struct linger linger; int system_level; int system_name; int ret; @@ -2037,18 +2020,9 @@ void ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal(SOCKET sock, g /* Only one of obj_val, byte_val or int_val has data */ if(obj_val!=NULL) { MonoClassField *field; - struct linger linger; int valsize; switch(name) { - case SocketOptionName_DontLinger: - linger.l_onoff=0; - linger.l_linger=0; - valsize=sizeof(linger); - ret = _wapi_setsockopt (sock, system_level, - system_name, &linger, valsize); - break; - case SocketOptionName_Linger: /* Dig out "bool enabled" and "int seconds" * fields @@ -2136,17 +2110,31 @@ void ves_icall_System_Net_Sockets_Socket_SetSocketOption_internal(SOCKET sock, g return; } } else if (byte_val!=NULL) { - int valsize=mono_array_length(byte_val); - guchar *buf=mono_array_addr(byte_val, guchar, 0); - - ret = _wapi_setsockopt (sock, system_level, system_name, buf, valsize); - if(ret==SOCKET_ERROR) { - *error = WSAGetLastError (); - return; + int valsize = mono_array_length (byte_val); + guchar *buf = mono_array_addr (byte_val, guchar, 0); + + switch(name) { + case SocketOptionName_DontLinger: + if (valsize == 1) { + linger.l_onoff = (*buf) ? 0 : 1; + linger.l_linger = 0; + ret = _wapi_setsockopt (sock, system_level, system_name, &linger, sizeof (linger)); + } else { + *error = WSAEINVAL; + } + break; + default: + ret = _wapi_setsockopt (sock, system_level, system_name, buf, valsize); + break; } } else { /* ReceiveTimeout/SendTimeout get here */ switch(name) { + case SocketOptionName_DontLinger: + linger.l_onoff = !int_val; + linger.l_linger = 0; + ret = _wapi_setsockopt (sock, system_level, system_name, &linger, sizeof (linger)); + break; case SocketOptionName_DontFragment: #ifdef HAVE_IP_MTU_DISCOVER /* Fiddle with the value slightly if we're @@ -2789,7 +2777,7 @@ MonoBoolean ves_icall_System_Net_Dns_GetHostByName_internal(MonoString *host, Mo memset(&hints, 0, sizeof(hints)); hints.ai_family = get_family_hint (); hints.ai_socktype = SOCK_STREAM; - hints.ai_flags = AI_CANONNAME; + hints.ai_flags = AI_CANONNAME | AI_ADDRCONFIG; if (*hostname && getaddrinfo(hostname, NULL, &hints, &info) == -1) { return(FALSE); @@ -2927,7 +2915,6 @@ inet_pton (int family, const char *address, void *inaddrp) extern MonoBoolean ves_icall_System_Net_Dns_GetHostByAddr_internal(MonoString *addr, MonoString **h_name, MonoArray **h_aliases, MonoArray **h_addr_list) { char *address; - gboolean v1; #ifdef AF_INET6 struct sockaddr_in saddr; @@ -2942,8 +2929,6 @@ extern MonoBoolean ves_icall_System_Net_Dns_GetHostByAddr_internal(MonoString *a gboolean ret; #endif - v1 = mono_framework_version () == 1; - address = mono_string_to_utf8 (addr); #ifdef AF_INET6 @@ -2964,10 +2949,6 @@ extern MonoBoolean ves_icall_System_Net_Dns_GetHostByAddr_internal(MonoString *a } g_free(address); - if (v1) { - flags = NI_NAMEREQD; - } - if(family == AF_INET) { #if HAVE_SOCKADDR_IN_SIN_LEN saddr.sin_len = sizeof (saddr); @@ -2991,7 +2972,7 @@ extern MonoBoolean ves_icall_System_Net_Dns_GetHostByAddr_internal(MonoString *a memset (&hints, 0, sizeof(hints)); hints.ai_family = get_family_hint (); hints.ai_socktype = SOCK_STREAM; - hints.ai_flags = AI_CANONNAME; + hints.ai_flags = AI_CANONNAME | AI_ADDRCONFIG; if( getaddrinfo (hostname, NULL, &hints, &info) == -1 ) { return(FALSE); @@ -3005,12 +2986,7 @@ extern MonoBoolean ves_icall_System_Net_Dns_GetHostByAddr_internal(MonoString *a } if ((he = gethostbyaddr ((char *) &inaddr, sizeof (inaddr), AF_INET)) == NULL) { - if (v1) { - ret = FALSE; - } else { - ret = ipaddr_to_IPHostEntry (address, h_name, - h_aliases, h_addr_list); - } + ret = ipaddr_to_IPHostEntry (address, h_name, h_aliases, h_addr_list); } else { ret = hostent_to_IPHostEntry (he, h_name, h_aliases, h_addr_list, FALSE); @@ -3038,6 +3014,43 @@ extern MonoBoolean ves_icall_System_Net_Dns_GetHostName_internal(MonoString **h_ return(TRUE); } +gboolean +ves_icall_System_Net_Sockets_Socket_SendFile (SOCKET sock, MonoString *filename, MonoArray *pre_buffer, MonoArray *post_buffer, gint flags) +{ + HANDLE file; + gint32 error; + TRANSMIT_FILE_BUFFERS buffers; + + MONO_ARCH_SAVE_REGS; + + if (filename == NULL) + return FALSE; + + file = ves_icall_System_IO_MonoIO_Open (filename, FileMode_Open, FileAccess_Read, FileShare_Read, 0, &error); + if (file == INVALID_HANDLE_VALUE) { + SetLastError (error); + return FALSE; + } + + memset (&buffers, 0, sizeof (buffers)); + if (pre_buffer != NULL) { + buffers.Head = mono_array_addr (pre_buffer, guchar, 0); + buffers.HeadLength = mono_array_length (pre_buffer); + } + if (post_buffer != NULL) { + buffers.Tail = mono_array_addr (post_buffer, guchar, 0); + buffers.TailLength = mono_array_length (post_buffer); + } + + if (!TransmitFile (sock, file, 0, 0, NULL, &buffers, flags)) { + CloseHandle (file); + return FALSE; + } + + CloseHandle (file); + return TRUE; +} + void mono_network_init(void) { WSADATA wsadata; @@ -3045,14 +3058,12 @@ void mono_network_init(void) err=WSAStartup(MAKEWORD(2,0), &wsadata); if(err!=0) { - g_error(G_GNUC_PRETTY_FUNCTION ": Couldn't initialise networking"); + g_error("%s: Couldn't initialise networking", __func__); exit(-1); } -#ifdef DEBUG - g_message(G_GNUC_PRETTY_FUNCTION ": Using socket library: %s", wsadata.szDescription); - g_message(G_GNUC_PRETTY_FUNCTION ": Socket system status: %s", wsadata.szSystemStatus); -#endif + LOGDEBUG (g_message("%s: Using socket library: %s", __func__, wsadata.szDescription)); + LOGDEBUG (g_message("%s: Socket system status: %s", __func__, wsadata.szSystemStatus)); } void mono_network_cleanup(void)