Home | History | Annotate | Download | only in patches
      1 --- /usr/tmp/clean/avahi-0.6.12/avahi-core/browse-domain.c	2006-01-17 12:25:54.000000000 +0000
      2 +++ avahi-0.6.12/avahi-core/browse-domain.c	2006-08-28 14:04:34.905548000 +0100
      3 @@ -28,6 +28,9 @@
      4  #include <avahi-common/domain.h>
      5  #include <avahi-common/malloc.h>
      6  #include <avahi-common/error.h>
      7 +#ifdef HAVE_BONJOUR
      8 +#include <avahi-common/timeval.h>
      9 +#endif
     10  
     11  #include "browse.h"
     12  #include "log.h"
     13 @@ -47,6 +50,14 @@
     14  
     15      int all_for_now_scheduled;
     16      
     17 +#ifdef HAVE_BONJOUR
     18 +    AvahiIfIndex interface;
     19 +    AvahiTimeEvent *browse_error_event;
     20 +    AvahiTimeEvent *all_for_now_event;
     21 +    AvahiLookupFlags flags;
     22 +    AvahiWatch *watch;
     23 +    DNSServiceRef client;
     24 +#endif
     25      AVAHI_LLIST_FIELDS(AvahiSDomainBrowser, browser);
     26  };
     27  
     28 @@ -137,6 +148,122 @@
     29      avahi_s_domain_browser_free(b);
     30  }
     31  
     32 +#ifdef HAVE_BONJOUR
     33 +static void enumerate_reply(DNSServiceRef service,
     34 +    DNSServiceFlags flags,
     35 +    uint32_t IfIndex,
     36 +    DNSServiceErrorType errorCode,
     37 +    const char *replyDomain,
     38 +    void *context) {
     39 +    AvahiSDomainBrowser *b = context;
     40 +    AvahiIfIndex interface;
     41 +
     42 +    if (flags & kDNSServiceFlagsDefault)
     43 +        if (b->flags != AVAHI_DOMAIN_BROWSER_BROWSE_DEFAULT &&
     44 +            b->flags != AVAHI_DOMAIN_BROWSER_REGISTER_DEFAULT)
     45 +            return;
     46 +
     47 +    interface = (IfIndex == kDNSServiceInterfaceIndexAny) ? AVAHI_IF_UNSPEC : IfIndex; 
     48 +
     49 +    b->callback(b, interface, AVAHI_PROTO_UNSPEC, AVAHI_BROWSER_NEW, replyDomain, 0 /* flags */, b->userdata);
     50 +}
     51 +
     52 +static void enumerate_error_callback(AvahiTimeEvent *e, void *userdata) {
     53 +    AvahiSDomainBrowser *b = userdata;
     54 +
     55 +    if (b->browse_error_event) {
     56 +        avahi_time_event_free(b->browse_error_event);
     57 +        b->browse_error_event = NULL;
     58 +    }
     59 +    avahi_server_set_errno(b->server, AVAHI_ERR_FAILURE);
     60 +    b->callback(b,
     61 +        b->interface,
     62 +        AVAHI_PROTO_UNSPEC,
     63 +        AVAHI_BROWSER_FAILURE,
     64 +        NULL,
     65 +        0,
     66 +        b->userdata);
     67 +}
     68 +
     69 +static void all_for_now_callback(AvahiTimeEvent *e, void* userdata) {
     70 +    AvahiSDomainBrowser *b = userdata;
     71 +
     72 +    assert(e);
     73 +    assert(b);
     74 +
     75 +    avahi_time_event_free(b->all_for_now_event);
     76 +    b->all_for_now_event = NULL;
     77 +
     78 +    b->callback(b,
     79 +        AVAHI_IF_UNSPEC,
     80 +        AVAHI_PROTO_UNSPEC,
     81 +        AVAHI_BROWSER_ALL_FOR_NOW,
     82 +        NULL,
     83 +        0,
     84 +        b->userdata);
     85 +}
     86 +
     87 +static void enumerate_socket_event(AvahiWatch *w, int fd, AvahiWatchEvent events, void *userdata) {
     88 +    AvahiSDomainBrowser *b = userdata;
     89 +    DNSServiceErrorType ret;
     90 +
     91 +    assert(w);
     92 +    assert(fd >= 0);
     93 +    assert(events & AVAHI_WATCH_IN);
     94 +
     95 +    assert (fd == DNSServiceRefSockFD(b->client));
     96 +    ret = DNSServiceProcessResult(b->client);
     97 +    if (ret != kDNSServiceErr_NoError) {
     98 +        if (b->watch) {
     99 +            b->server->poll_api->watch_free(b->watch);
    100 +            b->watch = NULL;
    101 +        }
    102 +        DNSServiceRefDeallocate(b->client);
    103 +        b->client = NULL;
    104 +        avahi_server_set_errno(b->server, AVAHI_ERR_DISCONNECTED);
    105 +        b->callback(b,
    106 +            b->interface,
    107 +            AVAHI_PROTO_UNSPEC,
    108 +            AVAHI_BROWSER_FAILURE,
    109 +            NULL,
    110 +            0,
    111 +            b->userdata);
    112 +    }
    113 +}
    114 +
    115 +static void avahi_browse_domains_start(AvahiSDomainBrowser *b) {
    116 +    DNSServiceErrorType ret;
    117 +    DNSServiceFlags flags;
    118 +    struct timeval tv;
    119 +
    120 +    if (b->flags == AVAHI_DOMAIN_BROWSER_BROWSE ||
    121 +        b->flags == AVAHI_DOMAIN_BROWSER_BROWSE_DEFAULT)
    122 +        flags = kDNSServiceFlagsBrowseDomains;
    123 +    else if (b->flags == AVAHI_DOMAIN_BROWSER_REGISTER ||
    124 +        b->flags == AVAHI_DOMAIN_BROWSER_REGISTER_DEFAULT)
    125 +        flags = kDNSServiceFlagsRegistrationDomains;
    126 +     
    127 +    ret =  DNSServiceEnumerateDomains(&b->client,
    128 +                                      flags,
    129 +                                      b->interface == AVAHI_IF_UNSPEC ?
    130 +                                          kDNSServiceInterfaceIndexAny :
    131 +                                          b->interface,
    132 +                                      enumerate_reply,
    133 +                                      b);
    134 +    if (ret != kDNSServiceErr_NoError || !b->client) {
    135 +        b->browse_error_event = avahi_time_event_new(b->server->time_event_queue,
    136 +NULL, enumerate_error_callback, b);
    137 +    } else {
    138 +        b->watch = b->server->poll_api->watch_new(b->server->poll_api, DNSServiceRefSockFD(b->client), AVAHI_WATCH_IN, enumerate_socket_event, b);
    139 +
    140 +        /* Add a second */
    141 +        gettimeofday(&tv, NULL);
    142 +        avahi_timeval_add(&tv, 1000000);
    143 +        b->all_for_now_event = avahi_time_event_new(b->server->time_event_queue, &tv, all_for_now_callback, b);
    144 +    }
    145 +}
    146 +#endif
    147 +
    148  AvahiSDomainBrowser *avahi_s_domain_browser_new(
    149      AvahiServer *server,
    150      AvahiIfIndex interface,
    151 @@ -193,6 +320,15 @@
    152  
    153      AVAHI_LLIST_PREPEND(AvahiSDomainBrowser, browser, server->domain_browsers, b);
    154  
    155 +#ifdef HAVE_BONJOUR
    156 +    b->interface = interface;
    157 +    b->client = NULL;
    158 +    b->watch = NULL;
    159 +    b->browse_error_event = NULL;
    160 +    b->all_for_now_event = NULL;
    161 +    b->flags = flags;
    162 +    avahi_browse_domains_start(b);
    163 +#else
    164      if (!(k = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_PTR))) {
    165          avahi_server_set_errno(server, AVAHI_ERR_NO_MEMORY);
    166          goto fail;
    167 @@ -205,6 +341,7 @@
    168  
    169      if (type == AVAHI_DOMAIN_BROWSER_BROWSE && b->server->config.browse_domains)
    170          b->defer_event = avahi_time_event_new(server->time_event_queue, NULL, defer_callback, b);
    171 +#endif
    172      
    173      return b;
    174      
    175 @@ -227,6 +364,23 @@
    176      
    177      AVAHI_LLIST_REMOVE(AvahiSDomainBrowser, browser, b->server->domain_browsers, b);
    178  
    179 +#ifdef HAVE_BONJOUR
    180 +    if (b->browse_error_event) {
    181 +        avahi_time_event_free(b->browse_error_event);
    182 +        b->browse_error_event = NULL;
    183 +    }
    184 +    if (b->all_for_now_event) {
    185 +        avahi_time_event_free(b->all_for_now_event);
    186 +        b->all_for_now_event = NULL;
    187 +    }
    188 +
    189 +    if (b->watch)
    190 +        b->server->poll_api->watch_free(b->watch);
    191 +
    192 +    if (b->client)
    193 +        DNSServiceRefDeallocate(b->client);
    194 +#endif
    195 +
    196      if (b->record_browser)
    197          avahi_s_record_browser_free(b->record_browser);
    198  
    199