#include <mono/io-layer/socket-private.h>
#include <mono/io-layer/handles-private.h>
#include <mono/io-layer/socket-wrappers.h>
+#include <mono/io-layer/io-trace.h>
#include <mono/utils/mono-poll.h>
+#include <mono/utils/mono-once.h>
+#include <mono/utils/mono-logger-internals.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <netdb.h>
#endif
-#if 0
-#define DEBUG(...) g_message(__VA_ARGS__)
-#else
-#define DEBUG(...)
-#endif
-
-static guint32 startup_count=0;
static guint32 in_cleanup = 0;
static void socket_close (gpointer handle, gpointer data);
int ret;
struct _WapiHandle_socket *socket_handle = (struct _WapiHandle_socket *)data;
- DEBUG ("%s: closing socket handle %p", __func__, handle);
-
- if (startup_count == 0 && !in_cleanup) {
- WSASetLastError (WSANOTINITIALISED);
- return;
- }
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: closing socket handle %p", __func__, handle);
/* Shutdown the socket for reading, to interrupt any potential
* receives that may be blocking for data. See bug 75705.
if (ret == -1) {
gint errnum = errno;
- DEBUG ("%s: close error: %s", __func__, strerror (errno));
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: close error: %s", __func__, strerror (errno));
errnum = errno_to_WSA (errnum, __func__);
if (!in_cleanup)
WSASetLastError (errnum);
socket_handle->saved_error = 0;
}
-int WSAStartup(guint32 requested, WapiWSAData *data)
-{
- if (data == NULL) {
- return(WSAEFAULT);
- }
-
- /* Insist on v2.0+ */
- if (requested < MAKEWORD(2,0)) {
- return(WSAVERNOTSUPPORTED);
- }
-
- startup_count++;
-
- /* I've no idea what is the minor version of the spec I read */
- data->wHighVersion = MAKEWORD(2,2);
-
- data->wVersion = requested < data->wHighVersion? requested:
- data->wHighVersion;
-
- DEBUG ("%s: high version 0x%x", __func__, data->wHighVersion);
-
- strncpy (data->szDescription, "WAPI", WSADESCRIPTION_LEN);
- strncpy (data->szSystemStatus, "groovy", WSASYS_STATUS_LEN);
-
- return(0);
-}
-
static gboolean
cleanup_close (gpointer handle, gpointer data)
{
return TRUE;
}
-int WSACleanup(void)
+void _wapi_cleanup_networking(void)
{
- DEBUG ("%s: cleaning up", __func__);
-
- if (--startup_count) {
- /* Do nothing */
- return(0);
- }
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: cleaning up", __func__);
in_cleanup = 1;
_wapi_handle_foreach (WAPI_HANDLE_SOCKET, cleanup_close, NULL);
in_cleanup = 0;
- return(0);
}
void WSASetLastError(int error)
struct _WapiHandle_socket new_socket_handle = {0};
gboolean ok;
int new_fd;
-
- if (startup_count == 0) {
- WSASetLastError (WSANOTINITIALISED);
- return(INVALID_SOCKET);
- }
if (addr != NULL && *addrlen < sizeof(struct sockaddr)) {
WSASetLastError (WSAEFAULT);
if (new_fd == -1) {
gint errnum = errno;
- DEBUG ("%s: accept error: %s", __func__, strerror(errno));
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: accept error: %s", __func__, strerror(errno));
errnum = errno_to_WSA (errnum, __func__);
WSASetLastError (errnum);
}
if (new_fd >= _wapi_fd_reserve) {
- DEBUG ("%s: File descriptor is too big", __func__);
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: File descriptor is too big", __func__);
WSASetLastError (WSASYSCALLFAILURE);
return(INVALID_SOCKET);
}
- DEBUG ("%s: returning newly accepted socket handle %p with",
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: returning newly accepted socket handle %p with",
__func__, new_handle);
return(new_fd);
gpointer handle = GUINT_TO_POINTER (fd);
int ret;
- if (startup_count == 0) {
- WSASetLastError (WSANOTINITIALISED);
- return(SOCKET_ERROR);
- }
-
if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) {
WSASetLastError (WSAENOTSOCK);
return(SOCKET_ERROR);
ret = bind (fd, my_addr, addrlen);
if (ret == -1) {
gint errnum = errno;
- DEBUG ("%s: bind error: %s", __func__, strerror(errno));
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: bind error: %s", __func__, strerror(errno));
errnum = errno_to_WSA (errnum, __func__);
WSASetLastError (errnum);
gboolean ok;
gint errnum;
- if (startup_count == 0) {
- WSASetLastError (WSANOTINITIALISED);
- return(SOCKET_ERROR);
- }
-
if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) {
WSASetLastError (WSAENOTSOCK);
return(SOCKET_ERROR);
errnum = errno;
if (errno != EINTR) {
- DEBUG ("%s: connect error: %s", __func__,
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: connect error: %s", __func__,
strerror (errnum));
errnum = errno_to_WSA (errnum, __func__);
if (errno != EINTR) {
errnum = errno_to_WSA (errno, __func__);
- DEBUG ("%s: connect poll error: %s",
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: connect poll error: %s",
__func__, strerror (errno));
WSASetLastError (errnum);
&len) == -1) {
errnum = errno_to_WSA (errno, __func__);
- DEBUG ("%s: connect getsockopt error: %s",
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: connect getsockopt error: %s",
__func__, strerror (errno));
WSASetLastError (errnum);
socket_handle->saved_error = errnum;
}
- DEBUG ("%s: connect getsockopt returned error: %s",
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: connect getsockopt returned error: %s",
__func__, strerror (so_error));
WSASetLastError (errnum);
gpointer handle = GUINT_TO_POINTER (fd);
int ret;
- if (startup_count == 0) {
- WSASetLastError (WSANOTINITIALISED);
- return(SOCKET_ERROR);
- }
-
if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) {
WSASetLastError (WSAENOTSOCK);
return(SOCKET_ERROR);
ret = getpeername (fd, name, namelen);
if (ret == -1) {
gint errnum = errno;
- DEBUG ("%s: getpeername error: %s", __func__,
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: getpeername error: %s", __func__,
strerror (errno));
errnum = errno_to_WSA (errnum, __func__);
gpointer handle = GUINT_TO_POINTER (fd);
int ret;
- if (startup_count == 0) {
- WSASetLastError (WSANOTINITIALISED);
- return(SOCKET_ERROR);
- }
-
if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) {
WSASetLastError (WSAENOTSOCK);
return(SOCKET_ERROR);
ret = getsockname (fd, name, namelen);
if (ret == -1) {
gint errnum = errno;
- DEBUG ("%s: getsockname error: %s", __func__,
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: getsockname error: %s", __func__,
strerror (errno));
errnum = errno_to_WSA (errnum, __func__);
struct _WapiHandle_socket *socket_handle;
gboolean ok;
- if (startup_count == 0) {
- WSASetLastError (WSANOTINITIALISED);
- return(SOCKET_ERROR);
- }
-
if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) {
WSASetLastError (WSAENOTSOCK);
return(SOCKET_ERROR);
ret = getsockopt (fd, level, optname, tmp_val, optlen);
if (ret == -1) {
gint errnum = errno;
- DEBUG ("%s: getsockopt error: %s", __func__,
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: getsockopt error: %s", __func__,
strerror (errno));
errnum = errno_to_WSA (errnum, __func__);
gpointer handle = GUINT_TO_POINTER (fd);
int ret;
- if (startup_count == 0) {
- WSASetLastError (WSANOTINITIALISED);
- return(SOCKET_ERROR);
- }
-
if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) {
WSASetLastError (WSAENOTSOCK);
return(SOCKET_ERROR);
ret = listen (fd, backlog);
if (ret == -1) {
gint errnum = errno;
- DEBUG ("%s: listen error: %s", __func__, strerror (errno));
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: listen error: %s", __func__, strerror (errno));
errnum = errno_to_WSA (errnum, __func__);
WSASetLastError (errnum);
gboolean ok;
int ret;
- if (startup_count == 0) {
- WSASetLastError (WSANOTINITIALISED);
- return(SOCKET_ERROR);
- }
-
if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) {
WSASetLastError (WSAENOTSOCK);
return(SOCKET_ERROR);
if (ret == -1) {
gint errnum = errno;
- DEBUG ("%s: recv error: %s", __func__, strerror(errno));
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: recv error: %s", __func__, strerror(errno));
errnum = errno_to_WSA (errnum, __func__);
WSASetLastError (errnum);
gboolean ok;
int ret;
- if (startup_count == 0) {
- WSASetLastError (WSANOTINITIALISED);
- return(SOCKET_ERROR);
- }
-
if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) {
WSASetLastError (WSAENOTSOCK);
return(SOCKET_ERROR);
if (ret == -1) {
gint errnum = errno;
- DEBUG ("%s: recvmsg error: %s", __func__, strerror(errno));
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: recvmsg error: %s", __func__, strerror(errno));
errnum = errno_to_WSA (errnum, __func__);
WSASetLastError (errnum);
gpointer handle = GUINT_TO_POINTER (fd);
int ret;
- if (startup_count == 0) {
- WSASetLastError (WSANOTINITIALISED);
- return(SOCKET_ERROR);
- }
-
if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) {
WSASetLastError (WSAENOTSOCK);
return(SOCKET_ERROR);
if (ret == -1) {
gint errnum = errno;
- DEBUG ("%s: send error: %s", __func__, strerror (errno));
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: send error: %s", __func__, strerror (errno));
#ifdef O_NONBLOCK
/* At least linux returns EAGAIN/EWOULDBLOCK when the timeout has been set on
gpointer handle = GUINT_TO_POINTER (fd);
int ret;
- if (startup_count == 0) {
- WSASetLastError (WSANOTINITIALISED);
- return(SOCKET_ERROR);
- }
-
if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) {
WSASetLastError (WSAENOTSOCK);
return(SOCKET_ERROR);
if (ret == -1) {
gint errnum = errno;
- DEBUG ("%s: send error: %s", __func__, strerror (errno));
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: send error: %s", __func__, strerror (errno));
errnum = errno_to_WSA (errnum, __func__);
WSASetLastError (errnum);
gpointer handle = GUINT_TO_POINTER (fd);
int ret;
- if (startup_count == 0) {
- WSASetLastError (WSANOTINITIALISED);
- return(SOCKET_ERROR);
- }
-
if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) {
WSASetLastError (WSAENOTSOCK);
return(SOCKET_ERROR);
if (ret == -1) {
gint errnum = errno;
- DEBUG ("%s: sendmsg error: %s", __func__, strerror (errno));
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: sendmsg error: %s", __func__, strerror (errno));
errnum = errno_to_WSA (errnum, __func__);
WSASetLastError (errnum);
#endif
struct timeval tv;
- if (startup_count == 0) {
- WSASetLastError (WSANOTINITIALISED);
- return(SOCKET_ERROR);
- }
-
if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) {
WSASetLastError (WSAENOTSOCK);
return(SOCKET_ERROR);
tv.tv_usec = (ms % 1000) * 1000; // micro from milli
tmp_val = &tv;
optlen = sizeof (tv);
+ }
#if defined (__linux__)
- } else if (level == SOL_SOCKET &&
+ else if (level == SOL_SOCKET &&
(optname == SO_SNDBUF || optname == SO_RCVBUF)) {
/* According to socket(7) the Linux kernel doubles the
* buffer sizes "to allow space for bookkeeping
bufsize /= 2;
tmp_val = &bufsize;
-#endif
}
+#endif
ret = setsockopt (fd, level, optname, tmp_val, optlen);
if (ret == -1) {
gint errnum = errno;
- DEBUG ("%s: setsockopt error: %s", __func__,
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: setsockopt error: %s", __func__,
strerror (errno));
errnum = errno_to_WSA (errnum, __func__);
socklen_t type_len = sizeof (type);
if (!getsockopt (fd, level, SO_TYPE, &type, &type_len)) {
- if (type == SOCK_DGRAM)
+ if (type == SOCK_DGRAM || type == SOCK_STREAM)
setsockopt (fd, level, SO_REUSEPORT, tmp_val, optlen);
}
}
gboolean ok;
gpointer handle = GUINT_TO_POINTER (fd);
int ret;
-
- if (startup_count == 0) {
- WSASetLastError (WSANOTINITIALISED);
- return(SOCKET_ERROR);
- }
-
+
if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) {
WSASetLastError (WSAENOTSOCK);
return(SOCKET_ERROR);
ret = shutdown (fd, how);
if (ret == -1) {
gint errnum = errno;
- DEBUG ("%s: shutdown error: %s", __func__,
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: shutdown error: %s", __func__,
strerror (errno));
errnum = errno_to_WSA (errnum, __func__);
if (fd == -1) {
gint errnum = errno;
- DEBUG ("%s: socket error: %s", __func__, strerror (errno));
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: socket error: %s", __func__, strerror (errno));
errnum = errno_to_WSA (errnum, __func__);
WSASetLastError (errnum);
}
if (fd >= _wapi_fd_reserve) {
- DEBUG ("%s: File descriptor is too big (%d >= %d)",
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: File descriptor is too big (%d >= %d)",
__func__, fd, _wapi_fd_reserve);
WSASetLastError (WSASYSCALLFAILURE);
* https://bugzilla.novell.com/show_bug.cgi?id=MONO53992
*/
{
- int ret, true = 1;
+ int ret, true_ = 1;
- ret = setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &true,
- sizeof (true));
+ ret = setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &true_,
+ sizeof (true_));
if (ret == -1) {
int errnum = errno;
- DEBUG ("%s: Error setting SO_REUSEADDR", __func__);
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: Error setting SO_REUSEADDR", __func__);
errnum = errno_to_WSA (errnum, __func__);
WSASetLastError (errnum);
return(INVALID_SOCKET);
}
- DEBUG ("%s: returning socket handle %p", __func__, handle);
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: returning socket handle %p", __func__, handle);
return(fd);
}
if (newsock == -1) {
gint errnum = errno;
- DEBUG ("%s: socket error: %s", __func__, strerror (errno));
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: socket error: %s", __func__, strerror (errno));
errnum = errno_to_WSA (errnum, __func__);
WSASetLastError (errnum);
if (ret == -1) {
gint errnum = errno;
- DEBUG ("%s: dup2 error: %s", __func__, strerror (errno));
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: dup2 error: %s", __func__, strerror (errno));
errnum = errno_to_WSA (errnum, __func__);
WSASetLastError (errnum);
static gboolean wapi_disconnectex (guint32 fd, WapiOverlapped *overlapped,
guint32 flags, guint32 reserved)
{
- DEBUG ("%s: called on socket %d!", __func__, fd);
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: called on socket %d!", __func__, fd);
if (reserved != 0) {
WSASetLastError (WSAEINVAL);
{
gpointer sock = GUINT_TO_POINTER (socket);
gint ret;
-
- if (startup_count == 0) {
- WSASetLastError (WSANOTINITIALISED);
- return FALSE;
- }
-
+
if (_wapi_handle_type (sock) != WAPI_HANDLE_SOCKET) {
WSASetLastError (WSAENOTSOCK);
return FALSE;
int ret;
gchar *buffer = NULL;
- if (startup_count == 0) {
- WSASetLastError (WSANOTINITIALISED);
- return(SOCKET_ERROR);
- }
-
if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) {
WSASetLastError (WSAENOTSOCK);
return SOCKET_ERROR;
}
if (i_len > 0) {
- buffer = g_memdup (input, i_len);
+ buffer = (char *)g_memdup (input, i_len);
}
ret = ioctl (fd, command, buffer);
if (ret == -1) {
gint errnum = errno;
- DEBUG("%s: WSAIoctl error: %s", __func__,
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: WSAIoctl error: %s", __func__,
strerror (errno));
errnum = errno_to_WSA (errnum, __func__);
}
#ifndef PLATFORM_PORT_PROVIDES_IOCTLSOCKET
-int ioctlsocket(guint32 fd, gint32 command, gpointer arg)
+int ioctlsocket(guint32 fd, unsigned long command, gpointer arg)
{
gpointer handle = GUINT_TO_POINTER (fd);
int ret;
- if (startup_count == 0) {
- WSASetLastError (WSANOTINITIALISED);
- return(SOCKET_ERROR);
- }
-
if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) {
WSASetLastError (WSAENOTSOCK);
return(SOCKET_ERROR);
if (ret == -1) {
gint errnum = errno;
- DEBUG ("%s: ioctl error: %s", __func__, strerror (errno));
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: ioctl error: %s", __func__, strerror (errno));
errnum = errno_to_WSA (errnum, __func__);
WSASetLastError (errnum);
{
int ret, maxfd;
- if (startup_count == 0) {
- WSASetLastError (WSANOTINITIALISED);
- return(SOCKET_ERROR);
- }
-
for (maxfd = FD_SETSIZE-1; maxfd >= 0; maxfd--) {
if ((readfds && FD_ISSET (maxfd, readfds)) ||
(writefds && FD_ISSET (maxfd, writefds)) ||
if (ret == -1) {
gint errnum = errno;
- DEBUG ("%s: select error: %s", __func__, strerror (errno));
+ MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: select error: %s", __func__, strerror (errno));
errnum = errno_to_WSA (errnum, __func__);
WSASetLastError (errnum);