--- /usr/tmp/clean/avahi-0.6.28/avahi-core/browse-domain.c	2010-08-26 01:51:38.982153000 +0100
+++ avahi-0.6.28/avahi-core/browse-domain.c	2011-01-20 15:24:22.639202717 +0000
@@ -26,6 +26,9 @@
 #include <avahi-common/domain.h>
 #include <avahi-common/malloc.h>
 #include <avahi-common/error.h>
+#ifdef HAVE_BONJOUR
+#include <avahi-common/timeval.h>
+#endif
 
 #include "browse.h"
 #include "log.h"
@@ -45,6 +48,14 @@
 
     int all_for_now_scheduled;
 
+#ifdef HAVE_BONJOUR
+    AvahiIfIndex interface;
+    AvahiTimeEvent *browse_error_event;
+    AvahiTimeEvent *all_for_now_event;
+    AvahiLookupFlags flags;
+    AvahiWatch *watch;
+    DNSServiceRef client;
+#endif
     AVAHI_LLIST_FIELDS(AvahiSDomainBrowser, browser);
 };
 
@@ -135,6 +146,122 @@
     avahi_s_domain_browser_free(b);
 }
 
+#ifdef HAVE_BONJOUR
+static void enumerate_reply(DNSServiceRef service,
+    DNSServiceFlags flags,
+    uint32_t IfIndex,
+    DNSServiceErrorType errorCode,
+    const char *replyDomain,
+    void *context) {
+    AvahiSDomainBrowser *b = context;
+    AvahiIfIndex interface;
+
+    if (flags & kDNSServiceFlagsDefault)
+        if (b->flags != AVAHI_DOMAIN_BROWSER_BROWSE_DEFAULT &&
+            b->flags != AVAHI_DOMAIN_BROWSER_REGISTER_DEFAULT)
+            return;
+
+    interface = (IfIndex == kDNSServiceInterfaceIndexAny) ? AVAHI_IF_UNSPEC : IfIndex; 
+
+    b->callback(b, interface, AVAHI_PROTO_UNSPEC, AVAHI_BROWSER_NEW, replyDomain, 0 /* flags */, b->userdata);
+}
+
+static void enumerate_error_callback(AvahiTimeEvent *e, void *userdata) {
+    AvahiSDomainBrowser *b = userdata;
+
+    if (b->browse_error_event) {
+        avahi_time_event_free(b->browse_error_event);
+        b->browse_error_event = NULL;
+    }
+    avahi_server_set_errno(b->server, AVAHI_ERR_FAILURE);
+    b->callback(b,
+        b->interface,
+        AVAHI_PROTO_UNSPEC,
+        AVAHI_BROWSER_FAILURE,
+        NULL,
+        0,
+        b->userdata);
+}
+
+static void all_for_now_callback(AvahiTimeEvent *e, void* userdata) {
+    AvahiSDomainBrowser *b = userdata;
+
+    assert(e);
+    assert(b);
+
+    avahi_time_event_free(b->all_for_now_event);
+    b->all_for_now_event = NULL;
+
+    b->callback(b,
+        AVAHI_IF_UNSPEC,
+        AVAHI_PROTO_UNSPEC,
+        AVAHI_BROWSER_ALL_FOR_NOW,
+        NULL,
+        0,
+        b->userdata);
+}
+
+static void enumerate_socket_event(AvahiWatch *w, int fd, AvahiWatchEvent events, void *userdata) {
+    AvahiSDomainBrowser *b = userdata;
+    DNSServiceErrorType ret;
+
+    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,
+            AVAHI_PROTO_UNSPEC,
+            AVAHI_BROWSER_FAILURE,
+            NULL,
+            0,
+            b->userdata);
+    }
+}
+
+static void avahi_browse_domains_start(AvahiSDomainBrowser *b) {
+    DNSServiceErrorType ret;
+    DNSServiceFlags flags;
+    struct timeval tv;
+
+    if (b->flags == AVAHI_DOMAIN_BROWSER_BROWSE ||
+        b->flags == AVAHI_DOMAIN_BROWSER_BROWSE_DEFAULT)
+        flags = kDNSServiceFlagsBrowseDomains;
+    else if (b->flags == AVAHI_DOMAIN_BROWSER_REGISTER ||
+        b->flags == AVAHI_DOMAIN_BROWSER_REGISTER_DEFAULT)
+        flags = kDNSServiceFlagsRegistrationDomains;
+     
+    ret =  DNSServiceEnumerateDomains(&b->client,
+                                      flags,
+                                      b->interface == AVAHI_IF_UNSPEC ?
+                                          kDNSServiceInterfaceIndexAny :
+                                          b->interface,
+                                      enumerate_reply,
+                                      b);
+    if (ret != kDNSServiceErr_NoError || !b->client) {
+        b->browse_error_event = avahi_time_event_new(b->server->time_event_queue,
+NULL, enumerate_error_callback, b);
+    } else {
+        b->watch = b->server->poll_api->watch_new(b->server->poll_api, DNSServiceRefSockFD(b->client), AVAHI_WATCH_IN, enumerate_socket_event, b);
+
+        /* Add a second */
+        gettimeofday(&tv, NULL);
+        avahi_timeval_add(&tv, 1000000);
+        b->all_for_now_event = avahi_time_event_new(b->server->time_event_queue, &tv, all_for_now_callback, b);
+    }
+}
+#endif
+
 AvahiSDomainBrowser *avahi_s_domain_browser_new(
     AvahiServer *server,
     AvahiIfIndex interface,
@@ -191,6 +318,15 @@
 
     AVAHI_LLIST_PREPEND(AvahiSDomainBrowser, browser, server->domain_browsers, b);
 
+#ifdef HAVE_BONJOUR
+    b->interface = interface;
+    b->client = NULL;
+    b->watch = NULL;
+    b->browse_error_event = NULL;
+    b->all_for_now_event = NULL;
+    b->flags = flags;
+    avahi_browse_domains_start(b);
+#else
     if (!(k = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_PTR))) {
         avahi_server_set_errno(server, AVAHI_ERR_NO_MEMORY);
         goto fail;
@@ -203,6 +339,7 @@
 
     if (type == AVAHI_DOMAIN_BROWSER_BROWSE && b->server->config.browse_domains)
         b->defer_event = avahi_time_event_new(server->time_event_queue, NULL, defer_callback, b);
+#endif
 
     return b;
 
@@ -225,6 +362,23 @@
 
     AVAHI_LLIST_REMOVE(AvahiSDomainBrowser, browser, b->server->domain_browsers, b);
 
+#ifdef HAVE_BONJOUR
+    if (b->browse_error_event) {
+        avahi_time_event_free(b->browse_error_event);
+        b->browse_error_event = NULL;
+    }
+    if (b->all_for_now_event) {
+        avahi_time_event_free(b->all_for_now_event);
+        b->all_for_now_event = NULL;
+    }
+
+    if (b->watch)
+        b->server->poll_api->watch_free(b->watch);
+
+    if (b->client)
+        DNSServiceRefDeallocate(b->client);
+#endif
+
     if (b->record_browser)
         avahi_s_record_browser_free(b->record_browser);
 
