3 * Purple is the legal property of its developers, whose names are too numerous
4 * to list here. Please refer to the COPYRIGHT file distributed with this
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Library General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301, USA.
23 #include "dns_sd_proxy.h"
25 static DNSServiceErrorType (DNSSD_API
* _DNSServiceAddRecord
)(DNSServiceRef sdRef
, DNSRecordRef
*RecordRef
, DNSServiceFlags flags
,
26 uint16_t rrtype
, uint16_t rdlen
, const void *rdata
, uint32_t ttl
);
27 static DNSServiceErrorType (DNSSD_API
* _DNSServiceBrowse
)(DNSServiceRef
*sdRef
, DNSServiceFlags flags
, uint32_t interfaceIndex
,
28 const char *regtype
, const char *domain
, DNSServiceBrowseReply callBack
, void *context
);
29 static int (DNSSD_API
* _DNSServiceConstructFullName
)(char *fullName
, const char *service
, const char *regtype
, const char *domain
);
30 static DNSServiceErrorType (DNSSD_API
* _DNSServiceGetAddrInfo
)(DNSServiceRef
*sdRef
, DNSServiceFlags flags
, uint32_t interfaceIndex
,
31 DNSServiceProtocol protocol
, const char *hostname
, DNSServiceGetAddrInfoReply callBack
, void *context
);
32 static DNSServiceErrorType (DNSSD_API
* _DNSServiceProcessResult
)(DNSServiceRef sdRef
);
33 static DNSServiceErrorType (DNSSD_API
* _DNSServiceQueryRecord
)(DNSServiceRef
*sdRef
, DNSServiceFlags flags
, uint32_t interfaceIndex
,
34 const char *fullname
, uint16_t rrtype
, uint16_t rrclass
, DNSServiceQueryRecordReply callBack
, void *context
);
35 static void (DNSSD_API
* _DNSServiceRefDeallocate
)(DNSServiceRef sdRef
);
36 static int (DNSSD_API
* _DNSServiceRefSockFD
)(DNSServiceRef sdRef
);
37 static DNSServiceErrorType (DNSSD_API
* _DNSServiceRegister
)(DNSServiceRef
*sdRef
, DNSServiceFlags flags
, uint32_t interfaceIndex
,
38 const char *name
, const char *regtype
, const char *domain
, const char *host
, uint16_t port
, uint16_t txtLen
,
39 const void *txtRecord
, DNSServiceRegisterReply callBack
, void *context
);
40 static DNSServiceErrorType (DNSSD_API
* _DNSServiceResolve
)(DNSServiceRef
*sdRef
, DNSServiceFlags flags
, uint32_t interfaceIndex
, const char *name
,
41 const char *regtype
, const char *domain
, DNSServiceResolveReply callBack
, void *context
);
42 static DNSServiceErrorType (DNSSD_API
* _DNSServiceRemoveRecord
)(DNSServiceRef sdRef
, DNSRecordRef RecordRef
, DNSServiceFlags flags
);
43 static DNSServiceErrorType (DNSSD_API
* _DNSServiceUpdateRecord
)(DNSServiceRef sdRef
, DNSRecordRef RecordRef
, DNSServiceFlags flags
,
44 uint16_t rdlen
, const void *rdata
, uint32_t ttl
);
45 static void (DNSSD_API
* _TXTRecordCreate
)(TXTRecordRef
*txtRecord
, uint16_t bufferLen
, void *buffer
);
46 static void (DNSSD_API
* _TXTRecordDeallocate
)(TXTRecordRef
*txtRecord
);
47 static const void * (DNSSD_API
* _TXTRecordGetBytesPtr
)(const TXTRecordRef
*txtRecord
);
48 static int16_t (DNSSD_API
* _TXTRecordGetLength
)(const TXTRecordRef
*txtRecord
);
49 static const void * (DNSSD_API
* _TXTRecordGetValuePtr
)(uint16_t txtLen
, const void *txtRecord
, const char *key
, uint8_t *valueLen
);
50 static DNSServiceErrorType (DNSSD_API
* _TXTRecordSetValue
)(TXTRecordRef
*txtRecord
, const char *key
, uint8_t valueSize
, const void *value
);
53 gboolean
dns_sd_available(void) {
54 static gboolean initialized
= FALSE
;
55 static gboolean loaded
= FALSE
;
59 if ((_DNSServiceAddRecord
= (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceAddRecord"))
60 && (_DNSServiceBrowse
= (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceBrowse"))
61 && (_DNSServiceConstructFullName
= (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceConstructFullName"))
62 && (_DNSServiceGetAddrInfo
= (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceGetAddrInfo"))
63 && (_DNSServiceProcessResult
= (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceProcessResult"))
64 && (_DNSServiceQueryRecord
= (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceQueryRecord"))
65 && (_DNSServiceRefDeallocate
= (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceRefDeallocate"))
66 && (_DNSServiceRefSockFD
= (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceRefSockFD"))
67 && (_DNSServiceRegister
= (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceRegister"))
68 && (_DNSServiceResolve
= (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceResolve"))
69 && (_DNSServiceRemoveRecord
= (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceRemoveRecord"))
70 && (_DNSServiceUpdateRecord
= (void *) wpurple_find_and_loadproc("dnssd.dll", "DNSServiceUpdateRecord"))
71 && (_TXTRecordCreate
= (void *) wpurple_find_and_loadproc("dnssd.dll", "TXTRecordCreate"))
72 && (_TXTRecordDeallocate
= (void *) wpurple_find_and_loadproc("dnssd.dll", "TXTRecordDeallocate"))
73 && (_TXTRecordGetBytesPtr
= (void *) wpurple_find_and_loadproc("dnssd.dll", "TXTRecordGetBytesPtr"))
74 && (_TXTRecordGetLength
= (void *) wpurple_find_and_loadproc("dnssd.dll", "TXTRecordGetLength"))
75 && (_TXTRecordGetValuePtr
= (void *) wpurple_find_and_loadproc("dnssd.dll", "TXTRecordGetValuePtr"))
76 && (_TXTRecordSetValue
= (void *) wpurple_find_and_loadproc("dnssd.dll", "TXTRecordSetValue"))) {
84 DNSServiceErrorType
_wpurple_DNSServiceAddRecord(DNSServiceRef sdRef
, DNSRecordRef
*RecordRef
, DNSServiceFlags flags
,
85 uint16_t rrtype
, uint16_t rdlen
, const void *rdata
, uint32_t ttl
) {
86 g_return_val_if_fail(_DNSServiceAddRecord
!= NULL
, kDNSServiceErr_Unknown
);
87 return (_DNSServiceAddRecord
)(sdRef
, RecordRef
, flags
, rrtype
, rdlen
, rdata
, ttl
);
90 DNSServiceErrorType
_wpurple_DNSServiceBrowse(DNSServiceRef
*sdRef
, DNSServiceFlags flags
, uint32_t interfaceIndex
,
91 const char *regtype
, const char *domain
, DNSServiceBrowseReply callBack
, void *context
) {
92 g_return_val_if_fail(_DNSServiceBrowse
!= NULL
, kDNSServiceErr_Unknown
);
93 return (_DNSServiceBrowse
)(sdRef
, flags
, interfaceIndex
, regtype
, domain
, callBack
, context
);
96 int _wpurple_DNSServiceConstructFullName(char *fullName
, const char *service
, const char *regtype
, const char *domain
) {
97 g_return_val_if_fail(_DNSServiceConstructFullName
!= NULL
, 0);
98 return (_DNSServiceConstructFullName
)(fullName
, service
, regtype
, domain
);
101 DNSServiceErrorType
_wpurple_DNSServiceGetAddrInfo(DNSServiceRef
*sdRef
, DNSServiceFlags flags
, uint32_t interfaceIndex
,
102 DNSServiceProtocol protocol
, const char *hostname
, DNSServiceGetAddrInfoReply callBack
, void *context
) {
103 g_return_val_if_fail(_DNSServiceGetAddrInfo
!= NULL
, 0);
104 return (_DNSServiceGetAddrInfo
)(sdRef
, flags
, interfaceIndex
, protocol
, hostname
, callBack
, context
);
107 DNSServiceErrorType
_wpurple_DNSServiceProcessResult(DNSServiceRef sdRef
) {
108 g_return_val_if_fail(_DNSServiceProcessResult
!= NULL
, kDNSServiceErr_Unknown
);
109 return (_DNSServiceProcessResult
)(sdRef
);
113 DNSServiceErrorType
_wpurple_DNSServiceQueryRecord(DNSServiceRef
*sdRef
, DNSServiceFlags flags
, uint32_t interfaceIndex
,
114 const char *fullname
, uint16_t rrtype
, uint16_t rrclass
, DNSServiceQueryRecordReply callBack
, void *context
) {
115 g_return_val_if_fail(_DNSServiceQueryRecord
!= NULL
, kDNSServiceErr_Unknown
);
116 return (_DNSServiceQueryRecord
)(sdRef
, flags
, interfaceIndex
, fullname
, rrtype
, rrclass
, callBack
, context
);
119 void _wpurple_DNSServiceRefDeallocate(DNSServiceRef sdRef
) {
120 g_return_if_fail(_DNSServiceRefDeallocate
!= NULL
);
121 (_DNSServiceRefDeallocate
)(sdRef
);
124 int _wpurple_DNSServiceRefSockFD(DNSServiceRef sdRef
) {
125 g_return_val_if_fail(_DNSServiceRefSockFD
!= NULL
, -1);
126 return (_DNSServiceRefSockFD
)(sdRef
);
129 DNSServiceErrorType
_wpurple_DNSServiceRegister(DNSServiceRef
*sdRef
, DNSServiceFlags flags
, uint32_t interfaceIndex
,
130 const char *name
, const char *regtype
, const char *domain
, const char *host
, uint16_t port
, uint16_t txtLen
,
131 const void *txtRecord
, DNSServiceRegisterReply callBack
, void *context
) {
132 g_return_val_if_fail(_DNSServiceRegister
!= NULL
, kDNSServiceErr_Unknown
);
133 return (_DNSServiceRegister
)(sdRef
, flags
, interfaceIndex
, name
, regtype
, domain
, host
, port
, txtLen
, txtRecord
, callBack
, context
);
136 DNSServiceErrorType
_wpurple_DNSServiceResolve(DNSServiceRef
*sdRef
, DNSServiceFlags flags
, uint32_t interfaceIndex
, const char *name
,
137 const char *regtype
, const char *domain
, DNSServiceResolveReply callBack
, void *context
) {
138 g_return_val_if_fail(_DNSServiceResolve
!= NULL
, kDNSServiceErr_Unknown
);
139 return (_DNSServiceResolve
)(sdRef
, flags
, interfaceIndex
, name
, regtype
, domain
, callBack
, context
);
142 DNSServiceErrorType
_wpurple_DNSServiceRemoveRecord(DNSServiceRef sdRef
, DNSRecordRef RecordRef
, DNSServiceFlags flags
) {
143 g_return_val_if_fail(_DNSServiceRemoveRecord
!= NULL
, kDNSServiceErr_Unknown
);
144 return (_DNSServiceRemoveRecord
)(sdRef
, RecordRef
, flags
);
147 DNSServiceErrorType
_wpurple_DNSServiceUpdateRecord(DNSServiceRef sdRef
, DNSRecordRef RecordRef
, DNSServiceFlags flags
,
148 uint16_t rdlen
, const void *rdata
, uint32_t ttl
) {
149 g_return_val_if_fail(_DNSServiceUpdateRecord
!= NULL
, kDNSServiceErr_Unknown
);
150 return (_DNSServiceUpdateRecord
)(sdRef
, RecordRef
, flags
, rdlen
, rdata
, ttl
);
153 void _wpurple_TXTRecordCreate(TXTRecordRef
*txtRecord
, uint16_t bufferLen
, void *buffer
) {
154 g_return_if_fail(_TXTRecordCreate
!= NULL
);
155 (_TXTRecordCreate
)(txtRecord
, bufferLen
, buffer
);
158 void _wpurple_TXTRecordDeallocate(TXTRecordRef
*txtRecord
) {
159 g_return_if_fail(_TXTRecordDeallocate
!= NULL
);
160 (_TXTRecordDeallocate
)(txtRecord
);
163 const void * _wpurple_TXTRecordGetBytesPtr(const TXTRecordRef
*txtRecord
) {
164 g_return_val_if_fail(_TXTRecordGetBytesPtr
!= NULL
, NULL
);
165 return (_TXTRecordGetBytesPtr
)(txtRecord
);
168 uint16_t _wpurple_TXTRecordGetLength(const TXTRecordRef
*txtRecord
) {
169 g_return_val_if_fail(_TXTRecordGetLength
!= NULL
, 0);
170 return (_TXTRecordGetLength
)(txtRecord
);
173 const void * _wpurple_TXTRecordGetValuePtr(uint16_t txtLen
, const void *txtRecord
, const char *key
, uint8_t *valueLen
) {
174 g_return_val_if_fail(_TXTRecordGetValuePtr
!= NULL
, NULL
);
175 return (_TXTRecordGetValuePtr
)(txtLen
, txtRecord
, key
, valueLen
);
178 DNSServiceErrorType
_wpurple_TXTRecordSetValue(TXTRecordRef
*txtRecord
, const char *key
, uint8_t valueSize
, const void *value
) {
179 g_return_val_if_fail(_TXTRecordSetValue
!= NULL
, kDNSServiceErr_Unknown
);
180 return (_TXTRecordSetValue
)(txtRecord
, key
, valueSize
, value
);