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