Ticket #270: add-query-record-A-AAAA.diff

File add-query-record-A-AAAA.diff, 6.9 KB (added by AlfonsName, 3 years ago)

patch against 0.6.23-4ubuntu4 but also applies to plain 0.6.25

Line 
1diff -r -c --show-c-function avahi-0.6.23.old/avahi-compat-libdns_sd/compat.c avahi-0.6.23/avahi-compat-libdns_sd/compat.c
2*** avahi-0.6.23.old/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-25 03:09:52.000000000 +0200
4*************** struct _DNSServiceRef_t {
5*** 79,84 ****
6--- 79,85 ----
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*************** static void generic_client_callback(Avah
15*** 584,589 ****
16--- 585,592 ----
17                  sdref->service_resolver_callback(sdref, 0, 0, error, NULL, NULL, 0, 0, NULL, sdref->context);
18              else if (sdref->domain_browser_callback)
19                  sdref->domain_browser_callback(sdref, 0, 0, error, NULL, sdref->context);
20+             else if (sdref->query_resolver_callback)
21+                 sdref->query_resolver_callback(sdref, 0, 0, error, NULL, 0, 0, 0, NULL, 0, sdref->context);
22 
23              break;
24 
25*************** finish:
26*** 1267,1269 ****
27--- 1270,1410 ----
28      return ret;
29  }
30 
31+ static void query_resolver_callback(
32+     AvahiServiceResolver *r,
33+     AvahiIfIndex interface,
34+     AvahiProtocol protocol,
35+     AvahiResolverEvent event,
36+     const char *name,
37+     const char *type,
38+     const char *domain,
39+     AVAHI_GCC_UNUSED const char *host_name,
40+     const AvahiAddress *a,
41+     AVAHI_GCC_UNUSED uint16_t port,
42+     AVAHI_GCC_UNUSED AvahiStringList *txt,
43+     AVAHI_GCC_UNUSED AvahiLookupResultFlags flags,
44+     void *userdata) {
45+
46+     DNSServiceRef sdref = userdata;
47+
48+     assert(r);
49+     assert(sdref);
50+     assert(sdref->n_ref >= 1);
51+
52+     switch (event) {
53+         case AVAHI_RESOLVER_FOUND: {
54+
55+             char full_name[AVAHI_DOMAIN_NAME_MAX];
56+             int ret;
57+             char *p = NULL;
58+             size_t l = 0;
59+             
60+             ret = avahi_service_name_join(full_name, sizeof(full_name), name, type, domain);
61+             assert(ret == AVAHI_OK);
62+
63+             strcat(full_name, ".");
64+
65+             uint16_t rrclass = kDNSServiceClass_IN;
66+             uint16_t rrtype = kDNSServiceType_ANY;
67+             
68+             if (a->proto == AVAHI_PROTO_INET6) {
69+               rrtype = kDNSServiceType_AAAA;
70+               l = 16;
71+               p = avahi_memdup(&a->data.ipv6, l);
72+             } else if (a->proto == AVAHI_PROTO_INET) {
73+               rrtype = kDNSServiceType_A;
74+               l = 4;
75+               p = avahi_memdup(&a->data.ipv4, l);
76+             }
77+                         
78+             sdref->query_resolver_callback(sdref, 0, interface, kDNSServiceErr_NoError, full_name, rrtype, rrclass, l, (unsigned char*) p, 0, sdref->context);
79+
80+             avahi_free(p);
81+             break;
82+         }
83+
84+         case AVAHI_RESOLVER_FAILURE:
85+             sdref->query_resolver_callback(sdref, 0, interface, map_error(avahi_client_errno(sdref->client)), NULL, 0, 0, 0, NULL, 0, sdref->context);
86+             break;
87+     }
88+ }
89+
90+ DNSServiceErrorType DNSSD_API DNSServiceQueryRecord (
91+     DNSServiceRef *ret_sdref,
92+     DNSServiceFlags flags,
93+     uint32_t interface,
94+     const char *fullname,
95+     uint16_t rrtype,
96+     uint16_t rrclass,
97+     DNSServiceQueryRecordReply callback,
98+     void *context) {
99+
100+     DNSServiceErrorType ret = kDNSServiceErr_Unknown;
101+     int error;
102+     DNSServiceRef sdref = NULL;
103+     AvahiIfIndex ifindex;
104+
105+     AVAHI_WARN_LINKAGE;
106+
107+     if (!ret_sdref || !fullname)
108+         return kDNSServiceErr_BadParam;
109+     *ret_sdref = NULL;
110+
111+     if (interface == kDNSServiceInterfaceIndexLocalOnly || flags != 0) {
112+         AVAHI_WARN_UNSUPPORTED;
113+         return kDNSServiceErr_Unsupported;
114+     }
115+
116+     char name[AVAHI_LABEL_MAX], type[AVAHI_DOMAIN_NAME_MAX], domain[AVAHI_DOMAIN_NAME_MAX];
117+     if (avahi_service_name_split(fullname, name, sizeof(name), type, sizeof(type), domain, sizeof(domain)) < 0) {
118+         return kDNSServiceErr_BadParam;
119+     }
120+     
121+     AvahiProtocol prot;
122+     if (rrtype ==  kDNSServiceType_AAAA && rrclass == kDNSServiceClass_IN) {
123+         // IPv6
124+         prot = AVAHI_PROTO_INET6;
125+     } else if(rrtype ==  kDNSServiceType_A && rrclass == kDNSServiceClass_IN) {
126+         // IPv4
127+         prot = AVAHI_PROTO_INET;
128+     } else if(rrtype ==  kDNSServiceType_ANY && rrclass == kDNSServiceClass_IN) {
129+         // IPv4
130+         prot = AVAHI_PROTO_UNSPEC;
131+     } else {
132+       AVAHI_WARN_UNSUPPORTED;
133+       return kDNSServiceErr_Unsupported;
134+     }
135+
136+     if (!(sdref = sdref_new()))
137+         return kDNSServiceErr_Unknown;
138+
139+     sdref->context = context;
140+     sdref->query_resolver_callback = callback;
141+
142+     ASSERT_SUCCESS(pthread_mutex_lock(&sdref->mutex));
143+     
144+     if (!(sdref->client = avahi_client_new(avahi_simple_poll_get(sdref->simple_poll), 0, generic_client_callback, sdref, &error))) {
145+         ret =  map_error(error);
146+         goto finish;
147+     }
148+
149+     ifindex = interface == kDNSServiceInterfaceIndexAny ? AVAHI_IF_UNSPEC : (AvahiIfIndex) interface;
150+     
151+     if (!(sdref->service_resolver = avahi_service_resolver_new(sdref->client, ifindex, AVAHI_PROTO_UNSPEC, name, type, domain, prot, 0, query_resolver_callback, sdref))) {
152+         ret = map_error(avahi_client_errno(sdref->client));
153+         goto finish;
154+     }
155+     
156+     ret = kDNSServiceErr_NoError;
157+     *ret_sdref = sdref;
158+                                                               
159+ finish:
160+
161+     ASSERT_SUCCESS(pthread_mutex_unlock(&sdref->mutex));
162+     
163+     if (ret != kDNSServiceErr_NoError)
164+         DNSServiceRefDeallocate(sdref);
165+
166+     return ret;
167+ }
168+
169diff -r -c --show-c-function avahi-0.6.23.old/avahi-compat-libdns_sd/unsupported.c avahi-0.6.23/avahi-compat-libdns_sd/unsupported.c
170*** avahi-0.6.23.old/avahi-compat-libdns_sd/unsupported.c   2008-06-18 01:13:44.000000000 +0200
171--- avahi-0.6.23/avahi-compat-libdns_sd/unsupported.c   2009-06-25 00:38:21.000000000 +0200
172*************** DNSServiceErrorType DNSSD_API DNSService
173*** 47,67 ****
174      return kDNSServiceErr_Unsupported;
175  }
176 
177- DNSServiceErrorType DNSSD_API DNSServiceQueryRecord (
178-     AVAHI_GCC_UNUSED DNSServiceRef *sdRef,
179-     AVAHI_GCC_UNUSED DNSServiceFlags flags,
180-     AVAHI_GCC_UNUSED uint32_t interfaceIndex,
181-     AVAHI_GCC_UNUSED const char *fullname,
182-     AVAHI_GCC_UNUSED uint16_t rrtype,
183-     AVAHI_GCC_UNUSED uint16_t rrclass,
184-     AVAHI_GCC_UNUSED DNSServiceQueryRecordReply callBack,
185-     AVAHI_GCC_UNUSED void *context) {
186-
187-     AVAHI_WARN_UNSUPPORTED;
188-     
189-     return kDNSServiceErr_Unsupported;
190- }
191-
192  DNSServiceErrorType DNSSD_API DNSServiceReconfirmRecord (
193      AVAHI_GCC_UNUSED DNSServiceFlags flags,
194      AVAHI_GCC_UNUSED uint32_t interfaceIndex,
195--- 47,52 ----