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