]> git.meshlink.io Git - catta/blobdiff - avahi-core/browse-dns-server.c
* split off lookup.h and publish.h from core.h
[catta] / avahi-core / browse-dns-server.c
index 912115028eb2c37c646223a9917519908dcc9976..675000bd7169d11af4c9b04907706fd6a5976fbf 100644 (file)
@@ -43,6 +43,7 @@ struct AvahiDNSServerInfo {
     AvahiRecord *srv_record;
     AvahiSHostNameResolver *host_name_resolver;
     AvahiAddress address;
+    AvahiLookupResultFlags flags;
     
     AVAHI_LLIST_FIELDS(AvahiDNSServerInfo, info);
 };
@@ -55,6 +56,7 @@ struct AvahiSDNSServerBrowser {
     AvahiSDNSServerBrowserCallback callback;
     void* userdata;
     AvahiProtocol aprotocol;
+    AvahiLookupFlags user_flags;
 
     unsigned n_info;
     
@@ -93,67 +95,157 @@ static void server_info_free(AvahiSDNSServerBrowser *b, AvahiDNSServerInfo *i) {
     avahi_free(i);
 }
 
-static void host_name_resolver_callback(AvahiSHostNameResolver *r, AvahiIfIndex interface, AvahiProtocol protocol, AvahiResolverEvent event, const char *host_name, const AvahiAddress *a, void* userdata) {
+static void host_name_resolver_callback(
+    AvahiSHostNameResolver *r,
+    AvahiIfIndex interface,
+    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);
 
-    if (event == AVAHI_RESOLVER_FOUND) {
-        i->address = *a;
-
-        i->browser->callback(i->browser, i->interface, i->protocol, AVAHI_BROWSER_NEW, i->srv_record->data.srv.name, &i->address, i->srv_record->data.srv.port, i->browser->userdata);
+    switch (event) {
+        case AVAHI_RESOLVER_FOUND: {
+            i->address = *a;
+            
+            i->browser->callback(
+                i->browser,
+                i->interface,
+                i->protocol,
+                AVAHI_BROWSER_NEW,
+                i->srv_record->data.srv.name,
+                &i->address,
+                i->srv_record->data.srv.port,
+                i->flags | flags,
+                i->browser->userdata);
+
+            break;
+        }
+
+        case AVAHI_RESOLVER_NOT_FOUND:
+        case AVAHI_RESOLVER_FAILURE:
+        case AVAHI_RESOLVER_TIMEOUT:
+            /* Ignore */
+            break;
     }
 
     avahi_s_host_name_resolver_free(i->host_name_resolver);
     i->host_name_resolver = NULL;
 }
 
-static void record_browser_callback(AvahiSRecordBrowser*rr, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, AvahiRecord *record, void* userdata) {
+static void record_browser_callback(
+    AvahiSRecordBrowser*rr,
+    AvahiIfIndex interface,
+    AvahiProtocol protocol,
+    AvahiBrowserEvent event,
+    AvahiRecord *record,
+    AvahiLookupResultFlags flags,
+    void* userdata) {
+    
     AvahiSDNSServerBrowser *b = userdata;
 
     assert(rr);
-    assert(record);
     assert(b);
 
-    assert(record->key->type == AVAHI_DNS_TYPE_SRV);
-
-    if (event == AVAHI_BROWSER_NEW) {
-        AvahiDNSServerInfo *i;
-
-        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;
-        i->srv_record = avahi_record_ref(record);
-        i->host_name_resolver = avahi_s_host_name_resolver_new(b->server, interface, protocol, record->data.srv.name, b->aprotocol, host_name_resolver_callback, i);
-        
-        AVAHI_LLIST_PREPEND(AvahiDNSServerInfo, info, b->info, i);
-
-        b->n_info++;
-    } else if (event == AVAHI_BROWSER_REMOVE) {
-        AvahiDNSServerInfo *i;
-
-        if (!(i = get_server_info(b, interface, protocol, record)))
-            return;
 
-        if (!i->host_name_resolver)
-            b->callback(b, interface, protocol, event, i->srv_record->data.srv.name, &i->address, i->srv_record->data.srv.port, b->userdata);
-
-        server_info_free(b, i);
+    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;
+            i->srv_record = avahi_record_ref(record);
+            i->host_name_resolver = avahi_s_host_name_resolver_new(
+                b->server,
+                interface, protocol,
+                record->data.srv.name,
+                b->aprotocol,
+                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,
+                    interface,
+                    protocol,
+                    event,
+                    i->srv_record->data.srv.name,
+                    &i->address,
+                    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:
+
+            b->callback(
+                b,
+                interface,
+                protocol,
+                event,
+                NULL,
+                NULL,
+                0,
+                flags,
+                b->userdata);
+            
+            break;
     }
 }
 
-AvahiSDNSServerBrowser *avahi_s_dns_server_browser_new(AvahiServer *server, AvahiIfIndex interface, AvahiProtocol protocol, const char *domain, AvahiDNSServerType type, AvahiProtocol aprotocol, AvahiSDNSServerBrowserCallback callback, void* userdata) {
+AvahiSDNSServerBrowser *avahi_s_dns_server_browser_new(
+    AvahiServer *server,
+    AvahiIfIndex interface,
+    AvahiProtocol protocol,
+    const char *domain,
+    AvahiDNSServerType type,
+    AvahiProtocol aprotocol,
+    AvahiLookupFlags flags,
+    AvahiSDNSServerBrowserCallback callback,
+    void* userdata) {
+    
     AvahiSDNSServerBrowser *b;
     AvahiKey *k;
     char *n = NULL;
@@ -166,18 +258,27 @@ AvahiSDNSServerBrowser *avahi_s_dns_server_browser_new(AvahiServer *server, Avah
         avahi_server_set_errno(server, AVAHI_ERR_INVALID_DOMAIN_NAME);
         return NULL;
     }
-    
+
+    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);
+        return NULL;
+    }
+
     if (!(b = avahi_new(AvahiSDNSServerBrowser, 1))) {
         avahi_server_set_errno(server, AVAHI_ERR_NO_MEMORY);
         return NULL;
     }
     
     b->server = server;
-    b->domain_name = avahi_normalize_name(domain ? domain : "local");
+    b->domain_name = avahi_normalize_name(domain);
     b->callback = callback;
     b->userdata = userdata;
     b->aprotocol = aprotocol;
     b->n_info = 0;
+    b->user_flags = flags;
 
     AVAHI_LLIST_HEAD_INIT(AvahiDNSServerInfo, b->info);
     AVAHI_LLIST_PREPEND(AvahiSDNSServerBrowser, browser, server->dns_server_browsers, b);
@@ -186,7 +287,7 @@ AvahiSDNSServerBrowser *avahi_s_dns_server_browser_new(AvahiServer *server, Avah
     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, record_browser_callback, b);
+    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) {