]> git.ipfire.org Git - thirdparty/cups.git/blame - vcnet/dns_sd.c
Search for codesign/true, use LDFLAGS for shared libraries (Issue #5411)
[thirdparty/cups.git] / vcnet / dns_sd.c
CommitLineData
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
19static int dnssd_initialized = 0;
20static _cups_mutex_t dnssd_mutex = _CUPS_MUTEX_INITIALIZER;
21static DNSServiceErrorType DNSSD_API (*dnssd_add_record)(DNSServiceRef sdRef, DNSRecordRef *RecordRef, DNSServiceFlags flags, uint16_t rrtype, uint16_t rdlen, const void *rdata, uint32_t ttl);
22static DNSServiceErrorType DNSSD_API (*dnssd_browse)(DNSServiceRef *sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, const char *regtype, const char *domain, DNSServiceBrowseReply callBack, void *context);
23static DNSServiceErrorType DNSSD_API (*dnssd_construct_full_name)(char * const fullName, const char * const service, const char * const regtype, const char * const domain);
24static DNSServiceErrorType DNSSD_API (*dnssd_create_connection)(DNSServiceRef *sdRef);
25static DNSServiceErrorType DNSSD_API (*dnssd_process_result)(DNSServiceRef sdRef);
26static 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);
27static void DNSSD_API (*dnssd_deallocate)(DNSServiceRef sdRef);
28static int DNSSD_API (*dnssd_sock_fd)(DNSServiceRef sdRef);
29static 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);
30static DNSServiceErrorType DNSSD_API (*dnssd_remove_record)(DNSServiceRef sdRef, DNSRecordRef RecordRef, DNSServiceFlags flags);
31static 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);
32static DNSServiceErrorType DNSSD_API (*dnssd_update_record)(DNSServiceRef sdRef, DNSRecordRef RecordRef, DNSServiceFlags flags, uint16_t rdlen, const void *rdata, uint32_t ttl);
33
34
35void DNSSD_API TXTRecordCreate
36 (
37 TXTRecordRef *txtRecord,
38 uint16_t bufferLen,
39 void *buffer
40 );
41void DNSSD_API TXTRecordDeallocate
42 (
43 TXTRecordRef *txtRecord
44 );
45const void * DNSSD_API TXTRecordGetBytesPtr
46 (
47 const TXTRecordRef *txtRecord
48 );
49uint16_t DNSSD_API TXTRecordGetLength
50 (
51 const TXTRecordRef *txtRecord
52 );
53DNSServiceErrorType 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
66static void
67dnssd_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
103DNSServiceErrorType 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
125DNSServiceErrorType 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
147DNSServiceErrorType 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
166DNSServiceErrorType 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
179DNSServiceErrorType 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
192DNSServiceErrorType 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
215void 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
228int 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
241DNSServiceErrorType 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
268DNSServiceErrorType 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
286DNSServiceErrorType 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
309DNSServiceErrorType 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
330void 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
346void 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
360const 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
376uint16_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
392DNSServiceErrorType 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