X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-core%2Fbrowse.c;h=16d89548442ac1c3ed8f813f04170314718103c5;hb=81abdde5ccc144c160791bdfca1c9e2cadeef2e5;hp=f47418af2d76631c2e2a471f3f474a65aefc5676;hpb=424aefe8a431b79496672799dc4f4430fa935252;p=catta diff --git a/avahi-core/browse.c b/avahi-core/browse.c index f47418a..16d8954 100644 --- a/avahi-core/browse.c +++ b/avahi-core/browse.c @@ -35,8 +35,10 @@ #include "browse.h" #include "log.h" #include "querier.h" +#include "domain-util.h" +#include "rr-util.h" -#define AVAHI_MAX_LOOKUPS_PER_BROWSER 15 +#define AVAHI_LOOKUPS_PER_BROWSER_MAX 15 struct AvahiSRBLookup { AvahiSRecordBrowser *record_browser; @@ -79,7 +81,6 @@ static void transport_flags_from_domain(AvahiServer *s, AvahiLookupFlags *flags, *flags |= AVAHI_LOOKUP_USE_WIDE_AREA; } - static AvahiSRBLookup* lookup_new( AvahiSRecordBrowser *b, AvahiIfIndex interface, @@ -93,7 +94,7 @@ static AvahiSRBLookup* lookup_new( assert(AVAHI_IF_VALID(interface)); assert(AVAHI_PROTO_VALID(protocol)); - if (b->n_lookups >= AVAHI_MAX_LOOKUPS_PER_BROWSER) + if (b->n_lookups >= AVAHI_LOOKUPS_PER_BROWSER_MAX) /* We don't like cyclic CNAMEs */ return NULL; @@ -180,6 +181,20 @@ static AvahiSRBLookup *lookup_find( return NULL; } +static void browser_cancel(AvahiSRecordBrowser *b) { + assert(b); + + if (b->root_lookup) { + lookup_unref(b->root_lookup); + b->root_lookup = NULL; + } + + if (b->defer_time_event) { + avahi_time_event_free(b->defer_time_event); + b->defer_time_event = NULL; + } +} + static void lookup_wide_area_callback( AvahiWideAreaLookupEngine *e, AvahiBrowserEvent event, @@ -192,6 +207,7 @@ static void lookup_wide_area_callback( assert(e); assert(l); + assert(l->ref >= 1); b = l->record_browser; @@ -222,7 +238,6 @@ static void lookup_wide_area_callback( abort(); case AVAHI_BROWSER_ALL_FOR_NOW: - case AVAHI_BROWSER_NOT_FOUND: case AVAHI_BROWSER_FAILURE: b->callback(b, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, event, NULL, flags, b->userdata); @@ -265,8 +280,10 @@ static void lookup_multicast_callback( lookup_handle_cname(l, interface, protocol, b->flags, r); else { /* It's a normal record, so let's call the user callback */ - assert(avahi_key_equal(b->key, l->key)); + if (avahi_server_is_record_local(b->server, interface, protocol, r)) + flags |= AVAHI_LOOKUP_RESULT_LOCAL; + b->callback(b, interface, protocol, event, r, flags, b->userdata); } break; @@ -292,7 +309,6 @@ static void lookup_multicast_callback( break; case AVAHI_BROWSER_CACHE_EXHAUSTED: - case AVAHI_BROWSER_NOT_FOUND: case AVAHI_BROWSER_FAILURE: /* Not defined for multicast DNS */ abort(); @@ -406,11 +422,12 @@ static void lookup_handle_cname(AvahiSRBLookup *l, AvahiIfIndex interface, Avahi l->cname_lookups = avahi_rlist_prepend(l->cname_lookups, lookup_ref(n)); lookup_go(n); + lookup_unref(n); } static void lookup_drop_cname(AvahiSRBLookup *l, AvahiIfIndex interface, AvahiProtocol protocol, AvahiLookupFlags flags, AvahiRecord *r) { AvahiKey *k; - AvahiSRBLookup *n; + AvahiSRBLookup *n = NULL; AvahiRList *rl; assert(r->key->clazz == AVAHI_DNS_CLASS_IN); @@ -438,7 +455,7 @@ static void lookup_drop_cname(AvahiSRBLookup *l, AvahiIfIndex interface, AvahiPr } } -static void defer_callback(AvahiTimeEvent *e, void *userdata) { +static void defer_callback(AVAHI_GCC_UNUSED AvahiTimeEvent *e, void *userdata) { AvahiSRecordBrowser *b = userdata; int n; @@ -464,12 +481,14 @@ static void defer_callback(AvahiTimeEvent *e, void *userdata) { if (n < 0) { /* sending of the initial query failed */ + avahi_server_set_errno(b->server, AVAHI_ERR_FAILURE); + b->callback( b, b->interface, b->protocol, AVAHI_BROWSER_FAILURE, NULL, b->flags & AVAHI_LOOKUP_USE_WIDE_AREA ? AVAHI_LOOKUP_RESULT_WIDE_AREA : AVAHI_LOOKUP_RESULT_MULTICAST, b->userdata); - avahi_s_record_browser_cancel(b); + browser_cancel(b); return; } @@ -493,7 +512,7 @@ void avahi_s_record_browser_restart(AvahiSRecordBrowser *b) { assert(b); assert(!b->dead); - avahi_s_record_browser_cancel(b); + browser_cancel(b); /* Request a new iteration of the cache scanning */ if (!b->defer_time_event) { @@ -502,13 +521,6 @@ void avahi_s_record_browser_restart(AvahiSRecordBrowser *b) { } } -#define CHECK_VALIDITY_RETURN_NULL(server, expression, error) { \ - if (!(expression)) { \ - avahi_server_set_errno((server), (error)); \ - return NULL; \ - } \ -} - AvahiSRecordBrowser *avahi_s_record_browser_new( AvahiServer *server, AvahiIfIndex interface, @@ -524,11 +536,12 @@ AvahiSRecordBrowser *avahi_s_record_browser_new( assert(key); assert(callback); - CHECK_VALIDITY_RETURN_NULL(server, AVAHI_IF_VALID(interface), AVAHI_ERR_INVALID_INTERFACE); - CHECK_VALIDITY_RETURN_NULL(server, !avahi_key_is_pattern(key), AVAHI_ERR_IS_PATTERN); - CHECK_VALIDITY_RETURN_NULL(server, avahi_key_is_valid(key), AVAHI_ERR_INVALID_KEY); - CHECK_VALIDITY_RETURN_NULL(server, AVAHI_FLAGS_VALID(flags, AVAHI_LOOKUP_USE_WIDE_AREA|AVAHI_LOOKUP_USE_MULTICAST), AVAHI_ERR_INVALID_FLAGS); - CHECK_VALIDITY_RETURN_NULL(server, !(flags & AVAHI_LOOKUP_USE_WIDE_AREA) || !(flags & AVAHI_LOOKUP_USE_MULTICAST), AVAHI_ERR_INVALID_FLAGS); + 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_key_is_pattern(key), AVAHI_ERR_IS_PATTERN); + AVAHI_CHECK_VALIDITY_RETURN_NULL(server, avahi_key_is_valid(key), AVAHI_ERR_INVALID_KEY); + 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, !(flags & AVAHI_LOOKUP_USE_WIDE_AREA) || !(flags & AVAHI_LOOKUP_USE_MULTICAST), AVAHI_ERR_INVALID_FLAGS); if (!(b = avahi_new(AvahiSRecordBrowser, 1))) { avahi_server_set_errno(server, AVAHI_ERR_NO_MEMORY); @@ -543,7 +556,6 @@ AvahiSRecordBrowser *avahi_s_record_browser_new( b->flags = flags; b->callback = callback; b->userdata = userdata; - b->n_lookups = 0; AVAHI_LLIST_HEAD_INIT(AvahiSRBLookup, b->lookups); b->root_lookup = NULL; @@ -557,20 +569,6 @@ AvahiSRecordBrowser *avahi_s_record_browser_new( return b; } -void avahi_s_record_browser_cancel(AvahiSRecordBrowser *b) { - assert(b); - - if (b->root_lookup) { - lookup_unref(b->root_lookup); - b->root_lookup = NULL; - } - - if (b->defer_time_event) { - avahi_time_event_free(b->defer_time_event); - b->defer_time_event = NULL; - } -} - void avahi_s_record_browser_free(AvahiSRecordBrowser *b) { assert(b); assert(!b->dead); @@ -578,13 +576,13 @@ void avahi_s_record_browser_free(AvahiSRecordBrowser *b) { b->dead = 1; b->server->need_browser_cleanup = 1; - avahi_s_record_browser_cancel(b); + browser_cancel(b); } void avahi_s_record_browser_destroy(AvahiSRecordBrowser *b) { assert(b); - avahi_s_record_browser_cancel(b); + browser_cancel(b); AVAHI_LLIST_REMOVE(AvahiSRecordBrowser, browser, b->server->record_browsers, b);