xref: /aosp_15_r20/external/libcups/vcnet/dns_sd.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker  * Dynamic wrapper for Bonjour SDK for Windows.
3*5e7646d2SAndroid Build Coastguard Worker  *
4*5e7646d2SAndroid Build Coastguard Worker  * Copyright 2018 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker  *
6*5e7646d2SAndroid Build Coastguard Worker  * Licensed under Apache License v2.0.  See the file "LICENSE" for more
7*5e7646d2SAndroid Build Coastguard Worker  * information.
8*5e7646d2SAndroid Build Coastguard Worker  */
9*5e7646d2SAndroid Build Coastguard Worker 
10*5e7646d2SAndroid Build Coastguard Worker //#include <cups/http-private.h>
11*5e7646d2SAndroid Build Coastguard Worker #include <cups/thread-private.h>
12*5e7646d2SAndroid Build Coastguard Worker #include "dns_sd.h"
13*5e7646d2SAndroid Build Coastguard Worker 
14*5e7646d2SAndroid Build Coastguard Worker 
15*5e7646d2SAndroid Build Coastguard Worker /*
16*5e7646d2SAndroid Build Coastguard Worker  * Pointers for functions...
17*5e7646d2SAndroid Build Coastguard Worker  */
18*5e7646d2SAndroid Build Coastguard Worker 
19*5e7646d2SAndroid Build Coastguard Worker static int		dnssd_initialized = 0;
20*5e7646d2SAndroid Build Coastguard Worker static _cups_mutex_t	dnssd_mutex = _CUPS_MUTEX_INITIALIZER;
21*5e7646d2SAndroid Build Coastguard Worker static DNSServiceErrorType (*dnssd_add_record)(DNSServiceRef sdRef, DNSRecordRef *RecordRef, DNSServiceFlags flags, uint16_t rrtype, uint16_t rdlen, const void *rdata, uint32_t ttl);
22*5e7646d2SAndroid Build Coastguard Worker static DNSServiceErrorType (*dnssd_browse)(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, const char *regtype, const char *domain, DNSServiceBrowseReply callBack, void *context);
23*5e7646d2SAndroid Build Coastguard Worker static DNSServiceErrorType (*dnssd_construct_full_name)(char * const fullName, const char * const service, const char * const regtype, const char * const domain);
24*5e7646d2SAndroid Build Coastguard Worker static DNSServiceErrorType (*dnssd_create_connection)(DNSServiceRef *sdRef);
25*5e7646d2SAndroid Build Coastguard Worker static DNSServiceErrorType (*dnssd_process_result)(DNSServiceRef sdRef);
26*5e7646d2SAndroid Build Coastguard Worker static DNSServiceErrorType (*dnssd_query_record)(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, const char *fullname, uint16_t rrtype, uint16_t rrclass, DNSServiceQueryRecordReply callBack, void *context);
27*5e7646d2SAndroid Build Coastguard Worker static void (*dnssd_deallocate)(DNSServiceRef sdRef);
28*5e7646d2SAndroid Build Coastguard Worker static int (*dnssd_sock_fd)(DNSServiceRef sdRef);
29*5e7646d2SAndroid Build Coastguard Worker static DNSServiceErrorType (*dnssd_register)(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, const char *name, const char *regtype, const char *domain, const char *host, uint16_t port, uint16_t txtLen, const void *txtRecord, DNSServiceRegisterReply callBack, void *context);
30*5e7646d2SAndroid Build Coastguard Worker static DNSServiceErrorType (*dnssd_remove_record)(DNSServiceRef sdRef, DNSRecordRef RecordRef, DNSServiceFlags flags);
31*5e7646d2SAndroid Build Coastguard Worker static DNSServiceErrorType (*dnssd_resolve)(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, const char *name, const char *regtype, const char *domain, DNSServiceResolveReply callBack, void *context);
32*5e7646d2SAndroid Build Coastguard Worker static DNSServiceErrorType (*dnssd_update_record)(DNSServiceRef sdRef, DNSRecordRef RecordRef, DNSServiceFlags flags, uint16_t rdlen, const void *rdata, uint32_t ttl);
33*5e7646d2SAndroid Build Coastguard Worker 
34*5e7646d2SAndroid Build Coastguard Worker static void (*dnssd_txt_create)(TXTRecordRef *txtRecord, uint16_t bufferLen, void *buffer);
35*5e7646d2SAndroid Build Coastguard Worker static void (*dnssd_txt_deallocate)(TXTRecordRef *txtRecord);
36*5e7646d2SAndroid Build Coastguard Worker static const void *(*dnssd_txt_get_bytes_ptr)(const TXTRecordRef *txtRecord);
37*5e7646d2SAndroid Build Coastguard Worker static uint16_t (*dnssd_txt_get_count)(uint16_t txtLen, const void *txtRecord);
38*5e7646d2SAndroid Build Coastguard Worker static uint16_t (*dnssd_txt_get_length)(const TXTRecordRef *txtRecord);
39*5e7646d2SAndroid Build Coastguard Worker static DNSServiceErrorType (*dnssd_txt_get_item_at_index)(uint16_t txtLen, const void *txtRecord, uint16_t itemIndex, uint16_t keyBufLen, char *key, uint8_t *valueLen, const void **value);
40*5e7646d2SAndroid Build Coastguard Worker static const void *(*dnssd_txt_get_value_ptr)(uint16_t txtLen, const void *txtRecord, const char *key, uint8_t *valueLen);
41*5e7646d2SAndroid Build Coastguard Worker static DNSServiceErrorType (*dnssd_txt_set_value)(TXTRecordRef *txtRecord, const char *key, uint8_t valueSize, const void *value);
42*5e7646d2SAndroid Build Coastguard Worker 
43*5e7646d2SAndroid Build Coastguard Worker 
44*5e7646d2SAndroid Build Coastguard Worker /*
45*5e7646d2SAndroid Build Coastguard Worker  * Function to initialize pointers...
46*5e7646d2SAndroid Build Coastguard Worker  */
47*5e7646d2SAndroid Build Coastguard Worker 
48*5e7646d2SAndroid Build Coastguard Worker static void
dnssd_init(void)49*5e7646d2SAndroid Build Coastguard Worker dnssd_init(void)
50*5e7646d2SAndroid Build Coastguard Worker {
51*5e7646d2SAndroid Build Coastguard Worker   _cupsMutexLock(&dnssd_mutex);
52*5e7646d2SAndroid Build Coastguard Worker   if (!dnssd_initialized)
53*5e7646d2SAndroid Build Coastguard Worker   {
54*5e7646d2SAndroid Build Coastguard Worker     HINSTANCE	dll_handle = LoadLibraryA("dnssd.dll");
55*5e7646d2SAndroid Build Coastguard Worker 
56*5e7646d2SAndroid Build Coastguard Worker     if (dll_handle)
57*5e7646d2SAndroid Build Coastguard Worker     {
58*5e7646d2SAndroid Build Coastguard Worker       dnssd_add_record          = (DNSServiceErrorType (*)(DNSServiceRef, DNSRecordRef *, DNSServiceFlags, uint16_t, uint16_t, const void *, uint32_t))GetProcAddress(dll_handle, "DNSServiceAddRecord");
59*5e7646d2SAndroid Build Coastguard Worker       dnssd_browse              = (DNSServiceErrorType(*)(DNSServiceRef *, DNSServiceFlags, uint32_t, const char *, const char *, DNSServiceBrowseReply, void *))GetProcAddress(dll_handle, "DNSServiceBrowse");
60*5e7646d2SAndroid Build Coastguard Worker       dnssd_construct_full_name = (DNSServiceErrorType(*)(char * const, const char * const, const char * const, const char * const))GetProcAddress(dll_handle, "DNSServiceConstructFullName");
61*5e7646d2SAndroid Build Coastguard Worker       dnssd_create_connection   = (DNSServiceErrorType(*)(DNSServiceRef *))GetProcAddress(dll_handle, "DNSServiceCreateConnection");
62*5e7646d2SAndroid Build Coastguard Worker       dnssd_deallocate          = (DNSServiceErrorType(*)(DNSServiceRef))GetProcAddress(dll_handle, "DNSServiceRefDeallocate");
63*5e7646d2SAndroid Build Coastguard Worker       dnssd_process_result      = (DNSServiceErrorType(*)(DNSServiceRef))GetProcAddress(dll_handle, "DNSServiceProcessResult");
64*5e7646d2SAndroid Build Coastguard Worker       dnssd_query_record        = (DNSServiceErrorType(*)(DNSServiceRef *, DNSServiceFlags, uint32_t, const char *, uint16_t, uint16_t, DNSServiceQueryRecordReply, void *))GetProcAddress(dll_handle, "DNSServiceQueryRecord");
65*5e7646d2SAndroid Build Coastguard Worker       dnssd_register            = (DNSServiceErrorType(*)(DNSServiceRef *, DNSServiceFlags, uint32_t, const char *, const char *, const char *, const char *, uint16_t, uint16_t, const void *, DNSServiceRegisterReply, void *))GetProcAddress(dll_handle, "DNSServiceRegister");
66*5e7646d2SAndroid Build Coastguard Worker       dnssd_remove_record       = (DNSServiceErrorType(*)(DNSServiceRef, DNSRecordRef, DNSServiceFlags))GetProcAddress(dll_handle, "DNSServiceRemoveRecord");
67*5e7646d2SAndroid Build Coastguard Worker       dnssd_resolve             = (DNSServiceErrorType(*)(DNSServiceRef *, DNSServiceFlags, uint32_t, const char *, const char *, const char *, DNSServiceResolveReply, void *))GetProcAddress(dll_handle, "DNSServiceResolve");
68*5e7646d2SAndroid Build Coastguard Worker       dnssd_sock_fd             = (int(*)(DNSServiceRef))GetProcAddress(dll_handle, "DNSServiceRefSockFD");
69*5e7646d2SAndroid Build Coastguard Worker       dnssd_update_record       = (DNSServiceErrorType(*)(DNSServiceRef, DNSRecordRef, DNSServiceFlags, uint16_t, const void *, uint32_t))GetProcAddress(dll_handle, "DNSServiceUpdateRecord");
70*5e7646d2SAndroid Build Coastguard Worker 
71*5e7646d2SAndroid Build Coastguard Worker       dnssd_txt_create          = (void (*)(TXTRecordRef *, uint16_t, void *))GetProcAddress(dll_handle, "TXTRecordCreate");
72*5e7646d2SAndroid Build Coastguard Worker       dnssd_txt_deallocate      = (void (*)(TXTRecordRef *))GetProcAddress(dll_handle, "TXTRecordDeallocate");
73*5e7646d2SAndroid Build Coastguard Worker       dnssd_txt_get_bytes_ptr   = (const void *(*)(const TXTRecordRef *))GetProcAddress(dll_handle, "TXTRecordGetBytesPtr");
74*5e7646d2SAndroid Build Coastguard Worker       dnssd_txt_get_count       = (uint16_t (*)(uint16_t, const void *))GetProcAddress(dll_handle, "TXTRecordGetCount");
75*5e7646d2SAndroid Build Coastguard Worker       dnssd_txt_get_item_at_index = (DNSServiceErrorType (*)(uint16_t, const void *, uint16_t, uint16_t, char *, uint8_t *, const void **))GetProcAddress(dll_handle, "TXTRecordGetItemAtIndex");
76*5e7646d2SAndroid Build Coastguard Worker       dnssd_txt_get_length      = (uint16_t (*)(const TXTRecordRef *))GetProcAddress(dll_handle, "TXTRecordGetLength");
77*5e7646d2SAndroid Build Coastguard Worker       dnssd_txt_get_value_ptr   = (const void *(*)(uint16_t, const void *, const char *, uint8_t *))GetProcAddress(dll_handle, "TXTRecordGetValuePtr");
78*5e7646d2SAndroid Build Coastguard Worker       dnssd_txt_set_value       = (DNSServiceErrorType (*)(TXTRecordRef *, const char *, uint8_t, const void *))GetProcAddress(dll_handle, "TXTRecordSetValue");
79*5e7646d2SAndroid Build Coastguard Worker     }
80*5e7646d2SAndroid Build Coastguard Worker 
81*5e7646d2SAndroid Build Coastguard Worker     dnssd_initialized = 1;
82*5e7646d2SAndroid Build Coastguard Worker   }
83*5e7646d2SAndroid Build Coastguard Worker   _cupsMutexUnlock(&dnssd_mutex);
84*5e7646d2SAndroid Build Coastguard Worker }
85*5e7646d2SAndroid Build Coastguard Worker 
86*5e7646d2SAndroid Build Coastguard Worker 
87*5e7646d2SAndroid Build Coastguard Worker // DNSServiceAddRecord
DNSServiceAddRecord(DNSServiceRef sdRef,DNSRecordRef * RecordRef,DNSServiceFlags flags,uint16_t rrtype,uint16_t rdlen,const void * rdata,uint32_t ttl)88*5e7646d2SAndroid Build Coastguard Worker DNSServiceErrorType DNSSD_API DNSServiceAddRecord
89*5e7646d2SAndroid Build Coastguard Worker     (
90*5e7646d2SAndroid Build Coastguard Worker     DNSServiceRef                       sdRef,
91*5e7646d2SAndroid Build Coastguard Worker     DNSRecordRef                        *RecordRef,
92*5e7646d2SAndroid Build Coastguard Worker     DNSServiceFlags                     flags,
93*5e7646d2SAndroid Build Coastguard Worker     uint16_t                            rrtype,
94*5e7646d2SAndroid Build Coastguard Worker     uint16_t                            rdlen,
95*5e7646d2SAndroid Build Coastguard Worker     const void                          *rdata,
96*5e7646d2SAndroid Build Coastguard Worker     uint32_t                            ttl
97*5e7646d2SAndroid Build Coastguard Worker     )
98*5e7646d2SAndroid Build Coastguard Worker {
99*5e7646d2SAndroid Build Coastguard Worker   if (!dnssd_initialized)
100*5e7646d2SAndroid Build Coastguard Worker     dnssd_init();
101*5e7646d2SAndroid Build Coastguard Worker 
102*5e7646d2SAndroid Build Coastguard Worker   if (dnssd_add_record)
103*5e7646d2SAndroid Build Coastguard Worker     return (*dnssd_add_record)(sdRef, RecordRef, flags, rrtype, rdlen, rdata, ttl);
104*5e7646d2SAndroid Build Coastguard Worker   else
105*5e7646d2SAndroid Build Coastguard Worker     return (kDNSServiceErr_ServiceNotRunning);
106*5e7646d2SAndroid Build Coastguard Worker }
107*5e7646d2SAndroid Build Coastguard Worker 
108*5e7646d2SAndroid Build Coastguard Worker 
109*5e7646d2SAndroid Build Coastguard Worker // DNSServiceBrowse
DNSServiceBrowse(DNSServiceRef * sdRef,DNSServiceFlags flags,uint32_t interfaceIndex,const char * regtype,const char * domain,DNSServiceBrowseReply callBack,void * context)110*5e7646d2SAndroid Build Coastguard Worker DNSServiceErrorType DNSSD_API DNSServiceBrowse
111*5e7646d2SAndroid Build Coastguard Worker     (
112*5e7646d2SAndroid Build Coastguard Worker     DNSServiceRef                       *sdRef,
113*5e7646d2SAndroid Build Coastguard Worker     DNSServiceFlags                     flags,
114*5e7646d2SAndroid Build Coastguard Worker     uint32_t                            interfaceIndex,
115*5e7646d2SAndroid Build Coastguard Worker     const char                          *regtype,
116*5e7646d2SAndroid Build Coastguard Worker     const char                          *domain,    /* may be NULL */
117*5e7646d2SAndroid Build Coastguard Worker     DNSServiceBrowseReply               callBack,
118*5e7646d2SAndroid Build Coastguard Worker     void                                *context    /* may be NULL */
119*5e7646d2SAndroid Build Coastguard Worker     )
120*5e7646d2SAndroid Build Coastguard Worker {
121*5e7646d2SAndroid Build Coastguard Worker   if (!dnssd_initialized)
122*5e7646d2SAndroid Build Coastguard Worker     dnssd_init();
123*5e7646d2SAndroid Build Coastguard Worker 
124*5e7646d2SAndroid Build Coastguard Worker   if (dnssd_browse)
125*5e7646d2SAndroid Build Coastguard Worker     return (*dnssd_browse)(sdRef, flags, interfaceIndex, regtype, domain, callBack, context);
126*5e7646d2SAndroid Build Coastguard Worker   else
127*5e7646d2SAndroid Build Coastguard Worker     return (kDNSServiceErr_ServiceNotRunning);
128*5e7646d2SAndroid Build Coastguard Worker }
129*5e7646d2SAndroid Build Coastguard Worker 
130*5e7646d2SAndroid Build Coastguard Worker 
131*5e7646d2SAndroid Build Coastguard Worker // DNSServiceConstructFullName
DNSServiceConstructFullName(char * const fullName,const char * const service,const char * const regtype,const char * const domain)132*5e7646d2SAndroid Build Coastguard Worker DNSServiceErrorType DNSSD_API DNSServiceConstructFullName
133*5e7646d2SAndroid Build Coastguard Worker     (
134*5e7646d2SAndroid Build Coastguard Worker     char                            * const fullName,
135*5e7646d2SAndroid Build Coastguard Worker     const char                      * const service,      /* may be NULL */
136*5e7646d2SAndroid Build Coastguard Worker     const char                      * const regtype,
137*5e7646d2SAndroid Build Coastguard Worker     const char                      * const domain
138*5e7646d2SAndroid Build Coastguard Worker     )
139*5e7646d2SAndroid Build Coastguard Worker {
140*5e7646d2SAndroid Build Coastguard Worker   if (!dnssd_initialized)
141*5e7646d2SAndroid Build Coastguard Worker     dnssd_init();
142*5e7646d2SAndroid Build Coastguard Worker 
143*5e7646d2SAndroid Build Coastguard Worker   if (dnssd_construct_full_name)
144*5e7646d2SAndroid Build Coastguard Worker     return (*dnssd_construct_full_name)(fullName, service, regtype, domain);
145*5e7646d2SAndroid Build Coastguard Worker   else
146*5e7646d2SAndroid Build Coastguard Worker     return (-1);
147*5e7646d2SAndroid Build Coastguard Worker }
148*5e7646d2SAndroid Build Coastguard Worker 
149*5e7646d2SAndroid Build Coastguard Worker 
150*5e7646d2SAndroid Build Coastguard Worker // DNSServiceCreateConnection
DNSServiceCreateConnection(DNSServiceRef * sdRef)151*5e7646d2SAndroid Build Coastguard Worker DNSServiceErrorType DNSSD_API DNSServiceCreateConnection(DNSServiceRef *sdRef)
152*5e7646d2SAndroid Build Coastguard Worker {
153*5e7646d2SAndroid Build Coastguard Worker   if (!dnssd_initialized)
154*5e7646d2SAndroid Build Coastguard Worker     dnssd_init();
155*5e7646d2SAndroid Build Coastguard Worker 
156*5e7646d2SAndroid Build Coastguard Worker   if (dnssd_create_connection)
157*5e7646d2SAndroid Build Coastguard Worker     return (*dnssd_create_connection)(sdRef);
158*5e7646d2SAndroid Build Coastguard Worker   else
159*5e7646d2SAndroid Build Coastguard Worker     return (kDNSServiceErr_ServiceNotRunning);
160*5e7646d2SAndroid Build Coastguard Worker }
161*5e7646d2SAndroid Build Coastguard Worker 
162*5e7646d2SAndroid Build Coastguard Worker 
163*5e7646d2SAndroid Build Coastguard Worker // DNSServiceProcessResult
DNSServiceProcessResult(DNSServiceRef sdRef)164*5e7646d2SAndroid Build Coastguard Worker DNSServiceErrorType DNSSD_API DNSServiceProcessResult(DNSServiceRef sdRef)
165*5e7646d2SAndroid Build Coastguard Worker {
166*5e7646d2SAndroid Build Coastguard Worker   if (!dnssd_initialized)
167*5e7646d2SAndroid Build Coastguard Worker     dnssd_init();
168*5e7646d2SAndroid Build Coastguard Worker 
169*5e7646d2SAndroid Build Coastguard Worker   if (dnssd_process_result)
170*5e7646d2SAndroid Build Coastguard Worker     return (*dnssd_process_result)(sdRef);
171*5e7646d2SAndroid Build Coastguard Worker   else
172*5e7646d2SAndroid Build Coastguard Worker     return (kDNSServiceErr_ServiceNotRunning);
173*5e7646d2SAndroid Build Coastguard Worker }
174*5e7646d2SAndroid Build Coastguard Worker 
175*5e7646d2SAndroid Build Coastguard Worker 
176*5e7646d2SAndroid Build Coastguard Worker // DNSServiceQueryRecord
DNSServiceQueryRecord(DNSServiceRef * sdRef,DNSServiceFlags flags,uint32_t interfaceIndex,const char * fullname,uint16_t rrtype,uint16_t rrclass,DNSServiceQueryRecordReply callBack,void * context)177*5e7646d2SAndroid Build Coastguard Worker DNSServiceErrorType DNSSD_API DNSServiceQueryRecord
178*5e7646d2SAndroid Build Coastguard Worker     (
179*5e7646d2SAndroid Build Coastguard Worker     DNSServiceRef                       *sdRef,
180*5e7646d2SAndroid Build Coastguard Worker     DNSServiceFlags                     flags,
181*5e7646d2SAndroid Build Coastguard Worker     uint32_t                            interfaceIndex,
182*5e7646d2SAndroid Build Coastguard Worker     const char                          *fullname,
183*5e7646d2SAndroid Build Coastguard Worker     uint16_t                            rrtype,
184*5e7646d2SAndroid Build Coastguard Worker     uint16_t                            rrclass,
185*5e7646d2SAndroid Build Coastguard Worker     DNSServiceQueryRecordReply          callBack,
186*5e7646d2SAndroid Build Coastguard Worker     void                                *context  /* may be NULL */
187*5e7646d2SAndroid Build Coastguard Worker     )
188*5e7646d2SAndroid Build Coastguard Worker {
189*5e7646d2SAndroid Build Coastguard Worker   if (!dnssd_initialized)
190*5e7646d2SAndroid Build Coastguard Worker     dnssd_init();
191*5e7646d2SAndroid Build Coastguard Worker 
192*5e7646d2SAndroid Build Coastguard Worker   if (dnssd_query_record)
193*5e7646d2SAndroid Build Coastguard Worker     return (*dnssd_query_record)(sdRef, flags, interfaceIndex, fullname, rrtype, rrclass, callBack, context);
194*5e7646d2SAndroid Build Coastguard Worker   else
195*5e7646d2SAndroid Build Coastguard Worker     return (kDNSServiceErr_ServiceNotRunning);
196*5e7646d2SAndroid Build Coastguard Worker }
197*5e7646d2SAndroid Build Coastguard Worker 
198*5e7646d2SAndroid Build Coastguard Worker 
199*5e7646d2SAndroid Build Coastguard Worker // DNSServiceRefDeallocate
DNSServiceRefDeallocate(DNSServiceRef sdRef)200*5e7646d2SAndroid Build Coastguard Worker void DNSSD_API DNSServiceRefDeallocate(DNSServiceRef sdRef)
201*5e7646d2SAndroid Build Coastguard Worker {
202*5e7646d2SAndroid Build Coastguard Worker   if (!dnssd_initialized)
203*5e7646d2SAndroid Build Coastguard Worker     dnssd_init();
204*5e7646d2SAndroid Build Coastguard Worker 
205*5e7646d2SAndroid Build Coastguard Worker   if (dnssd_deallocate)
206*5e7646d2SAndroid Build Coastguard Worker     (*dnssd_deallocate)(sdRef);
207*5e7646d2SAndroid Build Coastguard Worker }
208*5e7646d2SAndroid Build Coastguard Worker 
209*5e7646d2SAndroid Build Coastguard Worker 
210*5e7646d2SAndroid Build Coastguard Worker // DNSServiceRefSockFD
DNSServiceRefSockFD(DNSServiceRef sdRef)211*5e7646d2SAndroid Build Coastguard Worker int DNSSD_API DNSServiceRefSockFD(DNSServiceRef sdRef)
212*5e7646d2SAndroid Build Coastguard Worker {
213*5e7646d2SAndroid Build Coastguard Worker   if (!dnssd_initialized)
214*5e7646d2SAndroid Build Coastguard Worker     dnssd_init();
215*5e7646d2SAndroid Build Coastguard Worker 
216*5e7646d2SAndroid Build Coastguard Worker   if (dnssd_sock_fd)
217*5e7646d2SAndroid Build Coastguard Worker     return (*dnssd_sock_fd)(sdRef);
218*5e7646d2SAndroid Build Coastguard Worker   else
219*5e7646d2SAndroid Build Coastguard Worker     return (kDNSServiceErr_ServiceNotRunning);
220*5e7646d2SAndroid Build Coastguard Worker }
221*5e7646d2SAndroid Build Coastguard Worker 
222*5e7646d2SAndroid Build Coastguard Worker 
223*5e7646d2SAndroid Build Coastguard Worker // DNSServiceRegister
DNSServiceRegister(DNSServiceRef * sdRef,DNSServiceFlags flags,uint32_t interfaceIndex,const char * name,const char * regtype,const char * domain,const char * host,uint16_t port,uint16_t txtLen,const void * txtRecord,DNSServiceRegisterReply callBack,void * context)224*5e7646d2SAndroid Build Coastguard Worker DNSServiceErrorType DNSSD_API DNSServiceRegister
225*5e7646d2SAndroid Build Coastguard Worker     (
226*5e7646d2SAndroid Build Coastguard Worker     DNSServiceRef                       *sdRef,
227*5e7646d2SAndroid Build Coastguard Worker     DNSServiceFlags                     flags,
228*5e7646d2SAndroid Build Coastguard Worker     uint32_t                            interfaceIndex,
229*5e7646d2SAndroid Build Coastguard Worker     const char                          *name,         /* may be NULL */
230*5e7646d2SAndroid Build Coastguard Worker     const char                          *regtype,
231*5e7646d2SAndroid Build Coastguard Worker     const char                          *domain,       /* may be NULL */
232*5e7646d2SAndroid Build Coastguard Worker     const char                          *host,         /* may be NULL */
233*5e7646d2SAndroid Build Coastguard Worker     uint16_t                            port,          /* In network byte order */
234*5e7646d2SAndroid Build Coastguard Worker     uint16_t                            txtLen,
235*5e7646d2SAndroid Build Coastguard Worker     const void                          *txtRecord,    /* may be NULL */
236*5e7646d2SAndroid Build Coastguard Worker     DNSServiceRegisterReply             callBack,      /* may be NULL */
237*5e7646d2SAndroid Build Coastguard Worker     void                                *context       /* may be NULL */
238*5e7646d2SAndroid Build Coastguard Worker     )
239*5e7646d2SAndroid Build Coastguard Worker {
240*5e7646d2SAndroid Build Coastguard Worker   if (!dnssd_initialized)
241*5e7646d2SAndroid Build Coastguard Worker     dnssd_init();
242*5e7646d2SAndroid Build Coastguard Worker 
243*5e7646d2SAndroid Build Coastguard Worker   if (dnssd_register)
244*5e7646d2SAndroid Build Coastguard Worker     return (*dnssd_register)(sdRef, flags, interfaceIndex, name, regtype, domain, host, port, txtLen, txtRecord, callBack, context);
245*5e7646d2SAndroid Build Coastguard Worker   else
246*5e7646d2SAndroid Build Coastguard Worker     return (kDNSServiceErr_ServiceNotRunning);
247*5e7646d2SAndroid Build Coastguard Worker }
248*5e7646d2SAndroid Build Coastguard Worker 
249*5e7646d2SAndroid Build Coastguard Worker 
250*5e7646d2SAndroid Build Coastguard Worker // DNSServiceRemoveRecord
DNSServiceRemoveRecord(DNSServiceRef sdRef,DNSRecordRef RecordRef,DNSServiceFlags flags)251*5e7646d2SAndroid Build Coastguard Worker DNSServiceErrorType DNSSD_API DNSServiceRemoveRecord
252*5e7646d2SAndroid Build Coastguard Worker     (
253*5e7646d2SAndroid Build Coastguard Worker     DNSServiceRef                 sdRef,
254*5e7646d2SAndroid Build Coastguard Worker     DNSRecordRef                  RecordRef,
255*5e7646d2SAndroid Build Coastguard Worker     DNSServiceFlags               flags
256*5e7646d2SAndroid Build Coastguard Worker     )
257*5e7646d2SAndroid Build Coastguard Worker {
258*5e7646d2SAndroid Build Coastguard Worker   if (!dnssd_initialized)
259*5e7646d2SAndroid Build Coastguard Worker     dnssd_init();
260*5e7646d2SAndroid Build Coastguard Worker 
261*5e7646d2SAndroid Build Coastguard Worker   if (dnssd_remove_record)
262*5e7646d2SAndroid Build Coastguard Worker     return (*dnssd_remove_record)(sdRef, RecordRef, flags);
263*5e7646d2SAndroid Build Coastguard Worker   else
264*5e7646d2SAndroid Build Coastguard Worker     return (kDNSServiceErr_ServiceNotRunning);
265*5e7646d2SAndroid Build Coastguard Worker }
266*5e7646d2SAndroid Build Coastguard Worker 
267*5e7646d2SAndroid Build Coastguard Worker 
268*5e7646d2SAndroid Build Coastguard Worker // DNSServiceResolve
DNSServiceResolve(DNSServiceRef * sdRef,DNSServiceFlags flags,uint32_t interfaceIndex,const char * name,const char * regtype,const char * domain,DNSServiceResolveReply callBack,void * context)269*5e7646d2SAndroid Build Coastguard Worker DNSServiceErrorType DNSSD_API DNSServiceResolve
270*5e7646d2SAndroid Build Coastguard Worker     (
271*5e7646d2SAndroid Build Coastguard Worker     DNSServiceRef                       *sdRef,
272*5e7646d2SAndroid Build Coastguard Worker     DNSServiceFlags                     flags,
273*5e7646d2SAndroid Build Coastguard Worker     uint32_t                            interfaceIndex,
274*5e7646d2SAndroid Build Coastguard Worker     const char                          *name,
275*5e7646d2SAndroid Build Coastguard Worker     const char                          *regtype,
276*5e7646d2SAndroid Build Coastguard Worker     const char                          *domain,
277*5e7646d2SAndroid Build Coastguard Worker     DNSServiceResolveReply              callBack,
278*5e7646d2SAndroid Build Coastguard Worker     void                                *context  /* may be NULL */
279*5e7646d2SAndroid Build Coastguard Worker     )
280*5e7646d2SAndroid Build Coastguard Worker {
281*5e7646d2SAndroid Build Coastguard Worker   if (!dnssd_initialized)
282*5e7646d2SAndroid Build Coastguard Worker     dnssd_init();
283*5e7646d2SAndroid Build Coastguard Worker 
284*5e7646d2SAndroid Build Coastguard Worker   if (dnssd_resolve)
285*5e7646d2SAndroid Build Coastguard Worker     return (*dnssd_resolve)(sdRef, flags, interfaceIndex, name, regtype, domain, callBack, context);
286*5e7646d2SAndroid Build Coastguard Worker   else
287*5e7646d2SAndroid Build Coastguard Worker     return (kDNSServiceErr_ServiceNotRunning);
288*5e7646d2SAndroid Build Coastguard Worker }
289*5e7646d2SAndroid Build Coastguard Worker 
290*5e7646d2SAndroid Build Coastguard Worker 
291*5e7646d2SAndroid Build Coastguard Worker // DNSServiceUpdateRecord
DNSServiceUpdateRecord(DNSServiceRef sdRef,DNSRecordRef RecordRef,DNSServiceFlags flags,uint16_t rdlen,const void * rdata,uint32_t ttl)292*5e7646d2SAndroid Build Coastguard Worker DNSServiceErrorType DNSSD_API DNSServiceUpdateRecord
293*5e7646d2SAndroid Build Coastguard Worker     (
294*5e7646d2SAndroid Build Coastguard Worker     DNSServiceRef                       sdRef,
295*5e7646d2SAndroid Build Coastguard Worker     DNSRecordRef                        RecordRef,     /* may be NULL */
296*5e7646d2SAndroid Build Coastguard Worker     DNSServiceFlags                     flags,
297*5e7646d2SAndroid Build Coastguard Worker     uint16_t                            rdlen,
298*5e7646d2SAndroid Build Coastguard Worker     const void                          *rdata,
299*5e7646d2SAndroid Build Coastguard Worker     uint32_t                            ttl
300*5e7646d2SAndroid Build Coastguard Worker     )
301*5e7646d2SAndroid Build Coastguard Worker {
302*5e7646d2SAndroid Build Coastguard Worker   if (!dnssd_initialized)
303*5e7646d2SAndroid Build Coastguard Worker     dnssd_init();
304*5e7646d2SAndroid Build Coastguard Worker 
305*5e7646d2SAndroid Build Coastguard Worker   if (dnssd_update_record)
306*5e7646d2SAndroid Build Coastguard Worker     return (*dnssd_update_record)(sdRef, RecordRef, flags, rdlen, rdata, ttl);
307*5e7646d2SAndroid Build Coastguard Worker   else
308*5e7646d2SAndroid Build Coastguard Worker     return (kDNSServiceErr_ServiceNotRunning);
309*5e7646d2SAndroid Build Coastguard Worker }
310*5e7646d2SAndroid Build Coastguard Worker 
311*5e7646d2SAndroid Build Coastguard Worker 
312*5e7646d2SAndroid Build Coastguard Worker // TXTRecordCreate
313*5e7646d2SAndroid Build Coastguard Worker void DNSSD_API
TXTRecordCreate(TXTRecordRef * txtRecord,uint16_t bufferLen,void * buffer)314*5e7646d2SAndroid Build Coastguard Worker TXTRecordCreate(
315*5e7646d2SAndroid Build Coastguard Worker     TXTRecordRef     *txtRecord,
316*5e7646d2SAndroid Build Coastguard Worker     uint16_t         bufferLen,
317*5e7646d2SAndroid Build Coastguard Worker     void             *buffer)
318*5e7646d2SAndroid Build Coastguard Worker {
319*5e7646d2SAndroid Build Coastguard Worker   if (!dnssd_initialized)
320*5e7646d2SAndroid Build Coastguard Worker     dnssd_init();
321*5e7646d2SAndroid Build Coastguard Worker 
322*5e7646d2SAndroid Build Coastguard Worker   if (dnssd_txt_create)
323*5e7646d2SAndroid Build Coastguard Worker     (*dnssd_txt_create)(txtRecord, bufferLen, buffer);
324*5e7646d2SAndroid Build Coastguard Worker }
325*5e7646d2SAndroid Build Coastguard Worker 
326*5e7646d2SAndroid Build Coastguard Worker 
327*5e7646d2SAndroid Build Coastguard Worker // TXTRecordDeallocate
TXTRecordDeallocate(TXTRecordRef * txtRecord)328*5e7646d2SAndroid Build Coastguard Worker void DNSSD_API TXTRecordDeallocate
329*5e7646d2SAndroid Build Coastguard Worker     (
330*5e7646d2SAndroid Build Coastguard Worker     TXTRecordRef     *txtRecord
331*5e7646d2SAndroid Build Coastguard Worker     )
332*5e7646d2SAndroid Build Coastguard Worker {
333*5e7646d2SAndroid Build Coastguard Worker   if (!dnssd_initialized)
334*5e7646d2SAndroid Build Coastguard Worker     dnssd_init();
335*5e7646d2SAndroid Build Coastguard Worker 
336*5e7646d2SAndroid Build Coastguard Worker   if (dnssd_txt_deallocate)
337*5e7646d2SAndroid Build Coastguard Worker     (*dnssd_txt_deallocate)(txtRecord);
338*5e7646d2SAndroid Build Coastguard Worker }
339*5e7646d2SAndroid Build Coastguard Worker 
340*5e7646d2SAndroid Build Coastguard Worker 
341*5e7646d2SAndroid Build Coastguard Worker // TXTRecordGetBytesPtr
TXTRecordGetBytesPtr(const TXTRecordRef * txtRecord)342*5e7646d2SAndroid Build Coastguard Worker const void * DNSSD_API TXTRecordGetBytesPtr
343*5e7646d2SAndroid Build Coastguard Worker     (
344*5e7646d2SAndroid Build Coastguard Worker     const TXTRecordRef *txtRecord
345*5e7646d2SAndroid Build Coastguard Worker     )
346*5e7646d2SAndroid Build Coastguard Worker {
347*5e7646d2SAndroid Build Coastguard Worker   if (!dnssd_initialized)
348*5e7646d2SAndroid Build Coastguard Worker     dnssd_init();
349*5e7646d2SAndroid Build Coastguard Worker 
350*5e7646d2SAndroid Build Coastguard Worker   if (dnssd_txt_get_bytes_ptr)
351*5e7646d2SAndroid Build Coastguard Worker     return (*dnssd_txt_get_bytes_ptr)(txtRecord);
352*5e7646d2SAndroid Build Coastguard Worker   else
353*5e7646d2SAndroid Build Coastguard Worker     return (NULL);
354*5e7646d2SAndroid Build Coastguard Worker }
355*5e7646d2SAndroid Build Coastguard Worker 
356*5e7646d2SAndroid Build Coastguard Worker 
357*5e7646d2SAndroid Build Coastguard Worker // TXTRecordGetLength
TXTRecordGetLength(const TXTRecordRef * txtRecord)358*5e7646d2SAndroid Build Coastguard Worker uint16_t DNSSD_API TXTRecordGetLength
359*5e7646d2SAndroid Build Coastguard Worker     (
360*5e7646d2SAndroid Build Coastguard Worker     const TXTRecordRef *txtRecord
361*5e7646d2SAndroid Build Coastguard Worker     )
362*5e7646d2SAndroid Build Coastguard Worker {
363*5e7646d2SAndroid Build Coastguard Worker   if (!dnssd_initialized)
364*5e7646d2SAndroid Build Coastguard Worker     dnssd_init();
365*5e7646d2SAndroid Build Coastguard Worker 
366*5e7646d2SAndroid Build Coastguard Worker   if (dnssd_txt_get_length)
367*5e7646d2SAndroid Build Coastguard Worker     return (*dnssd_txt_get_length)(txtRecord);
368*5e7646d2SAndroid Build Coastguard Worker   else
369*5e7646d2SAndroid Build Coastguard Worker     return (0);
370*5e7646d2SAndroid Build Coastguard Worker }
371*5e7646d2SAndroid Build Coastguard Worker 
372*5e7646d2SAndroid Build Coastguard Worker 
373*5e7646d2SAndroid Build Coastguard Worker // TXTRecordSetValue
TXTRecordSetValue(TXTRecordRef * txtRecord,const char * key,uint8_t valueSize,const void * value)374*5e7646d2SAndroid Build Coastguard Worker DNSServiceErrorType DNSSD_API TXTRecordSetValue
375*5e7646d2SAndroid Build Coastguard Worker     (
376*5e7646d2SAndroid Build Coastguard Worker     TXTRecordRef     *txtRecord,
377*5e7646d2SAndroid Build Coastguard Worker     const char       *key,
378*5e7646d2SAndroid Build Coastguard Worker     uint8_t          valueSize,        /* may be zero */
379*5e7646d2SAndroid Build Coastguard Worker     const void       *value            /* may be NULL */
380*5e7646d2SAndroid Build Coastguard Worker     )
381*5e7646d2SAndroid Build Coastguard Worker {
382*5e7646d2SAndroid Build Coastguard Worker   if (!dnssd_initialized)
383*5e7646d2SAndroid Build Coastguard Worker     dnssd_init();
384*5e7646d2SAndroid Build Coastguard Worker 
385*5e7646d2SAndroid Build Coastguard Worker   if (dnssd_txt_set_value)
386*5e7646d2SAndroid Build Coastguard Worker     return (*dnssd_txt_set_value)(txtRecord, key, valueSize, value);
387*5e7646d2SAndroid Build Coastguard Worker   else
388*5e7646d2SAndroid Build Coastguard Worker     return (-1);
389*5e7646d2SAndroid Build Coastguard Worker }
390*5e7646d2SAndroid Build Coastguard Worker 
391*5e7646d2SAndroid Build Coastguard Worker 
392*5e7646d2SAndroid Build Coastguard Worker // TXTRecordGetCount
393*5e7646d2SAndroid Build Coastguard Worker uint16_t DNSSD_API
TXTRecordGetCount(uint16_t txtLen,const void * txtRecord)394*5e7646d2SAndroid Build Coastguard Worker TXTRecordGetCount(
395*5e7646d2SAndroid Build Coastguard Worker     uint16_t         txtLen,
396*5e7646d2SAndroid Build Coastguard Worker     const void       *txtRecord)
397*5e7646d2SAndroid Build Coastguard Worker {
398*5e7646d2SAndroid Build Coastguard Worker   if (!dnssd_initialized)
399*5e7646d2SAndroid Build Coastguard Worker     dnssd_init();
400*5e7646d2SAndroid Build Coastguard Worker 
401*5e7646d2SAndroid Build Coastguard Worker   if (dnssd_txt_get_count)
402*5e7646d2SAndroid Build Coastguard Worker     return (*dnssd_txt_get_count)(txtLen, txtRecord);
403*5e7646d2SAndroid Build Coastguard Worker   else
404*5e7646d2SAndroid Build Coastguard Worker     return (0);
405*5e7646d2SAndroid Build Coastguard Worker }
406*5e7646d2SAndroid Build Coastguard Worker 
407*5e7646d2SAndroid Build Coastguard Worker 
408*5e7646d2SAndroid Build Coastguard Worker // TXTRecordGetItemAtIndex
409*5e7646d2SAndroid Build Coastguard Worker DNSServiceErrorType DNSSD_API
TXTRecordGetItemAtIndex(uint16_t txtLen,const void * txtRecord,uint16_t itemIndex,uint16_t keyBufLen,char * key,uint8_t * valueLen,const void ** value)410*5e7646d2SAndroid Build Coastguard Worker TXTRecordGetItemAtIndex(
411*5e7646d2SAndroid Build Coastguard Worker     uint16_t         txtLen,
412*5e7646d2SAndroid Build Coastguard Worker     const void       *txtRecord,
413*5e7646d2SAndroid Build Coastguard Worker     uint16_t         itemIndex,
414*5e7646d2SAndroid Build Coastguard Worker     uint16_t         keyBufLen,
415*5e7646d2SAndroid Build Coastguard Worker     char             *key,
416*5e7646d2SAndroid Build Coastguard Worker     uint8_t          *valueLen,
417*5e7646d2SAndroid Build Coastguard Worker     const void       **value)
418*5e7646d2SAndroid Build Coastguard Worker {
419*5e7646d2SAndroid Build Coastguard Worker   if (!dnssd_initialized)
420*5e7646d2SAndroid Build Coastguard Worker     dnssd_init();
421*5e7646d2SAndroid Build Coastguard Worker 
422*5e7646d2SAndroid Build Coastguard Worker   if (dnssd_txt_get_item_at_index)
423*5e7646d2SAndroid Build Coastguard Worker     return (*dnssd_txt_get_item_at_index)(txtLen, txtRecord, itemIndex, keyBufLen, key, valueLen, value);
424*5e7646d2SAndroid Build Coastguard Worker   else
425*5e7646d2SAndroid Build Coastguard Worker     return (-1);
426*5e7646d2SAndroid Build Coastguard Worker }
427*5e7646d2SAndroid Build Coastguard Worker 
428*5e7646d2SAndroid Build Coastguard Worker 
429*5e7646d2SAndroid Build Coastguard Worker // TXTRecordGetValuePtr
430*5e7646d2SAndroid Build Coastguard Worker const void * DNSSD_API
TXTRecordGetValuePtr(uint16_t txtLen,const void * txtRecord,const char * key,uint8_t * valueLen)431*5e7646d2SAndroid Build Coastguard Worker TXTRecordGetValuePtr(
432*5e7646d2SAndroid Build Coastguard Worker     uint16_t         txtLen,
433*5e7646d2SAndroid Build Coastguard Worker     const void       *txtRecord,
434*5e7646d2SAndroid Build Coastguard Worker     const char       *key,
435*5e7646d2SAndroid Build Coastguard Worker     uint8_t          *valueLen)
436*5e7646d2SAndroid Build Coastguard Worker {
437*5e7646d2SAndroid Build Coastguard Worker   if (!dnssd_initialized)
438*5e7646d2SAndroid Build Coastguard Worker     dnssd_init();
439*5e7646d2SAndroid Build Coastguard Worker 
440*5e7646d2SAndroid Build Coastguard Worker   if (dnssd_txt_get_value_ptr)
441*5e7646d2SAndroid Build Coastguard Worker     return (*dnssd_txt_get_value_ptr)(txtLen, txtRecord, key, valueLen);
442*5e7646d2SAndroid Build Coastguard Worker   else
443*5e7646d2SAndroid Build Coastguard Worker     return (NULL);
444*5e7646d2SAndroid Build Coastguard Worker }
445