[gnio] Support win32 specific socket errnos



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]