components/avahi/patches/12-browse.patch
changeset 5257 0da26ce015ab
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/avahi/patches/12-browse.patch	Tue Oct 27 07:12:09 2015 -0700
@@ -0,0 +1,159 @@
+Source: Desktop consolidation
+Upstream promotion status: unknown
+
+--- /usr/tmp/clean/avahi-0.6.28/avahi-core/browse.c	2010-08-26 01:51:38.983153000 +0100
++++ avahi-0.6.28/avahi-core/browse.c	2011-01-20 15:27:33.366236170 +0000
+@@ -22,6 +22,7 @@
+ #endif
+ 
+ #include <stdlib.h>
++#include <stdio.h>
+ 
+ #include <avahi-common/timeval.h>
+ #include <avahi-common/malloc.h>
+@@ -519,6 +520,91 @@
+     }
+ }
+ 
++#ifdef HAVE_BONJOUR
++static void resolve_socket_event(AvahiWatch *w, int fd, AvahiWatchEvent events,
++void *userdata) {
++    AvahiSRecordBrowser *b = userdata;
++    DNSServiceErrorType ret;
++    DNSServiceRef client;
++
++    assert(w);
++    assert(fd >= 0);
++    assert(events & AVAHI_WATCH_IN);
++
++    assert (fd == DNSServiceRefSockFD(b->client));
++
++    ret = DNSServiceProcessResult(b->client);
++    if (ret != kDNSServiceErr_NoError) {
++        if (b->watch) {
++            b->server->poll_api->watch_free(b->watch);
++            b->watch = NULL;
++        }
++        DNSServiceRefDeallocate(b->client);
++        b->client = NULL;
++        avahi_server_set_errno(b->server, AVAHI_ERR_DISCONNECTED);
++        b->callback(b, b->interface, b->protocol, AVAHI_BROWSER_FAILURE, NULL, 0, b->userdata);
++    }
++}
++
++static void resolve_error_callback(AvahiTimeEvent *e, void *userdata) {
++    AvahiSRecordBrowser *b = userdata;
++
++    if (b->defer_time_event) {
++        avahi_time_event_free(b->defer_time_event);
++        b->defer_time_event = NULL;
++    }
++    avahi_server_set_errno(b->server, AVAHI_ERR_FAILURE);
++    b->callback(
++        b, b->interface, b->protocol, AVAHI_BROWSER_FAILURE, NULL,
++        0,
++        b->userdata);
++}
++
++static void browse_reply(DNSServiceRef client, DNSServiceFlags flags, uint32_t ifIndex, DNSServiceErrorType errorCode,
++        const char *fullname, uint16_t rrtype, uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, void *context) {
++    AvahiSRecordBrowser *b = context;
++    AvahiRecord *rr;
++    AvahiKey *k;
++
++    k = avahi_key_new(fullname, rrclass, rrtype);
++    rr = avahi_record_new(k, ttl);
++    if (avahi_rdata_parse(rr, rdata, rdlen) != 0) {
++        printf("parse failed\n");
++        return;
++    }
++    b->callback(b, b->interface, b->protocol, AVAHI_BROWSER_NEW, rr, 0, b->userdata);
++    avahi_record_unref(rr);
++}
++
++static void avahi_browse_record_start(AvahiSRecordBrowser *b) {
++    DNSServiceErrorType ret;
++    DNSServiceFlags flags;
++
++    if (b->flags != AVAHI_LOOKUP_USE_WIDE_AREA)
++        flags = kDNSServiceFlagsForceMulticast;
++    else
++        flags = 0;
++
++    ret = DNSServiceQueryRecord(&b->client,
++                                0,
++                                b->interface == AVAHI_IF_UNSPEC ?
++                                    kDNSServiceInterfaceIndexAny :
++                                    b->interface,
++                                b->key->name,
++                                b->key->type,
++                                b->key->clazz,
++                                browse_reply,
++                                b);
++    if (ret != kDNSServiceErr_NoError || !b->client) {
++        b->defer_time_event = avahi_time_event_new(b->server->time_event_queue,
++NULL, resolve_error_callback, b);
++    } else {
++        b->defer_time_event = NULL;
++        b->watch = b->server->poll_api->watch_new(b->server->poll_api, DNSServiceRefSockFD(b->client), AVAHI_WATCH_IN, resolve_socket_event, b);
++    }
++}
++#endif
++
+ AvahiSRecordBrowser *avahi_s_record_browser_new(
+     AvahiServer *server,
+     AvahiIfIndex interface,
+@@ -560,9 +646,15 @@
+ 
+     AVAHI_LLIST_PREPEND(AvahiSRecordBrowser, browser, server->record_browsers, b);
+ 
++#ifdef HAVE_BONJOUR
++    b->watch = NULL;
++    b->client = NULL;
++    avahi_browse_record_start(b);
++#else
+     /* The currently cached entries are scanned a bit later, and than we will start querying, too */
+     b->defer_time_event = avahi_time_event_new(server->time_event_queue, NULL, defer_callback, b);
+     assert(b->defer_time_event);
++#endif
+ 
+     return b;
+ }
+@@ -575,6 +667,13 @@
+     b->server->need_browser_cleanup = 1;
+ 
+     browser_cancel(b);
++#ifdef HAVE_BONJOUR
++    if (b->watch)
++        b->server->poll_api->watch_free(b->watch);
++
++    if (b->client)
++        DNSServiceRefDeallocate(b->client);
++#endif
+ }
+ 
+ void avahi_s_record_browser_destroy(AvahiSRecordBrowser *b) {
+@@ -608,6 +707,8 @@
+ 
+     if (server->wide_area_lookup_engine)
+         avahi_wide_area_cleanup(server->wide_area_lookup_engine);
++#ifndef HAVE_BONJOUR
+     avahi_multicast_lookup_engine_cleanup(server->multicast_lookup_engine);
++#endif
+ }
+ 
+--- /usr/tmp/clean/avahi-0.6.28/avahi-core/browse.h	2010-08-26 01:51:38.983153000 +0100
++++ avahi-0.6.28/avahi-core/browse.h	2011-01-21 09:33:14.663164775 +0000
+@@ -50,6 +50,12 @@
+     unsigned n_lookups;
+ 
+     AvahiSRBLookup *root_lookup;
++
++#ifdef HAVE_BONJOUR
++    DNSServiceRef client;
++    AvahiWatch *watch;
++#endif
++
+ };
+ 
+ void avahi_browser_cleanup(AvahiServer *server);