Home | History | Annotate | Download | only in patches
      1  11510  padraig --- /usr/tmp/clean/avahi-0.6.13/avahi-core/browse.c	2006-06-22 00:30:49.000000000 +0100
      2  11510  padraig +++ avahi-0.6.13/avahi-core/browse.c	2006-08-31 13:54:14.293664000 +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 @@ -521,6 +522,91 @@
     12  11510  padraig      }
     13  11510  padraig  }
     14  11510  padraig  
     15  11510  padraig +#ifdef HAVE_BONJOUR
     16  11510  padraig +static void resolve_socket_event(AvahiWatch *w, int fd, AvahiWatchEvent events,
     17  11510  padraig +void *userdata) {
     18  11510  padraig +    AvahiSRecordBrowser *b = userdata;
     19  11510  padraig +    DNSServiceErrorType ret;
     20  11510  padraig +    DNSServiceRef client;
     21  11510  padraig +
     22  11510  padraig +    assert(w);
     23  11510  padraig +    assert(fd >= 0);
     24  11510  padraig +    assert(events & AVAHI_WATCH_IN);
     25  11510  padraig +
     26  11510  padraig +    assert (fd == DNSServiceRefSockFD(b->client));
     27  11510  padraig +
     28  11510  padraig +    ret = DNSServiceProcessResult(b->client);
     29  11510  padraig +    if (ret != kDNSServiceErr_NoError) {
     30  11510  padraig +        if (b->watch) {
     31  11510  padraig +            b->server->poll_api->watch_free(b->watch);
     32  11510  padraig +            b->watch = NULL;
     33  11510  padraig +        }
     34  11510  padraig +        DNSServiceRefDeallocate(b->client);
     35  11510  padraig +        b->client = NULL;
     36  11510  padraig +        avahi_server_set_errno(b->server, AVAHI_ERR_DISCONNECTED);
     37  11510  padraig +        b->callback(b, b->interface, b->protocol, AVAHI_BROWSER_FAILURE, NULL, 0, b->userdata);
     38  11510  padraig +    }
     39  11510  padraig +}
     40  11510  padraig +
     41  11510  padraig +static void resolve_error_callback(AvahiTimeEvent *e, void *userdata) {
     42  11510  padraig +    AvahiSRecordBrowser *b = userdata;
     43  11510  padraig +
     44  11510  padraig +    if (b->defer_time_event) {
     45  11510  padraig +        avahi_time_event_free(b->defer_time_event);
     46  11510  padraig +        b->defer_time_event = NULL;
     47  11510  padraig +    }
     48  11510  padraig +    avahi_server_set_errno(b->server, AVAHI_ERR_FAILURE);
     49  11510  padraig +    b->callback(
     50  11510  padraig +        b, b->interface, b->protocol, AVAHI_BROWSER_FAILURE, NULL,
     51  11510  padraig +        0,
     52  11510  padraig +        b->userdata);
     53  11510  padraig +}
     54  11510  padraig +
     55  11510  padraig +static void browse_reply(DNSServiceRef client, DNSServiceFlags flags, uint32_t ifIndex, DNSServiceErrorType errorCode,
     56  11510  padraig +        const char *fullname, uint16_t rrtype, uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, void *context) {
     57  11510  padraig +    AvahiSRecordBrowser *b = context;
     58  11510  padraig +    AvahiRecord *rr;
     59  11510  padraig +    AvahiKey *k;
     60  11510  padraig +
     61  11510  padraig +    k = avahi_key_new(fullname, rrclass, rrtype);
     62  11510  padraig +    rr = avahi_record_new(k, ttl);
     63  11510  padraig +    if (avahi_rdata_parse(rr, rdata, rdlen) != 0) {
     64  11510  padraig +        printf("parse failed\n");
     65  11510  padraig +        return;
     66  11510  padraig +    }
     67  11510  padraig +    b->callback(b, b->interface, b->protocol, AVAHI_BROWSER_NEW, rr, 0, b->userdata);
     68  11510  padraig +    avahi_record_unref(rr);
     69  11510  padraig +}
     70  11510  padraig +
     71  11510  padraig +static void avahi_browse_record_start(AvahiSRecordBrowser *b) {
     72  11510  padraig +    DNSServiceErrorType ret;
     73  11510  padraig +    DNSServiceFlags flags;
     74  11510  padraig +
     75  11510  padraig +    if (b->flags != AVAHI_LOOKUP_USE_WIDE_AREA)
     76  11510  padraig +        flags = kDNSServiceFlagsForceMulticast;
     77  11510  padraig +    else
     78  11510  padraig +        flags = 0;
     79  11510  padraig +
     80  11510  padraig +    ret = DNSServiceQueryRecord(&b->client,
     81  11510  padraig +                                0,
     82  11510  padraig +                                b->interface == AVAHI_IF_UNSPEC ?
     83  11510  padraig +                                    kDNSServiceInterfaceIndexAny :
     84  11510  padraig +                                    b->interface,
     85  11510  padraig +                                b->key->name,
     86  11510  padraig +                                b->key->type,
     87  11510  padraig +                                b->key->clazz,
     88  11510  padraig +                                browse_reply,
     89  11510  padraig +                                b);
     90  11510  padraig +    if (ret != kDNSServiceErr_NoError || !b->client) {
     91  11510  padraig +        b->defer_time_event = avahi_time_event_new(b->server->time_event_queue,
     92  11510  padraig +NULL, resolve_error_callback, b);
     93  11510  padraig +    } else {
     94  11510  padraig +        b->defer_time_event = NULL;
     95  11510  padraig +        b->watch = b->server->poll_api->watch_new(b->server->poll_api, DNSServiceRefSockFD(b->client), AVAHI_WATCH_IN, resolve_socket_event, b);
     96  11510  padraig +    }
     97  11510  padraig +}
     98  11510  padraig +#endif
     99  11510  padraig +
    100  11510  padraig  AvahiSRecordBrowser *avahi_s_record_browser_new(
    101  11510  padraig      AvahiServer *server,
    102  11510  padraig      AvahiIfIndex interface,
    103  11510  padraig @@ -561,10 +647,15 @@
    104  11510  padraig      b->root_lookup = NULL;
    105  11510  padraig      
    106  11510  padraig      AVAHI_LLIST_PREPEND(AvahiSRecordBrowser, browser, server->record_browsers, b);
    107  11510  padraig -
    108  11510  padraig +#ifdef HAVE_BONJOUR
    109  11510  padraig +    b->watch = NULL;
    110  11510  padraig +    b->client = NULL;
    111  11510  padraig +    avahi_browse_record_start(b);
    112  11510  padraig +#else
    113  11510  padraig      /* The currently cached entries are scanned a bit later, and than we will start querying, too */
    114  11510  padraig      b->defer_time_event = avahi_time_event_new(server->time_event_queue, NULL, defer_callback, b);
    115  11510  padraig      assert(b->defer_time_event);
    116  11510  padraig +#endif
    117  11510  padraig      
    118  11510  padraig      return b;
    119  11510  padraig  }
    120  11510  padraig @@ -577,6 +668,13 @@
    121  11510  padraig      b->server->need_browser_cleanup = 1;
    122  11510  padraig  
    123  11510  padraig      browser_cancel(b);
    124  11510  padraig +#ifdef HAVE_BONJOUR
    125  11510  padraig +    if (b->watch)
    126  11510  padraig +        b->server->poll_api->watch_free(b->watch);
    127  11510  padraig +
    128  11510  padraig +    if (b->client)
    129  11510  padraig +        DNSServiceRefDeallocate(b->client);
    130  11510  padraig +#endif
    131  11510  padraig  }
    132  11510  padraig  
    133  11510  padraig  void avahi_s_record_browser_destroy(AvahiSRecordBrowser *b) {
    134  11510  padraig @@ -610,6 +708,8 @@
    135  11510  padraig  
    136  11510  padraig      if (server->wide_area_lookup_engine)
    137  11510  padraig          avahi_wide_area_cleanup(server->wide_area_lookup_engine);
    138  11510  padraig +#ifndef HAVE_BONJOUR
    139  11510  padraig      avahi_multicast_lookup_engine_cleanup(server->multicast_lookup_engine);
    140  11510  padraig +#endif
    141  11510  padraig  }
    142  11510  padraig  
    143  11510  padraig --- /usr/tmp/clean/avahi-0.6.12/avahi-core/browse.h	2005-10-25 00:44:41.000000000 +0100
    144  11510  padraig +++ avahi-0.6.12/avahi-core/browse.h	2006-08-24 09:21:09.326626000 +0100
    145  11510  padraig @@ -52,6 +52,11 @@
    146  11510  padraig      unsigned n_lookups;
    147  11510  padraig  
    148  11510  padraig      AvahiSRBLookup *root_lookup;
    149  11510  padraig +
    150  11510  padraig +#ifdef HAVE_BONJOUR
    151  11510  padraig +    DNSServiceRef client;
    152  11510  padraig +    AvahiWatch *watch;
    153  11510  padraig +#endif
    154  11510  padraig  };
    155  11510  padraig  
    156  11510  padraig  void avahi_browser_cleanup(AvahiServer *server);
    157