#include <QLibrary>
#include "dnssrv.h"
#include <windows.h>
#include <windns.h>
#ifdef DNS_QUERY
#define dnsQuery
#warning DNS_QUERY is already defined.
#endif
#ifdef DNS_FREE
#define dnsFree
#warning DNS_FREE is already defined.
#endif
#ifndef DNS_QUERY_SRV
#define DNS_QUERY_SRV 0x0021
#endif
// typedef DNS_STATUS WINAPI (*DNS_QUERY)(PCSTR, WORD, DWORD, PIP4_ARRAY, PDNS_RECORD *, PVOID *);
// typedef void WINAPI (*DNS_FREE)(PVOID, DNS_FREE_TYPE);
typedef DNS_STATUS WINAPI (*)(PCSTR, WORD, DWORD, PIP4_ARRAY, PDNS_RECORD *, PVOID *)
QList<DnsSrv
::Server> DnsSrv
::resolve(const QString &name
){
QList<DnsSrv::Server> servers;
DNS_QUERY dnsQuery = (DNS_QUERY) lib.resolve("DnsQuery_UTF8");
DNS_FREE dnsFree = (DNS_FREE) lib.resolve("DnsFree");
if (dnsQuery == NULL || dnsFree == NULL) {
qDebug("Windows does not support DnsQuery");
goto failed;
}
PDNS_RECORD rr;
if (dnsQuery(name.toUtf8(), DNS_QUERY_SRV,
DNS_QUERY_STANDARD, NULL, &rr, NULL) != 0)
goto failed;
name.toLower();
for (PDNS_RECORD p = rr; p != NULL; p = p->pNext) {
if (p->wType != DNS_QUERY_SRV ||
QString((char *) p
->pName
).
toLower() != name
) continue;
DNS_SRV_DATA *srv = &p->Data.Srv;
DnsSrv::Server res;
res.ttl = p->dwTtl;
res.priority = srv->wPriority;
res.weight = srv->wWeight;
res.port = srv->wPort;
res.target = (char *) srv->pNameTarget;
servers.append(res);
}
dnsFree(rr, DnsFreeRecordList);
failed:
lib.unload();
return servers;
}