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