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