[gnio] Support win32 specific socket errnos
- From: Alexander Larsson <alexl src gnome org>
- To: svn-commits-list gnome org
- Subject: [gnio] Support win32 specific socket errnos
- Date: Tue, 5 May 2009 04:41:30 -0400 (EDT)
commit 84eb61586b33e1a2c34e9074936ced35be2c6c28
Author: Alexander Larsson <alexl redhat com>
Date: Tue May 5 10:31:42 2009 +0200
Support win32 specific socket errnos
We need to do our own conversions to GIOErrors and we want to use
the win32 error messages.
---
gio/gsocket.c | 125 +++++++++++++++++++++++++++++++++++++++++----------------
1 files changed, 90 insertions(+), 35 deletions(-)
diff --git a/gio/gsocket.c b/gio/gsocket.c
index 3a8087b..39f06bc 100644
--- a/gio/gsocket.c
+++ b/gio/gsocket.c
@@ -90,6 +90,61 @@ get_socket_errno (void)
#endif
}
+static GIOErrorEnum
+socket_io_error_from_errno (int err)
+{
+#ifndef G_OS_WIN32
+ return g_io_error_from_errno (err);
+#else
+ switch (err)
+ {
+ case WSAEWOULDBLOCK:
+ return G_IO_ERROR_WOULD_BLOCK;
+ case WSAEACCES:
+ return G_IO_ERROR_PERMISSION_DENIED;
+ case WSA_INVALID_HANDLE:
+ case WSA_INVALID_PARAMETER:
+ case WSAEBADF:
+ case WSAENOTSOCK:
+ return G_IO_ERROR_INVALID_ARGUMENT;
+ case WSAEPROTONOSUPPORT:
+ return G_IO_ERROR_NOT_SUPPORTED;
+ case WSAECANCELLED:
+ return G_IO_ERROR_CANCELLED;
+ case WSAESOCKTNOSUPPORT:
+ case WSAEOPNOTSUPP:
+ case WSAEPFNOSUPPORT:
+ case WSAEAFNOSUPPORT:
+ return G_IO_ERROR_NOT_SUPPORTED;
+ default:
+ return G_IO_ERROR_FAILED;
+ }
+#endif
+}
+
+static const char *
+socket_strerror (int err)
+{
+#ifndef G_OS_WIN32
+ return g_strerror (err);
+#else
+ static GStaticPrivate msg_private = G_STATIC_PRIVATE_INIT;
+ char *buf, *msg;
+
+ buf = g_static_private_get (&msg_private);
+ if (!buf)
+ {
+ buf = g_new (gchar, 128);
+ g_static_private_set (&msg_private, buf, g_free);
+ }
+
+ msg = g_win32_error_message (err);
+ strncpy (buf, msg, 128);
+ g_free (msg);
+ return buf;
+#endif
+}
+
static gboolean
check_socket (GSocket *socket,
GError **error)
@@ -142,7 +197,7 @@ g_socket_details_from_fd (GSocket *socket)
case EBADF:
/* programmer error */
g_error ("creating GSocket from fd %d: %s\n",
- fd, g_strerror (errsv));
+ fd, socket_strerror (errsv));
default:
break;
}
@@ -249,9 +304,9 @@ g_socket_details_from_fd (GSocket *socket)
err:
g_set_error (&socket->priv->construct_error, G_IO_ERROR,
- g_io_error_from_errno (errsv),
+ socket_io_error_from_errno (errsv),
"creating GSocket from fd: %s",
- g_strerror (errsv));
+ socket_strerror (errsv));
}
static gint
@@ -313,8 +368,8 @@ g_socket_create_socket (GSocketFamily family,
{
int errsv = get_socket_errno ();
- g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errsv),
- "unable to create socket: %s", g_strerror (errsv));
+ g_set_error (error, G_IO_ERROR, socket_io_error_from_errno (errsv),
+ "unable to create socket: %s", socket_strerror (errsv));
}
return fd;
@@ -617,7 +672,7 @@ g_socket_set_blocking (GSocket *socket,
#ifndef G_OS_WIN32
if ((arg = fcntl (socket->priv->fd, F_GETFL, NULL)) < 0)
{
- g_warning ("Error getting socket status flags: %s", g_strerror (errno));
+ g_warning ("Error getting socket status flags: %s", socket_strerror (errno));
return; /* Don't change blocking */
}
@@ -631,7 +686,7 @@ g_socket_set_blocking (GSocket *socket,
#endif
{
int errsv = get_socket_errno ();
- g_warning ("Error setting socket status flags: %s", g_strerror (errsv));
+ g_warning ("Error setting socket status flags: %s", socket_strerror (errsv));
return; /* Don't change blocking */
}
@@ -664,7 +719,7 @@ g_socket_set_reuse_address (GSocket *socket,
(gpointer) &value, sizeof (value)) < 0)
{
int errsv = get_socket_errno ();
- g_warning ("error setting reuse address: %s", g_strerror (errsv));
+ g_warning ("error setting reuse address: %s", socket_strerror (errsv));
return;
}
@@ -697,7 +752,7 @@ g_socket_set_keepalive (GSocket *socket,
(gpointer) &value, sizeof (value)) < 0)
{
int errsv = get_socket_errno ();
- g_warning ("error setting keepalive: %s", g_strerror (errsv));
+ g_warning ("error setting keepalive: %s", socket_strerror (errsv));
return;
}
@@ -749,8 +804,8 @@ g_socket_get_local_address (GSocket *socket,
if (getsockname (socket->priv->fd, (struct sockaddr *) buffer, &len) < 0)
{
int errsv = get_socket_errno ();
- g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errsv),
- "could not get local address: %s", g_strerror (errsv));
+ g_set_error (error, G_IO_ERROR, socket_io_error_from_errno (errsv),
+ "could not get local address: %s", socket_strerror (errsv));
return NULL;
}
@@ -773,8 +828,8 @@ g_socket_get_remote_address (GSocket *socket,
if (getpeername (socket->priv->fd, (struct sockaddr *) buffer, &len) < 0)
{
int errsv = get_socket_errno ();
- g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errsv),
- "could not get remote address: %s", g_strerror (errsv));
+ g_set_error (error, G_IO_ERROR, socket_io_error_from_errno (errsv),
+ "could not get remote address: %s", socket_strerror (errsv));
return NULL;
}
@@ -818,8 +873,8 @@ g_socket_listen (GSocket *socket,
{
int errsv = get_socket_errno ();
- g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errsv),
- "could not listen: %s", g_strerror (errsv));
+ g_set_error (error, G_IO_ERROR, socket_io_error_from_errno (errsv),
+ "could not listen: %s", socket_strerror (errsv));
return FALSE;
}
@@ -847,8 +902,8 @@ g_socket_bind (GSocket *socket,
{
int errsv = get_socket_errno ();
g_set_error (error,
- G_IO_ERROR, g_io_error_from_errno (errsv),
- "error binding to address: %s", g_strerror (errsv));
+ G_IO_ERROR, socket_io_error_from_errno (errsv),
+ "error binding to address: %s", socket_strerror (errsv));
return FALSE;
}
@@ -879,8 +934,8 @@ g_socket_accept (GSocket *socket,
continue;
g_set_error (error, G_IO_ERROR,
- g_io_error_from_errno (errsv),
- "error accepting connection: %s", g_strerror (errsv));
+ socket_io_error_from_errno (errsv),
+ "error accepting connection: %s", socket_strerror (errsv));
return NULL;
}
break;
@@ -922,8 +977,8 @@ g_socket_connect (GSocket *socket,
"connection in progress");
else
g_set_error (error, G_IO_ERROR,
- g_io_error_from_errno (errsv),
- "error connecting: %s", g_strerror (errsv));
+ socket_io_error_from_errno (errsv),
+ "error connecting: %s", socket_strerror (errsv));
return FALSE;
}
@@ -958,8 +1013,8 @@ g_socket_receive (GSocket *socket,
continue;
g_set_error (error, G_IO_ERROR,
- g_io_error_from_errno (errsv),
- "error receiving data: %s", g_strerror (errsv));
+ socket_io_error_from_errno (errsv),
+ "error receiving data: %s", socket_strerror (errsv));
return -1;
}
break;
@@ -991,8 +1046,8 @@ g_socket_send (GSocket *socket,
continue;
g_set_error (error, G_IO_ERROR,
- g_io_error_from_errno (errsv),
- "error sending data: %s", g_strerror (errsv));
+ socket_io_error_from_errno (errsv),
+ "error sending data: %s", socket_strerror (errsv));
return -1;
}
break;
@@ -1030,9 +1085,9 @@ g_socket_close (GSocket *socket,
continue;
g_set_error (error, G_IO_ERROR,
- g_io_error_from_errno (errsv),
+ socket_io_error_from_errno (errsv),
"Error closing sockete: %s",
- g_strerror (errsv));
+ socket_strerror (errsv));
}
break;
}
@@ -1256,8 +1311,8 @@ g_socket_send_message (GSocket *socket,
continue;
g_set_error (error, G_IO_ERROR,
- g_io_error_from_errno (errsv),
- "sendmsg: %s", g_strerror (errsv));
+ socket_io_error_from_errno (errsv),
+ "sendmsg: %s", socket_strerror (errsv));
return -1;
}
@@ -1323,8 +1378,8 @@ g_socket_send_message (GSocket *socket,
continue;
g_set_error (error, G_IO_ERROR,
- g_io_error_from_errno (errsv),
- "WSASendTo: %s", g_strerror (errsv));
+ socket_io_error_from_errno (errsv),
+ "WSASendTo: %s", socket_strerror (errsv));
return -1;
}
@@ -1486,8 +1541,8 @@ g_socket_receive_message (GSocket *socket,
continue;
g_set_error (error, G_IO_ERROR,
- g_io_error_from_errno (errsv),
- "recvmsg: %s", g_strerror (errsv));
+ socket_io_error_from_errno (errsv),
+ "recvmsg: %s", socket_strerror (errsv));
return -1;
}
@@ -1611,8 +1666,8 @@ g_socket_receive_message (GSocket *socket,
continue;
g_set_error (error, G_IO_ERROR,
- g_io_error_from_errno (errsv),
- "WSARecvFrom: %s", g_strerror (errsv));
+ socket_io_error_from_errno (errsv),
+ "WSARecvFrom: %s", socket_strerror (errsv));
return -1;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]