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.
#include "ginetsocketaddress.h"
#include "ginetaddress.h"
#include "gnetworkingprivate.h"
+#include "gioerror.h"
+#include "glibintl.h"
#include "gioalias.h"
static gboolean
g_inet_socket_address_to_native (GSocketAddress *address,
gpointer dest,
- gsize destlen)
+ gsize destlen,
+ GError **error)
{
GInetSocketAddress *addr;
GSocketFamily family;
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);
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;
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
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);
}
}
#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,
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)
{
{
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 */
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)
* <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);
}
/**
gboolean (*to_native) (GSocketAddress *address,
gpointer dest,
- gsize destlen);
+ gsize destlen,
+ GError **error);
};
GType g_socket_address_get_type (void) G_GNUC_CONST;
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);
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;