2 #include <sys/socket.h>
8 guint avahi_address_get_size(const AvahiAddress *a) {
11 if (a->family == AF_INET)
13 else if (a->family == AF_INET6)
19 gint avahi_address_cmp(const AvahiAddress *a, const AvahiAddress *b) {
23 if (a->family != b->family)
26 return memcmp(a->data.data, b->data.data, avahi_address_get_size(a));
29 gchar *avahi_address_snprint(char *s, guint length, const AvahiAddress *a) {
33 return (gchar*) inet_ntop(a->family, a->data.data, s, length);
36 gchar* avahi_reverse_lookup_name_ipv4(const AvahiIPv4Address *a) {
37 guint32 n = ntohl(a->address);
40 return g_strdup_printf("%u.%u.%u.%u.in-addr.arpa", n & 0xFF, (n >> 8) & 0xFF, (n >> 16) & 0xFF, n >> 24);
43 static gchar *reverse_lookup_name_ipv6(const AvahiIPv6Address *a, const gchar *suffix) {
45 return g_strdup_printf("%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%s",
81 gchar *avahi_reverse_lookup_name_ipv6_arpa(const AvahiIPv6Address *a) {
82 return reverse_lookup_name_ipv6(a, "ip6.arpa");
85 gchar *avahi_reverse_lookup_name_ipv6_int(const AvahiIPv6Address *a) {
86 return reverse_lookup_name_ipv6(a, "ip6.int");
89 AvahiAddress *avahi_address_parse(const char *s, guchar family, AvahiAddress *ret_addr) {
93 if (inet_pton(family, s, ret_addr->data.data) < 0)
96 ret_addr->family = family;
101 AvahiAddress *avahi_address_from_sockaddr(const struct sockaddr* sa, AvahiAddress *ret_addr) {
105 g_assert(sa->sa_family == AF_INET || sa->sa_family == AF_INET6);
107 ret_addr->family = sa->sa_family;
109 if (sa->sa_family == AF_INET)
110 memcpy(&ret_addr->data.ipv4, &((struct sockaddr_in*) sa)->sin_addr, sizeof(ret_addr->data.ipv4));
112 memcpy(&ret_addr->data.ipv6, &((struct sockaddr_in6*) sa)->sin6_addr, sizeof(ret_addr->data.ipv6));
117 guint16 avahi_port_from_sockaddr(const struct sockaddr* sa) {
120 g_assert(sa->sa_family == AF_INET || sa->sa_family == AF_INET6);
122 if (sa->sa_family == AF_INET)
123 return ntohs(((struct sockaddr_in*) sa)->sin_port);
125 return ntohs(((struct sockaddr_in6*) sa)->sin6_port);