[glib] Add GError to g_socket_address_to_native



commit d8bdc3e5678498996efe618bec32b8ae43ca8b39
Author: Alexander Larsson <alexl redhat com>
Date:   Mon May 18 14:10:07 2009 +0200

    Add GError to g_socket_address_to_native
    
    This is nice for some callers so they can report an error.
    It is also required to support opional address types like
    abstract paths for unix domain sockets.
---
 gio/ginetsocketaddress.c |   23 +++++++++++++++++++----
 gio/gresolver.c          |    2 +-
 gio/gsocket.c            |   11 +++++++----
 gio/gsocketaddress.c     |   13 +++++++++----
 gio/gsocketaddress.h     |    6 ++++--
 gio/gunixsocketaddress.c |    9 +++++++--
 6 files changed, 47 insertions(+), 17 deletions(-)

diff --git a/gio/ginetsocketaddress.c b/gio/ginetsocketaddress.c
index cd07dc6..cdd375a 100644
--- a/gio/ginetsocketaddress.c
+++ b/gio/ginetsocketaddress.c
@@ -28,6 +28,8 @@
 #include "ginetsocketaddress.h"
 #include "ginetaddress.h"
 #include "gnetworkingprivate.h"
+#include "gioerror.h"
+#include "glibintl.h"
 
 #include "gioalias.h"
 
@@ -159,7 +161,8 @@ g_inet_socket_address_get_native_size (GSocketAddress *address)
 static gboolean
 g_inet_socket_address_to_native (GSocketAddress *address,
                                  gpointer        dest,
-				 gsize           destlen)
+				 gsize           destlen,
+				 GError        **error)
 {
   GInetSocketAddress *addr;
   GSocketFamily family;
@@ -174,7 +177,11 @@ g_inet_socket_address_to_native (GSocketAddress *address,
       struct sockaddr_in *sock = (struct sockaddr_in *) dest;
 
       if (destlen < sizeof (*sock))
-	return FALSE;
+	{
+	  g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NO_SPACE,
+			       _("Not enough space for socket address"));
+	  return FALSE;
+	}
 
       sock->sin_family = AF_INET;
       sock->sin_port = g_htons (addr->priv->port);
@@ -187,7 +194,11 @@ g_inet_socket_address_to_native (GSocketAddress *address,
       struct sockaddr_in6 *sock = (struct sockaddr_in6 *) dest;
 
       if (destlen < sizeof (*sock))
-	return FALSE;
+	{
+	  g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NO_SPACE,
+			       _("Not enough space for socket address"));
+	  return FALSE;
+	}
 
       memset (sock, 0, sizeof (sock));
       sock->sin6_family = AF_INET6;
@@ -196,7 +207,11 @@ g_inet_socket_address_to_native (GSocketAddress *address,
       return TRUE;
     }
   else
-    return FALSE;
+    {
+      g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
+			   _("Unsupported socket address"));
+      return FALSE;
+    }
 }
 
 static void
diff --git a/gio/gresolver.c b/gio/gresolver.c
index ee442c6..7f656fe 100644
--- a/gio/gresolver.c
+++ b/gio/gresolver.c
@@ -697,7 +697,7 @@ _g_resolver_address_to_sockaddr (GInetAddress            *address,
   GSocketAddress *sockaddr;
 
   sockaddr = g_inet_socket_address_new (address, 0);
-  g_socket_address_to_native (sockaddr, (struct sockaddr *)sa, sizeof (*sa));
+  g_socket_address_to_native (sockaddr, (struct sockaddr *)sa, sizeof (*sa), NULL);
   *sa_len = g_socket_address_get_native_size (sockaddr);
   g_object_unref (sockaddr);
 }
diff --git a/gio/gsocket.c b/gio/gsocket.c
index 0fc09b0..a58ca03 100644
--- a/gio/gsocket.c
+++ b/gio/gsocket.c
@@ -1353,7 +1353,7 @@ g_socket_bind (GSocket         *socket,
     }
 #endif
 
