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