]> git.meshlink.io Git - catta/blobdiff - avahi-core/browse-dns-server.c
forgot to pull the publish_no_reverse change to the example.
[catta] / avahi-core / browse-dns-server.c
index 675000bd7169d11af4c9b04907706fd6a5976fbf..a51c38fc038f765b379a75bbe3f8d0224904629d 100644 (file)
@@ -1,18 +1,16 @@
-/* $Id$ */
-
 /***
   This file is part of avahi.
+
   avahi is free software; you can redistribute it and/or modify it
   under the terms of the GNU Lesser General Public License as
   published by the Free Software Foundation; either version 2.1 of the
   License, or (at your option) any later version.
+
   avahi is distributed in the hope that it will be useful, but WITHOUT
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
   or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
   Public License for more details.
+
   You should have received a copy of the GNU Lesser General Public
   License along with avahi; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
@@ -44,14 +42,13 @@ struct AvahiDNSServerInfo {
     AvahiSHostNameResolver *host_name_resolver;
     AvahiAddress address;
     AvahiLookupResultFlags flags;
-    
+
     AVAHI_LLIST_FIELDS(AvahiDNSServerInfo, info);
 };
 
 struct AvahiSDNSServerBrowser {
     AvahiServer *server;
-    char *domain_name;
-    
+
     AvahiSRecordBrowser *record_browser;
     AvahiSDNSServerBrowserCallback callback;
     void* userdata;
@@ -59,14 +56,14 @@ struct AvahiSDNSServerBrowser {
     AvahiLookupFlags user_flags;
 
     unsigned n_info;
-    
+
     AVAHI_LLIST_FIELDS(AvahiSDNSServerBrowser, browser);
     AVAHI_LLIST_HEAD(AvahiDNSServerInfo, info);
 };
 
 static AvahiDNSServerInfo* get_server_info(AvahiSDNSServerBrowser *b, AvahiIfIndex interface, AvahiProtocol protocol, AvahiRecord *r) {
     AvahiDNSServerInfo *i;
-    
+
     assert(b);
     assert(r);
 
@@ -86,27 +83,27 @@ static void server_info_free(AvahiSDNSServerBrowser *b, AvahiDNSServerInfo *i) {
     avahi_record_unref(i->srv_record);
     if (i->host_name_resolver)
         avahi_s_host_name_resolver_free(i->host_name_resolver);
-    
+
     AVAHI_LLIST_REMOVE(AvahiDNSServerInfo, info, b->info, i);
 
     assert(b->n_info >= 1);
     b->n_info--;
-    
+
     avahi_free(i);
 }
 
 static void host_name_resolver_callback(
     AvahiSHostNameResolver *r,
-    AvahiIfIndex interface,
-    AvahiProtocol protocol,
+    AVAHI_GCC_UNUSED AvahiIfIndex interface,
+    AVAHI_GCC_UNUSED AvahiProtocol protocol,
     AvahiResolverEvent event,
     const char *host_name,
     const AvahiAddress *a,
     AvahiLookupResultFlags flags,
     void* userdata) {
-    
+
     AvahiDNSServerInfo *i = userdata;
-    
+
     assert(r);
     assert(host_name);
     assert(i);
@@ -114,7 +111,7 @@ static void host_name_resolver_callback(
     switch (event) {
         case AVAHI_RESOLVER_FOUND: {
             i->address = *a;
-            
+
             i->browser->callback(
                 i->browser,
                 i->interface,
@@ -129,9 +126,7 @@ static void host_name_resolver_callback(
             break;
         }
 
-        case AVAHI_RESOLVER_NOT_FOUND:
         case AVAHI_RESOLVER_FAILURE:
-        case AVAHI_RESOLVER_TIMEOUT:
             /* Ignore */
             break;
     }
