1 11510 padraig --- /usr/tmp/clean/avahi-0.6.13/avahi-core/resolve-address.c 2006-03-02 00:59:13.000000000 +0000 2 11510 padraig +++ avahi-0.6.13/avahi-core/resolve-address.c 2006-08-31 14:00:21.756949000 +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 @@ -53,6 +54,13 @@ 12 11510 padraig 13 11510 padraig AvahiTimeEvent *time_event; 14 11510 padraig 15 11510 padraig +#ifdef HAVE_BONJOUR 16 11510 padraig + AvahiTimeEvent *defer_time_event; 17 11510 padraig + AvahiLookupFlags lookup_flags; 18 11510 padraig + AvahiWatch *watch; 19 11510 padraig + DNSServiceRef client; 20 11510 padraig +#endif 21 11510 padraig + 22 11510 padraig AVAHI_LLIST_FIELDS(AvahiSAddressResolver, resolver); 23 11510 padraig }; 24 11510 padraig 25 11510 padraig @@ -76,6 +84,99 @@ 26 11510 padraig } 27 11510 padraig } 28 11510 padraig 29 11510 padraig +#ifdef HAVE_BONJOUR 30 11510 padraig +static void resolve_socket_event(AvahiWatch *w, int fd, AvahiWatchEvent events, 31 11510 padraig +void *userdata) { 32 11510 padraig + AvahiSAddressResolver *r = userdata; 33 11510 padraig + DNSServiceErrorType ret; 34 11510 padraig + 35 11510 padraig + assert(w); 36 11510 padraig + assert(fd >= 0); 37 11510 padraig + assert(events & AVAHI_WATCH_IN); 38 11510 padraig + 39 11510 padraig + assert (fd == DNSServiceRefSockFD(r->client)); 40 11510 padraig + 41 11510 padraig + ret = DNSServiceProcessResult(r->client); 42 11510 padraig + if (ret != kDNSServiceErr_NoError) { 43 11510 padraig + if (r->watch) { 44 11510 padraig + r->server->poll_api->watch_free(r->watch); 45 11510 padraig + r->watch = NULL; 46 11510 padraig + } 47 11510 padraig + DNSServiceRefDeallocate(r->client); 48 11510 padraig + r->client = NULL; 49 11510 padraig + avahi_server_set_errno(r->server, AVAHI_ERR_DISCONNECTED); 50 11510 padraig + finish(r, AVAHI_RESOLVER_FAILURE); 51 11510 padraig + } 52 11510 padraig +} 53 11510 padraig + 54 11510 padraig +static void resolve_reply(DNSServiceRef client, DNSServiceFlags flags, uint32_t 55 11510 padraig +IfIndex, DNSServiceErrorType errorCode, const char *fullname, uint16_t rrtype, uint16_t rrclass, uint16_t rdlen, const void* rdata, uint32_t ttl, void *context) { 56 11510 padraig + AvahiSAddressResolver *r = context; 57 11510 padraig + 58 11510 padraig + assert(rrtype == kDNSServiceType_PTR); 59 11510 padraig + if (r->interface > 0 && IfIndex != r->interface) 60 11510 padraig + return; 61 11510 padraig + if (r->interface <= 0) 62 11510 padraig + r->interface = IfIndex; 63 11510 padraig + 64 11510 padraig + /* 65 11510 padraig + * Using Bonjour we cannot determine whether result was obtained from 66 11510 padraig + * multicast ot unicast query 67 11510 padraig + */ 68 11510 padraig + r->flags = 0; 69 11510 padraig + 70 11510 padraig + if (!(r->ptr_record = avahi_record_new(r->key, ttl))) { 71 11510 padraig + avahi_server_set_errno(r->server, AVAHI_ERR_NO_MEMORY); 72 11510 padraig + finish(r, AVAHI_RESOLVER_FAILURE); 73 11510 padraig + return; 74 11510 padraig + } 75 11510 padraig + if (avahi_rdata_parse(r->ptr_record, rdata, rdlen) != 0) { 76 11510 padraig + avahi_server_set_errno(r->server, AVAHI_ERR_INVALID_PACKET); 77 11510 padraig + finish(r, AVAHI_RESOLVER_FAILURE); 78 11510 padraig + return; 79 11510 padraig + } 80 11510 padraig + finish(r, AVAHI_RESOLVER_FOUND); 81 11510 padraig +} 82 11510 padraig + 83 11510 padraig +static void resolve_error_callback(AvahiTimeEvent *e, void *userdata) { 84 11510 padraig + AvahiSAddressResolver *r = userdata; 85 11510 padraig + 86 11510 padraig + if (r->defer_time_event) { 87 11510 padraig + avahi_time_event_free(r->defer_time_event); 88 11510 padraig + r->defer_time_event = NULL; 89 11510 padraig + } 90 11510 padraig + avahi_server_set_errno(r->server, AVAHI_ERR_FAILURE); 91 11510 padraig + finish(r, AVAHI_RESOLVER_FAILURE); 92 11510 padraig +} 93 11510 padraig + 94 11510 padraig +static void avahi_resolve_address_start(AvahiSAddressResolver *r) 95 11510 padraig +{ 96 11510 padraig + DNSServiceErrorType ret; 97 11510 padraig + DNSServiceFlags flags; 98 11510 padraig + 99 11510 padraig + if (r->flags != AVAHI_LOOKUP_USE_WIDE_AREA) 100 11510 padraig + flags = kDNSServiceFlagsForceMulticast; 101 11510 padraig + else 102 11510 padraig + flags = 0; 103 11510 padraig + 104 11510 padraig + ret = DNSServiceQueryRecord(&r->client, 105 11510 padraig + flags, 106 11510 padraig + r->interface == AVAHI_IF_UNSPEC ? 107 11510 padraig + kDNSServiceInterfaceIndexAny : 108 11510 padraig + r->interface, 109 11510 padraig + r->key->name, 110 11510 padraig + kDNSServiceType_PTR, 111 11510 padraig + kDNSServiceClass_IN, 112 11510 padraig + resolve_reply, 113 11510 padraig + r); 114 11510 padraig + if (ret != kDNSServiceErr_NoError || !r->client) { 115 11510 padraig + r->defer_time_event = avahi_time_event_new(r->server->time_event_queue, NULL, resolve_error_callback, r); 116 11510 padraig + } else { 117 11510 padraig + r->watch = r->server->poll_api->watch_new(r->server->poll_api, DNSServiceRefSockFD(r->client), AVAHI_WATCH_IN, resolve_socket_event, r); 118 11510 padraig + } 119 11510 padraig +} 120 11510 padraig +#endif 121 11510 padraig + 122 11510 padraig static void time_event_callback(AvahiTimeEvent *e, void *userdata) { 123 11510 padraig AvahiSAddressResolver *r = userdata; 124 11510 padraig 125 11510 padraig @@ -97,6 +198,7 @@ 126 11510 padraig r->time_event = avahi_time_event_new(r->server->time_event_queue, &tv, time_event_callback, r); 127 11510 padraig } 128 11510 padraig 129 11510 padraig +#ifndef HAVE_BONJOUR 130 11510 padraig static void record_browser_callback( 131 11510 padraig AvahiSRecordBrowser*rr, 132 11510 padraig AvahiIfIndex interface, 133 11510 padraig @@ -175,6 +277,7 @@ 134 11510 padraig break; 135 11510 padraig } 136 11510 padraig } 137 11510 padraig +#endif 138 11510 padraig 139 11510 padraig AvahiSAddressResolver *avahi_s_address_resolver_new( 140 11510 padraig AvahiServer *server, 141 11510 padraig @@ -227,6 +330,13 @@ 142 11510 padraig 143 11510 padraig r->time_event = NULL; 144 11510 padraig 145 11510 padraig +#ifdef HAVE_BONJOUR 146 11510 padraig + r->defer_time_event = NULL; 147 11510 padraig + r->watch = NULL; 148 11510 padraig + r->client = NULL; 149 11510 padraig + r->lookup_flags = flags; 150 11510 padraig + avahi_resolve_address_start(r); 151 11510 padraig +#else 152 11510 padraig if (!(flags & (AVAHI_LOOKUP_USE_MULTICAST|AVAHI_LOOKUP_USE_WIDE_AREA))) { 153 11510 padraig 154 11510 padraig if (!server->wide_area_lookup_engine || !avahi_wide_area_has_servers(server->wide_area_lookup_engine)) 155 11510 padraig @@ -243,6 +353,7 @@ 156 11510 padraig avahi_s_address_resolver_free(r); 157 11510 padraig return NULL; 158 11510 padraig } 159 11510 padraig +#endif 160 11510 padraig 161 11510 padraig start_timeout(r); 162 11510 padraig 163 11510 padraig @@ -266,5 +377,18 @@ 164 11510 padraig if (r->key) 165 11510 padraig avahi_key_unref(r->key); 166 11510 padraig 167 11510 padraig +#ifdef HAVE_BONJOUR 168 11510 padraig + if (r->defer_time_event) { 169 11510 padraig + avahi_time_event_free(r->defer_time_event); 170 11510 padraig + r->defer_time_event = NULL; 171 11510 padraig + } 172 11510 padraig + 173 11510 padraig + if (r->watch) 174 11510 padraig + r->server->poll_api->watch_free(r->watch); 175 11510 padraig + 176 11510 padraig + if (r->client) 177 11510 padraig + DNSServiceRefDeallocate(r->client); 178 11510 padraig +#endif 179 11510 padraig + 180 11510 padraig avahi_free(r); 181 11510 padraig } 182