From: Alexander Larsson Date: Mon, 18 May 2009 12:10:07 +0000 (+0200) Subject: Add GError to g_socket_address_to_native X-Git-Url: http://git.openbox.org/?a=commitdiff_plain;h=d8bdc3e5678498996efe618bec32b8ae43ca8b39;p=dana%2Fcg-glib.git 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. --- diff --git a/gio/ginetsocketaddress.c b/gio/ginetsocketaddress.c index cd07dc62..cdd375a9 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 ee442c69..7f656fe1 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 0fc09b00..a58ca03b 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 60e501d6..582dd1f4 100644 --- a/gio/gsocketaddress.c +++ b/gio/gsocketaddress.c @@ -161,24 +161,29 @@ g_socket_address_get_native_size (GSocketAddress *address) * struct sockaddr. * @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 struct * sockaddr, 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 1649ba6a..356e2b05 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 ebb93e79..6efa814b 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;