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