if (a->family != b->family)
return -1;
- return memcmp(a, b, flx_address_get_size(a));
+ return memcmp(a->data.data, b->data.data, flx_address_get_size(a));
}
gchar *flx_address_snprint(char *s, guint length, const flxAddress *a) {
g_assert(s);
g_assert(length);
g_assert(a);
- return (gchar*) inet_ntop(a->family, a->data, s, length);
+ return (gchar*) inet_ntop(a->family, a->data.data, s, length);
}
gchar* flx_reverse_lookup_name_ipv4(const flxIPv4Address *a) {
return reverse_lookup_name_ipv6(a, "ip6.int");
}
-flxAddress *flx_address_parse(const char *s, int family, flxAddress *ret_addr) {
+flxAddress *flx_address_parse(const char *s, guchar family, flxAddress *ret_addr) {
g_assert(ret_addr);
g_assert(s);
- if (inet_pton(family, s, ret_addr->data) < 0)
+ if (inet_pton(family, s, ret_addr->data.data) < 0)
return NULL;
ret_addr->family = family;
return ret_addr;
}
+
+flxAddress *flx_address_from_sockaddr(const struct sockaddr* sa, flxAddress *ret_addr) {
+ g_assert(sa);
+ g_assert(ret_addr);
+
+ g_assert(sa->sa_family == AF_INET || sa->sa_family == AF_INET6);
+
+ ret_addr->family = sa->sa_family;
+
+ if (sa->sa_family == AF_INET)
+ memcpy(&ret_addr->data.ipv4, &((struct sockaddr_in*) sa)->sin_addr, sizeof(ret_addr->data.ipv4));
+ else
+ memcpy(&ret_addr->data.ipv6, &((struct sockaddr_in6*) sa)->sin6_addr, sizeof(ret_addr->data.ipv6));
+
+ return ret_addr;
+}