1 --- /usr/tmp/clean/avahi-0.6.13/avahi-core/browse.c 2006-06-22 00:30:49.000000000 +0100 2 +++ avahi-0.6.13/avahi-core/browse.c 2006-08-31 13:54:14.293664000 +0100 3 @@ -24,6 +24,7 @@ 4 #endif 5 6 #include <stdlib.h> 7 +#include <stdio.h> 8 9 #include <avahi-common/timeval.h> 10 #include <avahi-common/malloc.h> 11 @@ -521,6 +522,91 @@ 12 } 13 } 14 15 +#ifdef HAVE_BONJOUR 16 +static void resolve_socket_event(AvahiWatch *w, int fd, AvahiWatchEvent events, 17 +void *userdata) { 18 + AvahiSRecordBrowser *b = userdata; 19 + DNSServiceErrorType ret; 20 + DNSServiceRef client; 21 + 22 + assert(w); 23 + assert(fd >= 0); 24 + assert(events & AVAHI_WATCH_IN); 25 + 26 + assert (fd == DNSServiceRefSockFD(b->client)); 27 + 28 + ret = DNSServiceProcessResult(b->client); 29 + if (ret != kDNSServiceErr_NoError) { 30 + if (b->watch) { 31 + b->server->poll_api->watch_free(b->watch); 32 + b->watch = NULL; 33 + } 34 + DNSServiceRefDeallocate(b->client); 35 + b->client = NULL; 36 + avahi_server_set_errno(b->server, AVAHI_ERR_DISCONNECTED); 37 + b->callback(b, b->interface, b->protocol, AVAHI_BROWSER_FAILURE, NULL, 0, b->userdata); 38 + } 39 +} 40 + 41 +static void resolve_error_callback(AvahiTimeEvent *e, void *userdata) { 42 + AvahiSRecordBrowser *b = userdata; 43 + 44 + if (b->defer_time_event) { 45 + avahi_time_event_free(b->defer_time_event); 46 + b->defer_time_event = NULL; 47 + } 48 + avahi_server_set_errno(b->server, AVAHI_ERR_FAILURE); 49 + b->callback( 50 + b, b->interface, b->protocol, AVAHI_BROWSER_FAILURE, NULL, 51 + 0, 52 + b->userdata); 53 +} 54 + 55 +static void browse_reply(DNSServiceRef client, DNSServiceFlags flags, uint32_t ifIndex, DNSServiceErrorType errorCode, 56 + const char *fullname, uint16_t rrtype, uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, void *context) { 57 + AvahiSRecordBrowser *b = context; 58 + AvahiRecord *rr; 59 + AvahiKey *k; 60 + 61 + k = avahi_key_new(fullname, rrclass, rrtype); 62 + rr = avahi_record_new(k, ttl); 63 + if (avahi_rdata_parse(rr, rdata, rdlen) != 0) { 64 + printf("parse failed\n"); 65 + return; 66 + } 67 + b->callback(b, b->interface, b->protocol, AVAHI_BROWSER_NEW, rr, 0, b->userdata); 68 + avahi_record_unref(rr); 69 +} 70 + 71 +static void avahi_browse_record_start(AvahiSRecordBrowser *b) { 72 + DNSServiceErrorType ret; 73 + DNSServiceFlags flags; 74 + 75 + if (b->flags != AVAHI_LOOKUP_USE_WIDE_AREA) 76 + flags = kDNSServiceFlagsForceMulticast; 77 + else 78 + flags = 0; 79 + 80 + ret = DNSServiceQueryRecord(&b->client, 81 + 0, 82 + b->interface == AVAHI_IF_UNSPEC ? 83 + kDNSServiceInterfaceIndexAny : 84 + b->interface, 85 + b->key->name, 86 + b->key->type, 87 + b->key->clazz, 88 + browse_reply, 89 + b); 90 + if (ret != kDNSServiceErr_NoError || !b->client) { 91 + b->defer_time_event = avahi_time_event_new(b->server->time_event_queue, 92 +NULL, resolve_error_callback, b); 93 + } else { 94 + b->defer_time_event = NULL; 95 + b->watch = b->server->poll_api->watch_new(b->server->poll_api, DNSServiceRefSockFD(b->client), AVAHI_WATCH_IN, resolve_socket_event, b); 96 + } 97 +} 98 +#endif 99 + 100 AvahiSRecordBrowser *avahi_s_record_browser_new( 101 AvahiServer *server, 102 AvahiIfIndex interface, 103 @@ -561,10 +647,15 @@ 104 b->root_lookup = NULL; 105 106 AVAHI_LLIST_PREPEND(AvahiSRecordBrowser, browser, server->record_browsers, b); 107 - 108 +#ifdef HAVE_BONJOUR 109 + b->watch = NULL; 110 + b->client = NULL; 111 + avahi_browse_record_start(b); 112 +#else 113 /* The currently cached entries are scanned a bit later, and than we will start querying, too */ 114 b->defer_time_event = avahi_time_event_new(server->time_event_queue, NULL, defer_callback, b); 115 assert(b->defer_time_event); 116 +#endif 117 118 return b; 119 } 120 @@ -577,6 +668,13 @@ 121 b->server->need_browser_cleanup = 1; 122 123 browser_cancel(b); 124 +#ifdef HAVE_BONJOUR 125 + if (b->watch) 126 + b->server->poll_api->watch_free(b->watch); 127 + 128 + if (b->client) 129 + DNSServiceRefDeallocate(b->client); 130 +#endif 131 } 132 133 void avahi_s_record_browser_destroy(AvahiSRecordBrowser *b) { 134 @@ -610,6 +708,8 @@ 135 136 if (server->wide_area_lookup_engine) 137 avahi_wide_area_cleanup(server->wide_area_lookup_engine); 138 +#ifndef HAVE_BONJOUR 139 avahi_multicast_lookup_engine_cleanup(server->multicast_lookup_engine); 140 +#endif 141 } 142 143 --- /usr/tmp/clean/avahi-0.6.12/avahi-core/browse.h 2005-10-25 00:44:41.000000000 +0100 144 +++ avahi-0.6.12/avahi-core/browse.h 2006-08-24 09:21:09.326626000 +0100 145 @@ -52,6 +52,11 @@ 146 unsigned n_lookups; 147 148 AvahiSRBLookup *root_lookup; 149 + 150 +#ifdef HAVE_BONJOUR 151 + DNSServiceRef client; 152 + AvahiWatch *watch; 153 +#endif 154 }; 155 156 void avahi_browser_cleanup(AvahiServer *server); 157