2 * Dynamic wrapper for Bonjour SDK for Windows.
4 * Copyright 2018 by Apple Inc.
6 * Licensed under Apache License v2.0. See the file "LICENSE" for more
10 //#include <cups/http-private.h>
11 #include <cups/thread-private.h>
16 * Pointers for functions...
19 static int dnssd_initialized
= 0;
20 static _cups_mutex_t dnssd_mutex
= _CUPS_MUTEX_INITIALIZER
;
21 static DNSServiceErrorType (*dnssd_add_record
)(DNSServiceRef sdRef
, DNSRecordRef
*RecordRef
, DNSServiceFlags flags
, uint16_t rrtype
, uint16_t rdlen
, const void *rdata
, uint32_t ttl
);
22 static DNSServiceErrorType (*dnssd_browse
)(DNSServiceRef
*sdRef
, DNSServiceFlags flags
, uint32_t interfaceIndex
, const char *regtype
, const char *domain
, DNSServiceBrowseReply callBack
, void *context
);
23 static DNSServiceErrorType (*dnssd_construct_full_name
)(char * const fullName
, const char * const service
, const char * const regtype
, const char * const domain
);
24 static DNSServiceErrorType (*dnssd_create_connection
)(DNSServiceRef
*sdRef
);
25 static DNSServiceErrorType (*dnssd_process_result
)(DNSServiceRef sdRef
);
26 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 static void (*dnssd_deallocate
)(DNSServiceRef sdRef
);
28 static int (*dnssd_sock_fd
)(DNSServiceRef sdRef
);
29 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 static DNSServiceErrorType (*dnssd_remove_record
)(DNSServiceRef sdRef
, DNSRecordRef RecordRef
, DNSServiceFlags flags
);
31 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 static DNSServiceErrorType (*dnssd_update_record
)(DNSServiceRef sdRef
, DNSRecordRef RecordRef
, DNSServiceFlags flags
, uint16_t rdlen
, const void *rdata
, uint32_t ttl
);
34 static void (*dnssd_txt_create
)(TXTRecordRef
*txtRecord
, uint16_t bufferLen
, void *buffer
);
35 static void (*dnssd_txt_deallocate
)(TXTRecordRef
*txtRecord
);
36 static const void *(*dnssd_txt_get_bytes_ptr
)(const TXTRecordRef
*txtRecord
);
37 static uint16_t (*dnssd_txt_get_count
)(uint16_t txtLen
, const void *txtRecord
);
38 static uint16_t (*dnssd_txt_get_length
)(const TXTRecordRef
*txtRecord
);
39 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 static const void *(*dnssd_txt_get_value_ptr
)(uint16_t txtLen
, const void *txtRecord
, const char *key
, uint8_t *valueLen
);
41 static DNSServiceErrorType (*dnssd_txt_set_value
)(TXTRecordRef
*txtRecord
, const char *key
, uint8_t valueSize
, const void *value
);
45 * Function to initialize pointers...
51 _cupsMutexLock(&dnssd_mutex
);
52 if (!dnssd_initialized
)
54 HINSTANCE dll_handle
= LoadLibraryA("dnssd.dll");
58 dnssd_add_record
= (DNSServiceErrorType (*)(DNSServiceRef
, DNSRecordRef
*, DNSServiceFlags
, uint16_t, uint16_t, const void *, uint32_t))GetProcAddress(dll_handle
, "DNSServiceAddRecord");
59 dnssd_browse
= (DNSServiceErrorType(*)(DNSServiceRef
*, DNSServiceFlags
, uint32_t, const char *, const char *, DNSServiceBrowseReply
, void *))GetProcAddress(dll_handle
, "DNSServiceBrowse");
60 dnssd_construct_full_name
= (DNSServiceErrorType(*)(char * const, const char * const, const char * const, const char * const))GetProcAddress(dll_handle
, "DNSServiceConstructFullName");
61 dnssd_create_connection
= (DNSServiceErrorType(*)(DNSServiceRef
*))GetProcAddress(dll_handle
, "DNSServiceCreateConnection");
62 dnssd_deallocate
= (DNSServiceErrorType(*)(DNSServiceRef
))GetProcAddress(dll_handle
, "DNSServiceRefDeallocate");
63 dnssd_process_result
= (DNSServiceErrorType(*)(DNSServiceRef
))GetProcAddress(dll_handle
, "DNSServiceProcessResult");
64 dnssd_query_record
= (DNSServiceErrorType(*)(DNSServiceRef
*, DNSServiceFlags
, uint32_t, const char *, uint16_t, uint16_t, DNSServiceQueryRecordReply
, void *))GetProcAddress(dll_handle
, "DNSServiceQueryRecord");
65 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 dnssd_remove_record
= (DNSServiceErrorType(*)(DNSServiceRef
, DNSRecordRef
, DNSServiceFlags
))GetProcAddress(dll_handle
, "DNSServiceRemoveRecord");
67 dnssd_resolve
= (DNSServiceErrorType(*)(DNSServiceRef
*, DNSServiceFlags
, uint32_t, const char *, const char *, const char *, DNSServiceResolveReply
, void *))GetProcAddress(dll_handle
, "DNSServiceResolve");
68 dnssd_sock_fd
= (int(*)(DNSServiceRef
))GetProcAddress(dll_handle
, "DNSServiceRefSockFD");
69 dnssd_update_record
= (DNSServiceErrorType(*)(DNSServiceRef
, DNSRecordRef
, DNSServiceFlags
, uint16_t, const void *, uint32_t))GetProcAddress(dll_handle
, "DNSServiceUpdateRecord");
71 dnssd_txt_create
= (void (*)(TXTRecordRef
*, uint16_t, void *))GetProcAddress(dll_handle
, "TXTRecordCreate");
72 dnssd_txt_deallocate
= (void (*)(TXTRecordRef
*))GetProcAddress(dll_handle
, "TXTRecordDeallocate");
73 dnssd_txt_get_bytes_ptr
= (const void *(*)(const TXTRecordRef
*))GetProcAddress(dll_handle
, "TXTRecordGetBytesPtr");
74 dnssd_txt_get_count
= (uint16_t (*)(uint16_t, const void *))GetProcAddress(dll_handle
, "TXTRecordGetCount");
75 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 dnssd_txt_get_length
= (uint16_t (*)(const TXTRecordRef
*))GetProcAddress(dll_handle
, "TXTRecordGetLength");
77 dnssd_txt_get_value_ptr
= (const void *(*)(uint16_t, const void *, const char *, uint8_t *))GetProcAddress(dll_handle
, "TXTRecordGetValuePtr");
78 dnssd_txt_set_value
= (DNSServiceErrorType (*)(TXTRecordRef
*, const char *, uint8_t, const void *))GetProcAddress(dll_handle
, "TXTRecordSetValue");
81 dnssd_initialized
= 1;
83 _cupsMutexUnlock(&dnssd_mutex
);
87 // DNSServiceAddRecord
88 DNSServiceErrorType DNSSD_API DNSServiceAddRecord
91 DNSRecordRef
*RecordRef
,
92 DNSServiceFlags flags
,
99 if (!dnssd_initialized
)
102 if (dnssd_add_record
)
103 return (*dnssd_add_record
)(sdRef
, RecordRef
, flags
, rrtype
, rdlen
, rdata
, ttl
);
110 DNSServiceErrorType DNSSD_API DNSServiceBrowse
112 DNSServiceRef
*sdRef
,
113 DNSServiceFlags flags
,
114 uint32_t interfaceIndex
,
116 const char *domain
, /* may be NULL */
117 DNSServiceBrowseReply callBack
,
118 void *context
/* may be NULL */
121 if (!dnssd_initialized
)
125 return (*dnssd_browse
)(sdRef
, flags
, interfaceIndex
, regtype
, domain
, callBack
, context
);
131 // DNSServiceConstructFullName
132 DNSServiceErrorType DNSSD_API DNSServiceConstructFullName
134 char * const fullName
,
135 const char * const service
, /* may be NULL */
136 const char * const regtype
,
137 const char * const domain
140 if (!dnssd_initialized
)
143 if (dnssd_construct_full_name
)
144 return (*dnssd_construct_full_name
)(fullName
, service
, regtype
, domain
);
150 // DNSServiceCreateConnection
151 DNSServiceErrorType DNSSD_API
DNSServiceCreateConnection(DNSServiceRef
*sdRef
)
153 if (!dnssd_initialized
)
156 if (dnssd_create_connection
)
157 return (*dnssd_create_connection
)(sdRef
);
163 // DNSServiceProcessResult
164 DNSServiceErrorType DNSSD_API
DNSServiceProcessResult(DNSServiceRef sdRef
)
166 if (!dnssd_initialized
)
169 if (dnssd_process_result
)
170 return (*dnssd_process_result
)(sdRef
);
176 // DNSServiceQueryRecord
177 DNSServiceErrorType DNSSD_API DNSServiceQueryRecord
179 DNSServiceRef
*sdRef
,
180 DNSServiceFlags flags
,
181 uint32_t interfaceIndex
,
182 const char *fullname
,
185 DNSServiceQueryRecordReply callBack
,
186 void *context
/* may be NULL */
189 if (!dnssd_initialized
)
192 if (dnssd_query_record
)
193 return (*dnssd_query_record
)(sdRef
, flags
, interfaceIndex
, fullname
, rrtype
, rrclass
, callBack
, context
);
199 // DNSServiceRefDeallocate
200 void DNSSD_API
DNSServiceRefDeallocate(DNSServiceRef sdRef
)
202 if (!dnssd_initialized
)
205 if (dnssd_deallocate
)
206 (*dnssd_deallocate
)(sdRef
);
210 // DNSServiceRefSockFD
211 int DNSSD_API
DNSServiceRefSockFD(DNSServiceRef sdRef
)
213 if (!dnssd_initialized
)
217 return (*dnssd_sock_fd
)(sdRef
);
223 // DNSServiceRegister
224 DNSServiceErrorType DNSSD_API DNSServiceRegister
226 DNSServiceRef
*sdRef
,
227 DNSServiceFlags flags
,
228 uint32_t interfaceIndex
,
229 const char *name
, /* may be NULL */
231 const char *domain
, /* may be NULL */
232 const char *host
, /* may be NULL */
233 uint16_t port
, /* In network byte order */
235 const void *txtRecord
, /* may be NULL */
236 DNSServiceRegisterReply callBack
, /* may be NULL */
237 void *context
/* may be NULL */
240 if (!dnssd_initialized
)
244 return (*dnssd_register
)(sdRef
, flags
, interfaceIndex
, name
, regtype
, domain
, host
, port
, txtLen
, txtRecord
, callBack
, context
);
250 // DNSServiceRemoveRecord
251 DNSServiceErrorType DNSSD_API DNSServiceRemoveRecord
254 DNSRecordRef RecordRef
,
255 DNSServiceFlags flags
258 if (!dnssd_initialized
)
261 if (dnssd_remove_record
)
262 return (*dnssd_remove_record
)(sdRef
, RecordRef
, flags
);
269 DNSServiceErrorType DNSSD_API DNSServiceResolve
271 DNSServiceRef
*sdRef
,
272 DNSServiceFlags flags
,
273 uint32_t interfaceIndex
,
277 DNSServiceResolveReply callBack
,
278 void *context
/* may be NULL */
281 if (!dnssd_initialized
)
285 return (*dnssd_resolve
)(sdRef
, flags
, interfaceIndex
, name
, regtype
, domain
, callBack
, context
);
291 // DNSServiceUpdateRecord
292 DNSServiceErrorType DNSSD_API DNSServiceUpdateRecord
295 DNSRecordRef RecordRef
, /* may be NULL */
296 DNSServiceFlags flags
,
302 if (!dnssd_initialized
)
305 if (dnssd_update_record
)
306 return (*dnssd_update_record
)(sdRef
, RecordRef
, flags
, rdlen
, rdata
, ttl
);
315 TXTRecordRef
*txtRecord
,
319 if (!dnssd_initialized
)
322 if (dnssd_txt_create
)
323 (*dnssd_txt_create
)(txtRecord
, bufferLen
, buffer
);
327 // TXTRecordDeallocate
328 void DNSSD_API TXTRecordDeallocate
330 TXTRecordRef
*txtRecord
333 if (!dnssd_initialized
)
336 if (dnssd_txt_deallocate
)
337 (*dnssd_txt_deallocate
)(txtRecord
);
341 // TXTRecordGetBytesPtr
342 const void * DNSSD_API TXTRecordGetBytesPtr
344 const TXTRecordRef
*txtRecord
347 if (!dnssd_initialized
)
350 if (dnssd_txt_get_bytes_ptr
)
351 return (*dnssd_txt_get_bytes_ptr
)(txtRecord
);
357 // TXTRecordGetLength
358 uint16_t DNSSD_API TXTRecordGetLength
360 const TXTRecordRef
*txtRecord
363 if (!dnssd_initialized
)
366 if (dnssd_txt_get_length
)
367 return (*dnssd_txt_get_length
)(txtRecord
);
374 DNSServiceErrorType DNSSD_API TXTRecordSetValue
376 TXTRecordRef
*txtRecord
,
378 uint8_t valueSize
, /* may be zero */
379 const void *value
/* may be NULL */
382 if (!dnssd_initialized
)
385 if (dnssd_txt_set_value
)
386 return (*dnssd_txt_set_value
)(txtRecord
, key
, valueSize
, value
);
396 const void *txtRecord
)
398 if (!dnssd_initialized
)
401 if (dnssd_txt_get_count
)
402 return (*dnssd_txt_get_count
)(txtLen
, txtRecord
);
408 // TXTRecordGetItemAtIndex
409 DNSServiceErrorType DNSSD_API
410 TXTRecordGetItemAtIndex(
412 const void *txtRecord
,
419 if (!dnssd_initialized
)
422 if (dnssd_txt_get_item_at_index
)
423 return (*dnssd_txt_get_item_at_index
)(txtLen
, txtRecord
, itemIndex
, keyBufLen
, key
, valueLen
, value
);
429 // TXTRecordGetValuePtr
430 const void * DNSSD_API
431 TXTRecordGetValuePtr(
433 const void *txtRecord
,
437 if (!dnssd_initialized
)
440 if (dnssd_txt_get_value_ptr
)
441 return (*dnssd_txt_get_value_ptr
)(txtLen
, txtRecord
, key
, valueLen
);