1 12111 padraig --- /usr/tmp/clean/avahi-0.6.21/avahi-core/browse-service.c 2006-08-31 18:18:03.000000000 +0100 2 12111 padraig +++ avahi-0.6.21/avahi-core/browse-service.c 2007-09-20 10:19:21.368616000 +0100 3 11510 padraig @@ -23,10 +23,14 @@ 4 11510 padraig #include <config.h> 5 11510 padraig #endif 6 11510 padraig 7 11510 padraig +#include <stdio.h> 8 11510 padraig #include <string.h> 9 11510 padraig 10 11510 padraig #include <avahi-common/domain.h> 11 11510 padraig #include <avahi-common/malloc.h> 12 11510 padraig +#ifdef HAVE_BONJOUR 13 11510 padraig +#include <avahi-common/timeval.h> 14 11510 padraig +#endif 15 11510 padraig #include <avahi-common/error.h> 16 11510 padraig 17 11510 padraig #include "browse.h" 18 11510 padraig @@ -42,9 +46,131 @@ 19 11510 padraig AvahiSServiceBrowserCallback callback; 20 11510 padraig void* userdata; 21 11510 padraig 22 11510 padraig +#ifdef HAVE_BONJOUR 23 11510 padraig + AvahiProtocol protocol; 24 11510 padraig + AvahiIfIndex interface; 25 11510 padraig + AvahiTimeEvent *browse_error_event; 26 11510 padraig + AvahiTimeEvent *all_for_now_event; 27 11510 padraig + AvahiLookupFlags flags; 28 11510 padraig + AvahiWatch *watch; 29 11510 padraig + DNSServiceRef client; 30 11510 padraig +#endif 31 11510 padraig + 32 11510 padraig AVAHI_LLIST_FIELDS(AvahiSServiceBrowser, browser); 33 11510 padraig }; 34 11510 padraig 35 11510 padraig +#ifdef HAVE_BONJOUR 36 11510 padraig +static void browse_reply(DNSServiceRef client, const DNSServiceFlags flags, uint32_t IfIndex, DNSServiceErrorType errorCode, 37 11510 padraig + const char *name, const char *type, const char *domain, void *context) { 38 11510 padraig + AvahiSServiceBrowser *b = context; 39 11510 padraig + char *op = (flags &kDNSServiceFlagsAdd) ? "Add" : "Rmv"; 40 11510 padraig + AvahiBrowserEvent event; 41 11510 padraig + AvahiIfIndex interface; 42 11510 padraig + 43 11510 padraig + interface = (IfIndex == kDNSServiceInterfaceIndexAny) ? AVAHI_IF_UNSPEC : IfIndex; 44 11510 padraig + 45 11510 padraig + event = (flags &kDNSServiceFlagsAdd) ? AVAHI_BROWSER_NEW : AVAHI_BROWSER_REMOVE; 46 11510 padraig + 47 11510 padraig + b->callback(b, interface, AVAHI_PROTO_UNSPEC, event, name, type, domain, 0, b->userdata); 48 11510 padraig + 49 11510 padraig +} 50 11510 padraig + 51 11510 padraig +static void browse_socket_event(AvahiWatch *w, int fd, AvahiWatchEvent events, void *userdata) { 52 11510 padraig + AvahiSServiceBrowser *b = userdata; 53 11510 padraig + DNSServiceErrorType ret; 54 11510 padraig + 55 11510 padraig + assert(w); 56 11510 padraig + assert(fd >= 0); 57 11510 padraig + assert(events & AVAHI_WATCH_IN); 58 11510 padraig + 59 11510 padraig + assert (fd == DNSServiceRefSockFD(b->client)); 60 11510 padraig + ret = DNSServiceProcessResult(b->client); 61 11510 padraig + if (ret != kDNSServiceErr_NoError) { 62 11510 padraig + if (b->watch) { 63 11510 padraig + b->server->poll_api->watch_free(b->watch); 64 11510 padraig + b->watch = NULL; 65 11510 padraig + } 66 11510 padraig + DNSServiceRefDeallocate(b->client); 67 11510 padraig + b->client = NULL; 68 11510 padraig + avahi_server_set_errno(b->server, AVAHI_ERR_DISCONNECTED); 69 11510 padraig + b->callback(b, 70 11510 padraig + b->interface, 71 11510 padraig + b->protocol, 72 11510 padraig + AVAHI_BROWSER_FAILURE, 73 11510 padraig + NULL, 74 11510 padraig + b->service_type, 75 11510 padraig + b->domain_name, 76 11510 padraig + 0, 77 11510 padraig + b->userdata); 78 11510 padraig + } 79 11510 padraig +} 80 11510 padraig + 81 11510 padraig +static void all_for_now_callback(AvahiTimeEvent *e, void* userdata) { 82 11510 padraig + AvahiSServiceBrowser *b = userdata; 83 11510 padraig + 84 11510 padraig + assert(e); 85 11510 padraig + assert(b); 86 11510 padraig + 87 11510 padraig + avahi_time_event_free(b->all_for_now_event); 88 11510 padraig + b->all_for_now_event = NULL; 89 11510 padraig + 90 11510 padraig + b->callback(b, 91 11510 padraig + b->interface, 92 11510 padraig + b->protocol, 93 11510 padraig + AVAHI_BROWSER_ALL_FOR_NOW, 94 11510 padraig + NULL, 95 11510 padraig + b->service_type, 96 11510 padraig + NULL, 97 11510 padraig + 0, 98 11510 padraig + b->userdata); 99 11510 padraig +} 100 11510 padraig + 101 11510 padraig +static void browse_error_callback(AvahiTimeEvent *e, void *userdata) { 102 11510 padraig + AvahiSServiceBrowser *b = userdata; 103 11510 padraig + 104 11510 padraig + if (b->browse_error_event) { 105 11510 padraig + avahi_time_event_free(b->browse_error_event); 106 11510 padraig + b->browse_error_event = NULL; 107 11510 padraig + } 108 11510 padraig + avahi_server_set_errno(b->server, AVAHI_ERR_FAILURE); 109 11510 padraig + b->callback(b, 110 11510 padraig + b->interface, 111 11510 padraig + b->protocol, 112 11510 padraig + AVAHI_BROWSER_FAILURE, 113 11510 padraig + NULL, 114 11510 padraig + b->service_type, 115 11510 padraig + b->domain_name, 116 11510 padraig + 0, 117 11510 padraig + b->userdata); 118 11510 padraig +} 119 11510 padraig + 120 11510 padraig +static void avahi_browse_service_start(AvahiSServiceBrowser *b) { 121 11510 padraig + DNSServiceErrorType ret; 122 11510 padraig + struct timeval tv; 123 11510 padraig + 124 11510 padraig + ret = DNSServiceBrowse(&b->client, 125 11510 padraig + 0, 126 11510 padraig + b->interface == AVAHI_IF_UNSPEC ? 127 11510 padraig + kDNSServiceInterfaceIndexAny : 128 11510 padraig + b->interface, 129 11510 padraig + b->service_type, 130 11510 padraig + b->domain_name, 131 11510 padraig + browse_reply, 132 11510 padraig + b); 133 11510 padraig + if (ret != kDNSServiceErr_NoError || !b->client) { 134 11510 padraig + b->browse_error_event = avahi_time_event_new(b->server->time_event_queue, 135 11510 padraig +NULL, browse_error_callback, b); 136 11510 padraig + } else { 137 11510 padraig + b->watch = b->server->poll_api->watch_new(b->server->poll_api, DNSServiceRefSockFD(b->client), AVAHI_WATCH_IN, browse_socket_event, b); 138 11510 padraig + 139 11510 padraig + /* Add a second */ 140 11510 padraig + gettimeofday(&tv, NULL); 141 11510 padraig + avahi_timeval_add(&tv, 1000000); 142 11510 padraig + b->all_for_now_event = avahi_time_event_new(b->server->time_event_queue, &tv, all_for_now_callback, b); 143 11510 padraig + } 144 11510 padraig +} 145 11510 padraig +#endif 146 11510 padraig + 147 11510 padraig static void record_browser_callback( 148 11510 padraig AvahiSRecordBrowser*rr, 149 11510 padraig AvahiIfIndex interface, 150 11510 padraig @@ -104,7 +230,11 @@ 151 11510 padraig AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_IF_VALID(interface), AVAHI_ERR_INVALID_INTERFACE); 152 11510 padraig AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_PROTO_VALID(protocol), AVAHI_ERR_INVALID_PROTOCOL); 153 11510 padraig AVAHI_CHECK_VALIDITY_RETURN_NULL(server, !domain || avahi_is_valid_domain_name(domain), AVAHI_ERR_INVALID_DOMAIN_NAME); 154 11510 padraig +#ifdef HAVE_BONJOUR 155 11510 padraig + AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_FLAGS_VALID(flags, AVAHI_LOOKUP_USE_MULTICAST), AVAHI_ERR_INVALID_FLAGS); 156 11510 padraig +#else 157 11510 padraig AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_FLAGS_VALID(flags, AVAHI_LOOKUP_USE_WIDE_AREA|AVAHI_LOOKUP_USE_MULTICAST), AVAHI_ERR_INVALID_FLAGS); 158 11510 padraig +#endif 159 11510 padraig AVAHI_CHECK_VALIDITY_RETURN_NULL(server, avahi_is_valid_service_type_generic(service_type), AVAHI_ERR_INVALID_SERVICE_TYPE); 160 11510 padraig 161 11510 padraig if (!domain) 162 12111 padraig @@ -134,6 +264,16 @@ 163 11510 padraig goto fail; 164 11510 padraig } 165 11510 padraig 166 11510 padraig +#ifdef HAVE_BONJOUR 167 11510 padraig + b->protocol = protocol; 168 11510 padraig + b->interface = interface; 169 11510 padraig + b->flags = flags; 170 11510 padraig + b->browse_error_event = NULL; 171 11510 padraig + b->all_for_now_event = NULL; 172 11510 padraig + b->client = NULL; 173 12111 padraig + b->watch = NULL; 174 11510 padraig + avahi_browse_service_start(b); 175 11510 padraig +#else 176 11510 padraig if (!(k = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_PTR))) { 177 11510 padraig avahi_server_set_errno(server, AVAHI_ERR_NO_MEMORY); 178 11510 padraig goto fail; 179 12111 padraig @@ -143,6 +283,7 @@ 180 11510 padraig goto fail; 181 11510 padraig 182 11510 padraig avahi_key_unref(k); 183 11510 padraig +#endif 184 11510 padraig 185 11510 padraig return b; 186 11510 padraig 187 12111 padraig @@ -165,5 +306,21 @@ 188 11510 padraig 189 11510 padraig avahi_free(b->domain_name); 190 11510 padraig avahi_free(b->service_type); 191 11510 padraig +#ifdef HAVE_BONJOUR 192 11510 padraig + if (b->browse_error_event) { 193 11510 padraig + avahi_time_event_free(b->browse_error_event); 194 11510 padraig + b->browse_error_event = NULL; 195 11510 padraig + } 196 11510 padraig + if (b->all_for_now_event) { 197 11510 padraig + avahi_time_event_free(b->all_for_now_event); 198 11510 padraig + b->all_for_now_event = NULL; 199 11510 padraig + } 200 11510 padraig + 201 11510 padraig + if (b->watch) 202 11510 padraig + b->server->poll_api->watch_free(b->watch); 203 11510 padraig + 204 11510 padraig + if (b->client) 205 11510 padraig + DNSServiceRefDeallocate (b->client); 206 11510 padraig +#endif 207 11510 padraig avahi_free(b); 208 11510 padraig } 209