Home | History | Annotate | Download | only in patches
      1  12111  padraig --- /usr/tmp/clean/avahi-0.6.21/avahi-core/browse-service.c	2006-08-31 18:18:03.000000000 +0100
      2  12111  padraig +++ avahi-0.6.21/avahi-core/browse-service.c	2007-09-20 10:19:21.368616000 +0100
      3  11510  padraig @@ -23,10 +23,14 @@
      4  11510  padraig  #include <config.h>
      5  11510  padraig  #endif
      6  11510  padraig  
      7  11510  padraig +#include <stdio.h>
      8  11510  padraig  #include <string.h>
      9  11510  padraig  
     10  11510  padraig  #include <avahi-common/domain.h>
     11  11510  padraig  #include <avahi-common/malloc.h>
     12  11510  padraig +#ifdef HAVE_BONJOUR
     13  11510  padraig +#include <avahi-common/timeval.h>
     14  11510  padraig +#endif
     15  11510  padraig  #include <avahi-common/error.h>
     16  11510  padraig  
     17  11510  padraig  #include "browse.h"
     18  11510  padraig @@ -42,9 +46,131 @@
     19  11510  padraig      AvahiSServiceBrowserCallback callback;
     20  11510  padraig      void* userdata;
     21  11510  padraig  
     22  11510  padraig +#ifdef HAVE_BONJOUR
     23  11510  padraig +    AvahiProtocol protocol;
     24  11510  padraig +    AvahiIfIndex interface;
     25  11510  padraig +    AvahiTimeEvent *browse_error_event;
     26  11510  padraig +    AvahiTimeEvent *all_for_now_event;
     27  11510  padraig +    AvahiLookupFlags flags;
     28  11510  padraig +    AvahiWatch *watch;
     29  11510  padraig +    DNSServiceRef client;
     30  11510  padraig +#endif
     31  11510  padraig +
     32  11510  padraig      AVAHI_LLIST_FIELDS(AvahiSServiceBrowser, browser);
     33  11510  padraig  };
     34  11510  padraig  
     35  11510  padraig +#ifdef HAVE_BONJOUR
     36  11510  padraig +static void browse_reply(DNSServiceRef client, const DNSServiceFlags flags, uint32_t IfIndex, DNSServiceErrorType errorCode,
     37  11510  padraig +        const char *name, const char *type, const char *domain, void *context) {
     38  11510  padraig +    AvahiSServiceBrowser *b = context;
     39  11510  padraig +    char *op = (flags &kDNSServiceFlagsAdd) ? "Add" : "Rmv";
     40  11510  padraig +    AvahiBrowserEvent event;
     41  11510  padraig +    AvahiIfIndex interface;
     42  11510  padraig +    
     43  11510  padraig +    interface = (IfIndex == kDNSServiceInterfaceIndexAny) ? AVAHI_IF_UNSPEC : IfIndex;
     44  11510  padraig +
     45  11510  padraig +    event = (flags &kDNSServiceFlagsAdd) ? AVAHI_BROWSER_NEW : AVAHI_BROWSER_REMOVE;
     46  11510  padraig +
     47  11510  padraig +    b->callback(b, interface, AVAHI_PROTO_UNSPEC, event, name, type, domain, 0, b->userdata);
     48  11510  padraig +    
     49  11510  padraig +}
     50  11510  padraig +
     51  11510  padraig +static void browse_socket_event(AvahiWatch *w, int fd, AvahiWatchEvent events, void *userdata) {
     52  11510  padraig +    AvahiSServiceBrowser *b = userdata;
     53  11510  padraig +    DNSServiceErrorType ret;
     54  11510  padraig +
     55  11510  padraig +    assert(w);
     56  11510  padraig +    assert(fd >= 0);
     57  11510  padraig +    assert(events & AVAHI_WATCH_IN);
     58  11510  padraig +
     59  11510  padraig +    assert (fd == DNSServiceRefSockFD(b->client));
     60  11510  padraig +    ret = DNSServiceProcessResult(b->client);
     61  11510  padraig +    if (ret != kDNSServiceErr_NoError) {
     62  11510  padraig +        if (b->watch) {
     63  11510  padraig +            b->server->poll_api->watch_free(b->watch);
     64  11510  padraig +            b->watch = NULL;
     65  11510  padraig +        }
     66  11510  padraig +        DNSServiceRefDeallocate(b->client);
     67  11510  padraig +        b->client = NULL;
     68  11510  padraig +        avahi_server_set_errno(b->server, AVAHI_ERR_DISCONNECTED);
     69  11510  padraig +        b->callback(b, 
     70  11510  padraig +            b->interface, 
     71  11510  padraig +            b->protocol, 
     72  11510  padraig +            AVAHI_BROWSER_FAILURE,
     73  11510  padraig +            NULL,
     74  11510  padraig +            b->service_type, 
     75  11510  padraig +            b->domain_name,
     76  11510  padraig +            0,
     77  11510  padraig +            b->userdata);
     78  11510  padraig +    }
     79  11510  padraig +}
     80  11510  padraig +
     81  11510  padraig +static void all_for_now_callback(AvahiTimeEvent *e, void* userdata) {
     82  11510  padraig +    AvahiSServiceBrowser *b = userdata;
     83  11510  padraig +
     84  11510  padraig +    assert(e);
     85  11510  padraig +    assert(b);
     86  11510  padraig +
     87  11510  padraig +    avahi_time_event_free(b->all_for_now_event);
     88  11510  padraig +    b->all_for_now_event = NULL;
     89  11510  padraig +
     90  11510  padraig +    b->callback(b, 
     91  11510  padraig +        b->interface, 
     92  11510  padraig +        b->protocol,
     93  11510  padraig +        AVAHI_BROWSER_ALL_FOR_NOW, 
     94  11510  padraig +        NULL,
     95  11510  padraig +        b->service_type,
     96  11510  padraig +        NULL,
     97  11510  padraig +        0,
     98  11510  padraig +        b->userdata);
     99  11510  padraig +}
    100  11510  padraig +
    101  11510  padraig +static void browse_error_callback(AvahiTimeEvent *e, void *userdata) {
    102  11510  padraig +    AvahiSServiceBrowser *b = userdata;
    103  11510  padraig +
    104  11510  padraig +    if (b->browse_error_event) {
    105  11510  padraig +        avahi_time_event_free(b->browse_error_event);
    106  11510  padraig +        b->browse_error_event = NULL;
    107  11510  padraig +    }
    108  11510  padraig +    avahi_server_set_errno(b->server, AVAHI_ERR_FAILURE);
    109  11510  padraig +    b->callback(b, 
    110  11510  padraig +        b->interface, 
    111  11510  padraig +        b->protocol, 
    112  11510  padraig +        AVAHI_BROWSER_FAILURE,
    113  11510  padraig +        NULL,
    114  11510  padraig +        b->service_type, 
    115  11510  padraig +        b->domain_name,
    116  11510  padraig +        0,
    117  11510  padraig +        b->userdata);
    118  11510  padraig +}
    119  11510  padraig +
    120  11510  padraig +static void avahi_browse_service_start(AvahiSServiceBrowser *b) {
    121  11510  padraig +    DNSServiceErrorType ret;
    122  11510  padraig +    struct timeval tv;
    123  11510  padraig +
    124  11510  padraig +    ret = DNSServiceBrowse(&b->client,
    125  11510  padraig +              0,
    126  11510  padraig +              b->interface == AVAHI_IF_UNSPEC ?
    127  11510  padraig +                  kDNSServiceInterfaceIndexAny :
    128  11510  padraig +                  b->interface,
    129  11510  padraig +              b->service_type,
    130  11510  padraig +              b->domain_name,
    131  11510  padraig +              browse_reply,
    132  11510  padraig +              b);
    133  11510  padraig +    if (ret != kDNSServiceErr_NoError || !b->client) {
    134  11510  padraig +        b->browse_error_event = avahi_time_event_new(b->server->time_event_queue,
    135  11510  padraig +NULL, browse_error_callback, b);
    136  11510  padraig +    } else {
    137  11510  padraig +        b->watch = b->server->poll_api->watch_new(b->server->poll_api, DNSServiceRefSockFD(b->client), AVAHI_WATCH_IN, browse_socket_event, b);
    138  11510  padraig +
    139  11510  padraig +        /* Add a second */
    140  11510  padraig +        gettimeofday(&tv, NULL);
    141  11510  padraig +        avahi_timeval_add(&tv, 1000000);
    142  11510  padraig +        b->all_for_now_event = avahi_time_event_new(b->server->time_event_queue, &tv, all_for_now_callback, b);
    143  11510  padraig +    }
    144  11510  padraig +}
    145  11510  padraig +#endif
    146  11510  padraig +
    147  11510  padraig  static void record_browser_callback(
    148  11510  padraig      AvahiSRecordBrowser*rr,
    149  11510  padraig      AvahiIfIndex interface,
    150  11510  padraig @@ -104,7 +230,11 @@
    151  11510  padraig      AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_IF_VALID(interface), AVAHI_ERR_INVALID_INTERFACE);
    152  11510  padraig      AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_PROTO_VALID(protocol), AVAHI_ERR_INVALID_PROTOCOL);
    153  11510  padraig      AVAHI_CHECK_VALIDITY_RETURN_NULL(server, !domain || avahi_is_valid_domain_name(domain), AVAHI_ERR_INVALID_DOMAIN_NAME);
    154  11510  padraig +#ifdef HAVE_BONJOUR
    155  11510  padraig +    AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_FLAGS_VALID(flags, AVAHI_LOOKUP_USE_MULTICAST), AVAHI_ERR_INVALID_FLAGS);
    156  11510  padraig +#else
    157  11510  padraig      AVAHI_CHECK_VALIDITY_RETURN_NULL(server, AVAHI_FLAGS_VALID(flags, AVAHI_LOOKUP_USE_WIDE_AREA|AVAHI_LOOKUP_USE_MULTICAST), AVAHI_ERR_INVALID_FLAGS);
    158  11510  padraig +#endif
    159  11510  padraig      AVAHI_CHECK_VALIDITY_RETURN_NULL(server, avahi_is_valid_service_type_generic(service_type), AVAHI_ERR_INVALID_SERVICE_TYPE);
    160  11510  padraig  
    161  11510  padraig      if (!domain)
    162  12111  padraig @@ -134,6 +264,16 @@
    163  11510  padraig          goto fail;
    164  11510  padraig      }
    165  11510  padraig      
    166  11510  padraig +#ifdef HAVE_BONJOUR
    167  11510  padraig +    b->protocol = protocol;
    168  11510  padraig +    b->interface = interface;
    169  11510  padraig +    b->flags = flags;
    170  11510  padraig +    b->browse_error_event = NULL;
    171  11510  padraig +    b->all_for_now_event = NULL;
    172  11510  padraig +    b->client = NULL;
    173  12111  padraig +    b->watch = NULL;
    174  11510  padraig +    avahi_browse_service_start(b);
    175  11510  padraig +#else
    176  11510  padraig      if (!(k = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_PTR))) {
    177  11510  padraig          avahi_server_set_errno(server, AVAHI_ERR_NO_MEMORY);
    178  11510  padraig          goto fail;
    179  12111  padraig @@ -143,6 +283,7 @@
    180  11510  padraig          goto fail;
    181  11510  padraig  
    182  11510  padraig      avahi_key_unref(k);
    183  11510  padraig +#endif
    184  11510  padraig  
    185  11510  padraig      return b;
    186  11510  padraig  
    187  12111  padraig @@ -165,5 +306,21 @@
    188  11510  padraig      
    189  11510  padraig      avahi_free(b->domain_name);
    190  11510  padraig      avahi_free(b->service_type);
    191  11510  padraig +#ifdef HAVE_BONJOUR
    192  11510  padraig +    if (b->browse_error_event) {
    193  11510  padraig +        avahi_time_event_free(b->browse_error_event);
    194  11510  padraig +        b->browse_error_event = NULL;
    195  11510  padraig +    }
    196  11510  padraig +    if (b->all_for_now_event) {
    197  11510  padraig +        avahi_time_event_free(b->all_for_now_event);
    198  11510  padraig +        b->all_for_now_event = NULL;
    199  11510  padraig +    }
    200  11510  padraig +
    201  11510  padraig +    if (b->watch)
    202  11510  padraig +        b->server->poll_api->watch_free(b->watch);
    203  11510  padraig +
    204  11510  padraig +    if (b->client)
    205  11510  padraig +        DNSServiceRefDeallocate (b->client);
    206  11510  padraig +#endif
    207  11510  padraig      avahi_free(b);
    208  11510  padraig  }
    209