@@ -148,29 +143,31 @@ static void record_browser_callback(
     AvahiRecord *record,
     AvahiLookupResultFlags flags,
     void* userdata) {
-    
+
     AvahiSDNSServerBrowser *b = userdata;
 
     assert(rr);
     assert(b);
 
+    /* Filter flags */
+    flags &= AVAHI_LOOKUP_RESULT_CACHED | AVAHI_LOOKUP_RESULT_MULTICAST | AVAHI_LOOKUP_RESULT_WIDE_AREA;
 
     switch (event) {
         case AVAHI_BROWSER_NEW: {
             AvahiDNSServerInfo *i;
-            
+
             assert(record);
             assert(record->key->type == AVAHI_DNS_TYPE_SRV);
 
             if (get_server_info(b, interface, protocol, record))
                 return;
-            
+
             if (b->n_info >= 10)
                 return;
-            
+
             if (!(i = avahi_new(AvahiDNSServerInfo, 1)))
                 return; /* OOM */
-            
+
             i->browser = b;
             i->interface = interface;
             i->protocol = protocol;
@@ -183,22 +180,22 @@ static void record_browser_callback(
                 b->user_flags,
                 host_name_resolver_callback, i);
             i->flags = flags;
-            
+
             AVAHI_LLIST_PREPEND(AvahiDNSServerInfo, info, b->info, i);
-            
+
             b->n_info++;
             break;
         }
 
         case AVAHI_BROWSER_REMOVE: {
             AvahiDNSServerInfo *i;
-            
+
             assert(record);
             assert(record->key->type == AVAHI_DNS_TYPE_SRV);
 
             if (!(i = get_server_info(b, interface, protocol, record)))
                 return;
-            
+
             if (!i->host_name_resolver)
                 b->callback(
                     b,
@@ -210,13 +207,12 @@ static void record_browser_callback(
                     i->srv_record->data.srv.port,
                     i->flags | flags,
                     b->userdata);
-            
+
             server_info_free(b, i);
             break;
         }
 
         case AVAHI_BROWSER_FAILURE:
-        case AVAHI_BROWSER_NOT_FOUND:
         case AVAHI_BROWSER_ALL_FOR_NOW:
         case AVAHI_BROWSER_CACHE_EXHAUSTED:
 
@@ -230,7 +226,7 @@ static void record_browser_callback(
                 0,
                 flags,
                 b->userdata);
-            
+
             break;
     }
 }
@@ -245,25 +241,32 @@ AvahiSDNSServerBrowser *avahi_s_dns_server_browser_new(
     AvahiLookupFlags flags,
     AvahiSDNSServerBrowserCallback callback,
     void* userdata) {
-    
+
+    static const char * const type_table[AVAHI_DNS_SERVER_MAX] = {
+        "_domain._udp",
+        "_dns-update._udp"
+    };
+
     AvahiSDNSServerBrowser *b;
-    AvahiKey *k;
-    char *n = NULL;
-    
+    AvahiKey *k = NULL;
+    char n[AVAHI_DOMAIN_NAME_MAX];
+    int r;
+
     assert(server);
     assert(callback);
-    assert(type == AVAHI_DNS_SERVER_RESOLVE || type == AVAHI_DNS_SERVER_UPDATE);
 
-    if (domain && !avahi_is_valid_domain_name(domain)) {
-        avahi_server_set_errno(server, AVAHI_ERR_INVALID_DOMAIN_NAME);
-        return NULL;
-    }
+    AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_IF_VALID(interface), AVAHI_ERR_INVALID_INTERFACE);
+    AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_PROTO_VALID(protocol), AVAHI_ERR_INVALID_PROTOCOL);
+    AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_PROTO_VALID(aprotocol), AVAHI_ERR_INVALID_PROTOCOL);
+    AVAHI_CHECK_VALIDITY_RETURN_NULL(server, !domain || avahi_is_valid_domain_name(domain), AVAHI_ERR_INVALID_DOMAIN_NAME);
+    AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_FLAGS_VALID(flags, AVAHI_LOOKUP_USE_WIDE_AREA|AVAHI_LOOKUP_USE_MULTICAST), AVAHI_ERR_INVALID_FLAGS);
+    AVAHI_CHECK_VALIDITY_RETURN_NULL(server, type < AVAHI_DNS_SERVER_MAX, AVAHI_ERR_INVALID_FLAGS);
 
     if (!domain)
         domain = server->domain_name;
 
-    if (!AVAHI_VALID_FLAGS(flags, AVAHI_LOOKUP_USE_WIDE_AREA|AVAHI_LOOKUP_USE_MULTICAST)) {
-        avahi_server_set_errno(server, AVAHI_ERR_INVALID_FLAGS);
+    if ((r = avahi_service_name_join(n, sizeof(n), NULL, type_table[type], domain)) < 0) {
+        avahi_server_set_errno(server, r);
         return NULL;
     }
 
@@ -271,9 +274,8 @@ AvahiSDNSServerBrowser *avahi_s_dns_server_browser_new(
         avahi_server_set_errno(server, AVAHI_ERR_NO_MEMORY);
         return NULL;
     }
-    
+
     b->server = server;
-    b->domain_name = avahi_normalize_name(domain);
     b->callback = callback;
     b->userdata = userdata;
     b->aprotocol = aprotocol;
@@ -282,20 +284,26 @@ AvahiSDNSServerBrowser *avahi_s_dns_server_browser_new(
 
     AVAHI_LLIST_HEAD_INIT(AvahiDNSServerInfo, b->info);
     AVAHI_LLIST_PREPEND(AvahiSDNSServerBrowser, browser, server->dns_server_browsers, b);
-    
-    n = avahi_strdup_printf("%s.%s",type == AVAHI_DNS_SERVER_RESOLVE ? "_domain._udp" : "_dns-update._udp", b->domain_name);
-    k = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_SRV);
-    avahi_free(n);
-    
-    b->record_browser = avahi_s_record_browser_new(server, interface, protocol, k, flags, record_browser_callback, b);
-    avahi_key_unref(k);
 
-    if (!b->record_browser) {
-        avahi_s_dns_server_browser_free(b);
-        return NULL;
+    if (!(k = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_SRV))) {
+        avahi_server_set_errno(server, AVAHI_ERR_NO_MEMORY);
+        goto fail;
     }
-    
+
+    if (!(b->record_browser = avahi_s_record_browser_new(server, interface, protocol, k, flags, record_browser_callback, b)))
+        goto fail;
+
+    avahi_key_unref(k);
+
     return b;
+
+fail:
+
+    if (k)
+        avahi_key_unref(k);
+
+    avahi_s_dns_server_browser_free(b);
+    return NULL;
 }
 
 void avahi_s_dns_server_browser_free(AvahiSDNSServerBrowser *b) {
@@ -303,12 +311,12 @@ void avahi_s_dns_server_browser_free(AvahiSDNSServerBrowser *b) {
 
     while (b->info)
         server_info_free(b, b->info);
-    
+
     AVAHI_LLIST_REMOVE(AvahiSDNSServerBrowser, browser, b->server->dns_server_browsers, b);
 
     if (b->record_browser)
         avahi_s_record_browser_free(b->record_browser);
-    avahi_free(b->domain_name);
+
     avahi_free(b);
 }