#include <config.h>
#include <glib.h>
+#include <string.h>
#include "gsocketaddress.h"
#include "ginetaddress.h"
* sockaddr</type>, which can be passed to low-level functions like
* connect() or bind().
*
- * If not enough space is availible, a %G_IO_ERROR_NO_SPACE error is
+ * If not enough space is available, 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.
*
if (len < sizeof (*addr))
return NULL;
- iaddr = g_inet_address_new_from_bytes ((guint8 *) &(addr->sin6_addr), AF_INET6);
+ if (IN6_IS_ADDR_V4MAPPED (&(addr->sin6_addr)))
+ {
+ struct sockaddr_in sin_addr;
+
+ sin_addr.sin_family = AF_INET;
+ sin_addr.sin_port = addr->sin6_port;
+ memcpy (&(sin_addr.sin_addr.s_addr), addr->sin6_addr.s6_addr + 12, 4);
+ iaddr = g_inet_address_new_from_bytes ((guint8 *) &(sin_addr.sin_addr), AF_INET);
+ }
+ else
+ {
+ iaddr = g_inet_address_new_from_bytes ((guint8 *) &(addr->sin6_addr), AF_INET6);
+ }
+
sockaddr = g_inet_socket_address_new (iaddr, g_ntohs (addr->sin6_port));
g_object_unref (iaddr);
return sockaddr;
} GSocketAddressAddressEnumeratorClass;
+static GType _g_socket_address_address_enumerator_get_type (void);
G_DEFINE_TYPE (GSocketAddressAddressEnumerator, _g_socket_address_address_enumerator, G_TYPE_SOCKET_ADDRESS_ENUMERATOR)
static void