Home | History | Annotate | Download | only in patches
      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