-  if (!g_socket_address_to_native (address, addr, sizeof addr))
+  if (!g_socket_address_to_native (address, addr, sizeof addr, error))
     return FALSE;
 
   if (bind (socket->priv->fd, (struct sockaddr *) addr,
@@ -1518,7 +1518,8 @@ g_socket_connect (GSocket         *socket,
   if (!check_socket (socket, error))
     return FALSE;
 
-  g_socket_address_to_native (address, buffer, sizeof buffer);
+  if (!g_socket_address_to_native (address, buffer, sizeof buffer, error))
+    return FALSE;
 
   while (1)
     {
@@ -2546,7 +2547,8 @@ g_socket_send_message (GSocket                *socket,
       {
 	msg.msg_namelen = g_socket_address_get_native_size (address);
 	msg.msg_name = g_alloca (msg.msg_namelen);
-	g_socket_address_to_native (address, msg.msg_name, msg.msg_namelen);
+	if (!g_socket_address_to_native (address, msg.msg_name, msg.msg_namelen, error))
+	  return -1;
       }
 
     /* iov */
@@ -2666,7 +2668,8 @@ g_socket_send_message (GSocket                *socket,
     if (address)
       {
 	addrlen = g_socket_address_get_native_size (address);
-	g_socket_address_to_native (address, &addr, sizeof addr);
+	if (!g_socket_address_to_native (address, &addr, sizeof addr, error))
+	  return -1;
       }
 
     while (1)
diff --git a/gio/gsocketaddress.c b/gio/gsocketaddress.c
index 60e501d..582dd1f 100644
--- a/gio/gsocketaddress.c
+++ b/gio/gsocketaddress.c
@@ -161,24 +161,29 @@ g_socket_address_get_native_size (GSocketAddress *address)
  * <type>struct sockaddr</type>.
  * @destlen: the size of @dest. Must be at least as large as
  * g_socket_address_get_native_size().
+ * @error: #GError for error reporting, or %NULL to ignore.
  *
  * Converts a #GSocketAddress to a native <type>struct
  * sockaddr</type>, which can be passed to low-level functions like
  * connect() or bind().
  *
- * Returns: %TRUE if @dest was filled in, %FALSE if @address is invalid
- * or @destlen is too small.
+ * If not enough space is availible, a %G_IO_ERROR_NO_SPACE error is
+ * returned. If the address type is not known on the system
+ * then a %G_IO_ERROR_NOT_SUPPORTED error is returned.
+ *
+ * Returns: %TRUE if @dest was filled in, %FALSE on error
  *
  * Since: 2.22
  */
 gboolean
 g_socket_address_to_native (GSocketAddress *address,
 			    gpointer        dest,
-			    gsize           destlen)
+			    gsize           destlen,
+			    GError        **error)
 {
   g_return_val_if_fail (G_IS_SOCKET_ADDRESS (address), FALSE);
 
-  return G_SOCKET_ADDRESS_GET_CLASS (address)->to_native (address, dest, destlen);
+  return G_SOCKET_ADDRESS_GET_CLASS (address)->to_native (address, dest, destlen, error);
 }
 
 /**
diff --git a/gio/gsocketaddress.h b/gio/gsocketaddress.h
index 1649ba6..356e2b0 100644
--- a/gio/gsocketaddress.h
+++ b/gio/gsocketaddress.h
@@ -56,7 +56,8 @@ struct _GSocketAddressClass
 
   gboolean       (*to_native)       (GSocketAddress *address,
                                      gpointer        dest,
-                                     gsize           destlen);
+                                     gsize           destlen,
+				     GError        **error);
 };
 
 GType                 g_socket_address_get_type        (void) G_GNUC_CONST;
@@ -68,7 +69,8 @@ GSocketAddress *      g_socket_address_new_from_native (gpointer        native,
 
 gboolean              g_socket_address_to_native       (GSocketAddress *address,
                                                         gpointer        dest,
-                                                        gsize           destlen);
+                                                        gsize           destlen,
+							GError        **error);
 
 gssize                g_socket_address_get_native_size (GSocketAddress *address);
 
diff --git a/gio/gunixsocketaddress.c b/gio/gunixsocketaddress.c
index ebb93e7..6efa814 100644
--- a/gio/gunixsocketaddress.c
+++ b/gio/gunixsocketaddress.c
@@ -133,13 +133,18 @@ g_unix_socket_address_get_native_size (GSocketAddress *address)
 static gboolean
 g_unix_socket_address_to_native (GSocketAddress *address,
 				 gpointer        dest,
-				 gsize           destlen)
+				 gsize           destlen,
+				 GError        **error)
 {
   GUnixSocketAddress *addr = G_UNIX_SOCKET_ADDRESS (address);
   struct sockaddr_un *sock;
 
   if (destlen < sizeof (*sock))
-    return FALSE;
+    {
+      g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NO_SPACE,
+			   _("Not enough space for socket address"));
+      return FALSE;
+    }
 
   sock = (struct sockaddr_un *) dest;
   sock->sun_family = AF_UNIX;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]