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