+static void domain_browser_callback(
+ AvahiDomainBrowser *b,
+ AVAHI_GCC_UNUSED AvahiIfIndex interface,
+ AVAHI_GCC_UNUSED AvahiProtocol protocol,
+ AvahiBrowserEvent event,
+ const char *domain,
+ AVAHI_GCC_UNUSED AvahiLookupResultFlags flags,
+ void *userdata) {
+
+ Config *c = userdata;
+
+ assert(b);
+ assert(c);
+
+ switch (event) {
+
+ case AVAHI_BROWSER_NEW:
+ case AVAHI_BROWSER_REMOVE: {
+ char ifname[IF_NAMESIZE];
+
+ printf("%c %4s %4s %s\n",
+ event == AVAHI_BROWSER_NEW ? '+' : '-',
+ interface != AVAHI_IF_UNSPEC ? if_indextoname(interface, ifname) : "n/a",
+ protocol != AVAHI_PROTO_UNSPEC ? avahi_proto_to_string(protocol) : "n/a",
+ domain);
+ break;
+ }
+
+ case AVAHI_BROWSER_FAILURE:
+ fprintf(stderr, "domain_browser failed: %s\n", avahi_strerror(avahi_client_errno(client)));
+ avahi_simple_poll_quit(simple_poll);
+ break;
+
+ case AVAHI_BROWSER_CACHE_EXHAUSTED:
+ n_cache_exhausted --;
+ check_terminate(c);
+ break;
+
+ case AVAHI_BROWSER_ALL_FOR_NOW:
+ n_all_for_now --;
+ check_terminate(c);
+ break;
+ }
+}
+
+static void browse_domains(Config *c) {
+ AvahiDomainBrowser *b;
+
+ assert(c);
+
+ if (!(b = avahi_domain_browser_new(
+ client,
+ AVAHI_IF_UNSPEC,
+ AVAHI_PROTO_UNSPEC,
+ c->domain,
+ AVAHI_DOMAIN_BROWSER_BROWSE,
+ 0,
+ domain_browser_callback,
+ c))) {
+
+ fprintf(stderr, "avahi_domain_browser_new() failed: %s\n", avahi_strerror(avahi_client_errno(client)));
+ avahi_simple_poll_quit(simple_poll);
+ }
+
+ n_cache_exhausted++;
+ n_all_for_now++;
+}
+