1 --- /usr/tmp/clean/avahi-0.6.12/avahi-core/browse-domain.c 2006-01-17 12:25:54.000000000 +0000 2 +++ avahi-0.6.12/avahi-core/browse-domain.c 2006-08-28 14:04:34.905548000 +0100 3 @@ -28,6 +28,9 @@ 4 #include <avahi-common/domain.h> 5 #include <avahi-common/malloc.h> 6 #include <avahi-common/error.h> 7 +#ifdef HAVE_BONJOUR 8 +#include <avahi-common/timeval.h> 9 +#endif 10 11 #include "browse.h" 12 #include "log.h" 13 @@ -47,6 +50,14 @@ 14 15 int all_for_now_scheduled; 16 17 +#ifdef HAVE_BONJOUR 18 + AvahiIfIndex interface; 19 + AvahiTimeEvent *browse_error_event; 20 + AvahiTimeEvent *all_for_now_event; 21 + AvahiLookupFlags flags; 22 + AvahiWatch *watch; 23 + DNSServiceRef client; 24 +#endif 25 AVAHI_LLIST_FIELDS(AvahiSDomainBrowser, browser); 26 }; 27 28 @@ -137,6 +148,122 @@ 29 avahi_s_domain_browser_free(b); 30 } 31 32 +#ifdef HAVE_BONJOUR 33 +static void enumerate_reply(DNSServiceRef service, 34 + DNSServiceFlags flags, 35 + uint32_t IfIndex, 36 + DNSServiceErrorType errorCode, 37 + const char *replyDomain, 38 + void *context) { 39 + AvahiSDomainBrowser *b = context; 40 + AvahiIfIndex interface; 41 + 42 + if (flags & kDNSServiceFlagsDefault) 43 + if (b->flags != AVAHI_DOMAIN_BROWSER_BROWSE_DEFAULT && 44 + b->flags != AVAHI_DOMAIN_BROWSER_REGISTER_DEFAULT) 45 + return; 46 + 47 + interface = (IfIndex == kDNSServiceInterfaceIndexAny) ? AVAHI_IF_UNSPEC : IfIndex; 48 + 49 + b->callback(b, interface, AVAHI_PROTO_UNSPEC, AVAHI_BROWSER_NEW, replyDomain, 0 /* flags */, b->userdata); 50 +} 51 + 52 +static void enumerate_error_callback(AvahiTimeEvent *e, void *userdata) { 53 + AvahiSDomainBrowser *b = userdata; 54 + 55 + if (b->browse_error_event) { 56 + avahi_time_event_free(b->browse_error_event); 57 + b->browse_error_event = NULL; 58 + } 59 + avahi_server_set_errno(b->server, AVAHI_ERR_FAILURE); 60 + b->callback(b, 61 + b->interface, 62 + AVAHI_PROTO_UNSPEC, 63 + AVAHI_BROWSER_FAILURE, 64 + NULL, 65 + 0, 66 + b->userdata); 67 +} 68 + 69 +static void all_for_now_callback(AvahiTimeEvent *e, void* userdata) { 70 + AvahiSDomainBrowser *b = userdata; 71 + 72 + assert(e); 73 + assert(b); 74 + 75 + avahi_time_event_free(b->all_for_now_event); 76 + b->all_for_now_event = NULL; 77 + 78 + b->callback(b, 79 + AVAHI_IF_UNSPEC, 80 + AVAHI_PROTO_UNSPEC, 81 + AVAHI_BROWSER_ALL_FOR_NOW, 82 + NULL, 83 + 0, 84 + b->userdata); 85 +} 86 + 87 +static void enumerate_socket_event(AvahiWatch *w, int fd, AvahiWatchEvent events, void *userdata) { 88 + AvahiSDomainBrowser *b = userdata; 89 + DNSServiceErrorType ret; 90 + 91 + assert(w); 92 + assert(fd >= 0); 93 + assert(events & AVAHI_WATCH_IN); 94 + 95 + assert (fd == DNSServiceRefSockFD(b->client)); 96 + ret = DNSServiceProcessResult(b->client); 97 + if (ret != kDNSServiceErr_NoError) { 98 + if (b->watch) { 99 + b->server->poll_api->watch_free(b->watch); 100 + b->watch = NULL; 101 + } 102 + DNSServiceRefDeallocate(b->client); 103 + b->client = NULL; 104 + avahi_server_set_errno(b->server, AVAHI_ERR_DISCONNECTED); 105 + b->callback(b, 106 + b->interface, 107 + AVAHI_PROTO_UNSPEC, 108 + AVAHI_BROWSER_FAILURE, 109 + NULL, 110 + 0, 111 + b->userdata); 112 + } 113 +} 114 + 115 +static void avahi_browse_domains_start(AvahiSDomainBrowser *b) { 116 + DNSServiceErrorType ret; 117 + DNSServiceFlags flags; 118 + struct timeval tv; 119 + 120 + if (b->flags == AVAHI_DOMAIN_BROWSER_BROWSE || 121 + b->flags == AVAHI_DOMAIN_BROWSER_BROWSE_DEFAULT) 122 + flags = kDNSServiceFlagsBrowseDomains; 123 + else if (b->flags == AVAHI_DOMAIN_BROWSER_REGISTER || 124 + b->flags == AVAHI_DOMAIN_BROWSER_REGISTER_DEFAULT) 125 + flags = kDNSServiceFlagsRegistrationDomains; 126 + 127 + ret = DNSServiceEnumerateDomains(&b->client, 128 + flags, 129 + b->interface == AVAHI_IF_UNSPEC ? 130 + kDNSServiceInterfaceIndexAny : 131 + b->interface, 132 + enumerate_reply, 133 + b); 134 + if (ret != kDNSServiceErr_NoError || !b->client) { 135 + b->browse_error_event = avahi_time_event_new(b->server->time_event_queue, 136 +NULL, enumerate_error_callback, b); 137 + } else { 138 + b->watch = b->server->poll_api->watch_new(b->server->poll_api, DNSServiceRefSockFD(b->client), AVAHI_WATCH_IN, enumerate_socket_event, b); 139 + 140 + /* Add a second */ 141 + gettimeofday(&tv, NULL); 142 + avahi_timeval_add(&tv, 1000000); 143 + b->all_for_now_event = avahi_time_event_new(b->server->time_event_queue, &tv, all_for_now_callback, b); 144 + } 145 +} 146 +#endif 147 + 148 AvahiSDomainBrowser *avahi_s_domain_browser_new( 149 AvahiServer *server, 150 AvahiIfIndex interface, 151 @@ -193,6 +320,15 @@ 152 153 AVAHI_LLIST_PREPEND(AvahiSDomainBrowser, browser, server->domain_browsers, b); 154 155 +#ifdef HAVE_BONJOUR 156 + b->interface = interface; 157 + b->client = NULL; 158 + b->watch = NULL; 159 + b->browse_error_event = NULL; 160 + b->all_for_now_event = NULL; 161 + b->flags = flags; 162 + avahi_browse_domains_start(b); 163 +#else 164 if (!(k = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_PTR))) { 165 avahi_server_set_errno(server, AVAHI_ERR_NO_MEMORY); 166 goto fail; 167 @@ -205,6 +341,7 @@ 168 169 if (type == AVAHI_DOMAIN_BROWSER_BROWSE && b->server->config.browse_domains) 170 b->defer_event = avahi_time_event_new(server->time_event_queue, NULL, defer_callback, b); 171 +#endif 172 173 return b; 174 175 @@ -227,6 +364,23 @@ 176 177 AVAHI_LLIST_REMOVE(AvahiSDomainBrowser, browser, b->server->domain_browsers, b); 178 179 +#ifdef HAVE_BONJOUR 180 + if (b->browse_error_event) { 181 + avahi_time_event_free(b->browse_error_event); 182 + b->browse_error_event = NULL; 183 + } 184 + if (b->all_for_now_event) { 185 + avahi_time_event_free(b->all_for_now_event); 186 + b->all_for_now_event = NULL; 187 + } 188 + 189 + if (b->watch) 190 + b->server->poll_api->watch_free(b->watch); 191 + 192 + if (b->client) 193 + DNSServiceRefDeallocate(b->client); 194 +#endif 195 + 196 if (b->record_browser) 197 avahi_s_record_browser_free(b->record_browser); 198 199