Ticket #270: add-query-record-universal.diff

File add-query-record-universal.diff, 8.8 KB (added by AlfonsName, 3 years ago)

add support for all record types supported by avahi

Line 
1diff -r -c --show-c-function avahi-0.6.25/avahi-compat-libdns_sd/compat.c avahi-0.6.23/avahi-compat-libdns_sd/compat.c
2*** avahi-0.6.25/avahi-compat-libdns_sd/compat.c    2008-06-18 01:13:44.000000000 +0200
3--- avahi-0.6.23/avahi-compat-libdns_sd/compat.c    2009-06-27 01:47:38.000000000 +0200
4*************** struct _DNSServiceRef_t {
5*** 79,89 ****
6--- 79,91 ----
7      DNSServiceResolveReply service_resolver_callback;
8      DNSServiceDomainEnumReply domain_browser_callback;
9      DNSServiceRegisterReply service_register_callback;
10+     DNSServiceQueryRecordReply query_resolver_callback;
11 
12      AvahiClient *client;
13      AvahiServiceBrowser *service_browser;
14      AvahiServiceResolver *service_resolver;
15      AvahiDomainBrowser *domain_browser;
16+     AvahiRecordBrowser *record_browser;
17 
18      struct type_info type_info;
19      char *service_name, *service_name_chosen, *service_domain, *service_host;
20*************** static void generic_client_callback(Avah
21*** 584,589 ****
22--- 586,593 ----
23                  sdref->service_resolver_callback(sdref, 0, 0, error, NULL, NULL, 0, 0, NULL, sdref->context);
24              else if (sdref->domain_browser_callback)
25                  sdref->domain_browser_callback(sdref, 0, 0, error, NULL, sdref->context);
26+             else if (sdref->query_resolver_callback)
27+                 sdref->query_resolver_callback(sdref, 0, 0, error, NULL, 0, 0, 0, NULL, 0, sdref->context);
28 
29              break;
30 
31*************** finish:
32*** 1267,1269 ****
33--- 1271,1463 ----
34      return ret;
35  }
36 
37+ static void query_resolver_callback(
38+     AvahiRecordBrowser *r,
39+     AvahiIfIndex interface,
40+     AVAHI_GCC_UNUSED AvahiProtocol protocol,
41+     AvahiBrowserEvent event,
42+     const char *name,
43+     uint16_t clazz,
44+       uint16_t type,
45+       const void* rdata,
46+       size_t size,
47+     AVAHI_GCC_UNUSED AvahiLookupResultFlags flags,
48+     void *userdata) {
49+
50+     DNSServiceRef sdref = userdata;
51+
52+     assert(r);
53+     assert(sdref);
54+     assert(sdref->n_ref >= 1);
55+
56+     switch (event) {
57+         case AVAHI_BROWSER_NEW:
58+               case AVAHI_BROWSER_REMOVE:
59+               {
60+                       DNSServiceFlags qflags = 0;
61+                       if (event == AVAHI_BROWSER_NEW)
62+                           qflags |= kDNSServiceFlagsAdd;
63+
64+             uint16_t rrclass;
65+             uint16_t rrtype;
66+             
67+                       switch(type)
68+                       {
69+                       case AVAHI_DNS_CLASS_IN: rrclass = kDNSServiceClass_IN; break;
70+                       default: assert(0);
71+                       }
72+
73+                       switch(clazz) {
74+                   case AVAHI_DNS_TYPE_A: rrtype = kDNSServiceType_A; break;
75+                   case AVAHI_DNS_TYPE_NS: rrtype = kDNSServiceType_NS; break;
76+                   case AVAHI_DNS_TYPE_CNAME: rrtype = kDNSServiceType_CNAME; break;
77+                   case AVAHI_DNS_TYPE_SOA: rrtype = kDNSServiceType_SOA; break;
78+                   case AVAHI_DNS_TYPE_PTR: rrtype = kDNSServiceType_PTR; break;
79+                   case AVAHI_DNS_TYPE_HINFO: rrtype = kDNSServiceType_HINFO; break;
80+                   case AVAHI_DNS_TYPE_MX: rrtype = kDNSServiceType_MX; break;
81+                   case AVAHI_DNS_TYPE_TXT: rrtype = kDNSServiceType_TXT; break;
82+                   case AVAHI_DNS_TYPE_AAAA: rrtype = kDNSServiceType_AAAA; break;
83+                   case AVAHI_DNS_TYPE_SRV: rrtype = kDNSServiceType_SRV; break;
84+                       default: assert(0);
85+                       }
86+
87+             sdref->query_resolver_callback(sdref, qflags, interface, kDNSServiceErr_NoError, name, rrtype, rrclass, size, rdata, 0, sdref->context);
88+
89+             break;
90+         }
91+               case AVAHI_BROWSER_ALL_FOR_NOW:
92+               case AVAHI_BROWSER_CACHE_EXHAUSTED:
93+                       /* not implemented */
94+                       break;
95+               case AVAHI_BROWSER_FAILURE:
96+             sdref->query_resolver_callback(sdref, 0, interface, map_error(avahi_client_errno(sdref->client)), NULL, 0, 0, 0, NULL, 0, sdref->context);
97+             break;
98+     }
99+ }
100+
101+ DNSServiceErrorType DNSSD_API DNSServiceQueryRecord (
102+     DNSServiceRef *ret_sdref,
103+     DNSServiceFlags flags,
104+     uint32_t interface,
105+     const char *fullname,
106+     uint16_t rrtype,
107+     uint16_t rrclass,
108+     DNSServiceQueryRecordReply callback,
109+     void *context) {
110+
111+     DNSServiceErrorType ret = kDNSServiceErr_Unknown;
112+     int error;
113+     DNSServiceRef sdref = NULL;
114+     AvahiIfIndex ifindex;
115+
116+     AVAHI_WARN_LINKAGE;
117+
118+     if (!ret_sdref || !fullname)
119+         return kDNSServiceErr_BadParam;
120+     *ret_sdref = NULL;
121+
122+     if (interface == kDNSServiceInterfaceIndexLocalOnly || flags != 0) {
123+         AVAHI_WARN_UNSUPPORTED;
124+         return kDNSServiceErr_Unsupported;
125+     }
126+
127+       uint16_t clazz;
128+       switch (rrclass)
129+       {
130+       case kDNSServiceClass_IN:
131+               clazz = AVAHI_DNS_CLASS_IN;
132+               break;
133+       default:
134+               AVAHI_WARN_UNSUPPORTED;
135+               return kDNSServiceErr_Unsupported;
136+       }
137+
138+       uint16_t type;
139+       switch (rrtype) {
140+     case kDNSServiceType_A: type = AVAHI_DNS_TYPE_A; break;
141+     case kDNSServiceType_NS: type = AVAHI_DNS_TYPE_NS; break;
142+     case kDNSServiceType_CNAME: type = AVAHI_DNS_TYPE_CNAME; break;
143+     case kDNSServiceType_SOA: type = AVAHI_DNS_TYPE_SOA; break;
144+     case kDNSServiceType_PTR: type = AVAHI_DNS_TYPE_PTR; break;
145+     case kDNSServiceType_HINFO: type = AVAHI_DNS_TYPE_HINFO; break;
146+     case kDNSServiceType_MX: type = AVAHI_DNS_TYPE_MX; break;
147+     case kDNSServiceType_TXT: type = AVAHI_DNS_TYPE_TXT; break;
148+     case kDNSServiceType_AAAA: type = AVAHI_DNS_TYPE_AAAA; break;
149+     case kDNSServiceType_SRV: type = AVAHI_DNS_TYPE_SRV; break;
150+     
151+       case kDNSServiceType_MD:
152+     case kDNSServiceType_MF:
153+     case kDNSServiceType_MB:
154+     case kDNSServiceType_MG:
155+     case kDNSServiceType_MR:
156+     case kDNSServiceType_NULL:
157+     case kDNSServiceType_WKS:
158+     case kDNSServiceType_MINFO:
159+     case kDNSServiceType_RP:
160+     case kDNSServiceType_AFSDB:
161+     case kDNSServiceType_X25:
162+     case kDNSServiceType_ISDN:
163+     case kDNSServiceType_RT:
164+     case kDNSServiceType_NSAP:
165+     case kDNSServiceType_NSAP_PTR:
166+     case kDNSServiceType_SIG:
167+     case kDNSServiceType_KEY:
168+     case kDNSServiceType_PX:
169+     case kDNSServiceType_GPOS:
170+     case kDNSServiceType_LOC:
171+     case kDNSServiceType_NXT:
172+     case kDNSServiceType_EID:
173+     case kDNSServiceType_NIMLOC:
174+     case kDNSServiceType_ATMA:
175+     case kDNSServiceType_NAPTR:
176+     case kDNSServiceType_KX:
177+     case kDNSServiceType_CERT:
178+     case kDNSServiceType_A6:
179+     case kDNSServiceType_DNAME:
180+     case kDNSServiceType_SINK:
181+     case kDNSServiceType_OPT:
182+     case kDNSServiceType_TKEY:
183+     case kDNSServiceType_TSIG:
184+     case kDNSServiceType_IXFR:
185+     case kDNSServiceType_AXFR:
186+     case kDNSServiceType_MAILB:
187+     case kDNSServiceType_MAILA:
188+     case kDNSServiceType_ANY:
189+     default:
190+       AVAHI_WARN_UNSUPPORTED;
191+       return kDNSServiceErr_Unsupported;
192+     }
193+
194+     if (!(sdref = sdref_new()))
195+         return kDNSServiceErr_Unknown;
196+
197+     sdref->context = context;
198+     sdref->query_resolver_callback = callback;
199+
200+     ASSERT_SUCCESS(pthread_mutex_lock(&sdref->mutex));
201+     
202+     if (!(sdref->client = avahi_client_new(avahi_simple_poll_get(sdref->simple_poll), 0, generic_client_callback, sdref, &error))) {
203+         ret =  map_error(error);
204+         goto finish;
205+     }
206+
207+     ifindex = interface == kDNSServiceInterfaceIndexAny ? AVAHI_IF_UNSPEC : (AvahiIfIndex) interface;
208+     
209+     if (!(sdref->record_browser = avahi_record_browser_new(sdref->client, ifindex, AVAHI_PROTO_UNSPEC, fullname, clazz, type, 0, query_resolver_callback, sdref))) {
210+         ret = map_error(avahi_client_errno(sdref->client));
211+         goto finish;
212+     }
213+     
214+     ret = kDNSServiceErr_NoError;
215+     *ret_sdref = sdref;
216+                                                               
217+ finish:
218+
219+     ASSERT_SUCCESS(pthread_mutex_unlock(&sdref->mutex));
220+     
221+     if (ret != kDNSServiceErr_NoError)
222+         DNSServiceRefDeallocate(sdref);
223+
224+     return ret;
225+ }
226+
227diff -r -c --show-c-function avahi-0.6.25/avahi-compat-libdns_sd/unsupported.c avahi-0.6.23/avahi-compat-libdns_sd/unsupported.c
228*** avahi-0.6.25/avahi-compat-libdns_sd/unsupported.c   2008-06-18 01:13:44.000000000 +0200
229--- avahi-0.6.23/avahi-compat-libdns_sd/unsupported.c   2009-06-27 00:49:57.000000000 +0200
230*************** DNSServiceErrorType DNSSD_API DNSService
231*** 47,67 ****
232      return kDNSServiceErr_Unsupported;
233  }
234 
235- DNSServiceErrorType DNSSD_API DNSServiceQueryRecord (
236-     AVAHI_GCC_UNUSED DNSServiceRef *sdRef,
237-     AVAHI_GCC_UNUSED DNSServiceFlags flags,
238-     AVAHI_GCC_UNUSED uint32_t interfaceIndex,
239-     AVAHI_GCC_UNUSED const char *fullname,
240-     AVAHI_GCC_UNUSED uint16_t rrtype,
241-     AVAHI_GCC_UNUSED uint16_t rrclass,
242-     AVAHI_GCC_UNUSED DNSServiceQueryRecordReply callBack,
243-     AVAHI_GCC_UNUSED void *context) {
244-
245-     AVAHI_WARN_UNSUPPORTED;
246-     
247-     return kDNSServiceErr_Unsupported;
248- }
249-
250  DNSServiceErrorType DNSSD_API DNSServiceReconfirmRecord (
251      AVAHI_GCC_UNUSED DNSServiceFlags flags,
252      AVAHI_GCC_UNUSED uint32_t interfaceIndex,
253--- 47,52 ----