|
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); |