]> git.meshlink.io Git - catta/blobdiff - avahi-common/address.c
* Add DomainBrowser support to C client API
[catta] / avahi-common / address.c
index 34847070aa30e7ff4ba79c9c63eed5a4b9722873..8f1848eade5b9372c232847aa07f6a3c1f4d6173 100644 (file)
@@ -33,9 +33,9 @@
 guint avahi_address_get_size(const AvahiAddress *a) {
     g_assert(a);
 
-    if (a->family == AF_INET)
+    if (a->family == AVAHI_PROTO_INET)
         return 4;
-    else if (a->family == AF_INET6)
+    else if (a->family == AVAHI_PROTO_INET6)
         return 16;
 
     return 0;
@@ -111,14 +111,24 @@ gchar *avahi_reverse_lookup_name_ipv6_int(const AvahiIPv6Address *a) {
     return reverse_lookup_name_ipv6(a, "ip6.int");
 }
 
-AvahiAddress *avahi_address_parse(const char *s, guchar family, AvahiAddress *ret_addr) {
+AvahiAddress *avahi_address_parse(const gchar *s, AvahiProtocol family, AvahiAddress *ret_addr) {
     g_assert(ret_addr);
     g_assert(s);
 
-    if (inet_pton(family, s, ret_addr->data.data) < 0)
-        return NULL;
-
-    ret_addr->family = family;
+    if (family == AVAHI_PROTO_UNSPEC) {
+        if (inet_pton(AF_INET, s, ret_addr->data.data) <= 0) {
+            if (inet_pton(AF_INET6, s, ret_addr->data.data) <= 0)
+                return NULL;
+            else
+                ret_addr->family = AVAHI_PROTO_INET6;
+        } else
+            ret_addr->family = AVAHI_PROTO_INET;
+    } else {
+        if (inet_pton(family, s, ret_addr->data.data) <= 0)
+            return NULL;
+        
+        ret_addr->family = family;
+    }
     
     return ret_addr;
 }
@@ -132,9 +142,9 @@ AvahiAddress *avahi_address_from_sockaddr(const struct sockaddr* sa, AvahiAddres
     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));
+        memcpy(&ret_addr->data.ipv4, &((const 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));
+        memcpy(&ret_addr->data.ipv6, &((const struct sockaddr_in6*) sa)->sin6_addr, sizeof(ret_addr->data.ipv6));
 
     return ret_addr;
 }
@@ -145,9 +155,9 @@ guint16 avahi_port_from_sockaddr(const struct sockaddr* sa) {
     g_assert(sa->sa_family == AF_INET || sa->sa_family == AF_INET6);
 
     if (sa->sa_family == AF_INET)
-        return ntohs(((struct sockaddr_in*) sa)->sin_port);
+        return ntohs(((const struct sockaddr_in*) sa)->sin_port);
     else
-        return ntohs(((struct sockaddr_in6*) sa)->sin6_port);
+        return ntohs(((const struct sockaddr_in6*) sa)->sin6_port);
 }
 
 gboolean avahi_address_is_ipv4_in_ipv6(const AvahiAddress *a) {
@@ -158,7 +168,7 @@ gboolean avahi_address_is_ipv4_in_ipv6(const AvahiAddress *a) {
     
     g_assert(a);
 
-    if (a->family != AF_INET6)
+    if (a->family != AVAHI_PROTO_INET6)
         return FALSE;
 
     return memcmp(a->data.ipv6.address, ipv4_in_ipv6, sizeof(ipv4_in_ipv6)) == 0;