9#include <private/qnativesocketengine_p.h>
10#include <private/qsystemerror_p.h>
18#ifndef DNS_ADDR_MAX_SOCKADDR_LENGTH
36# ifndef DNS_QUERY_RESULTS_VERSION1
73 QVarLengthArray<unsigned char, 1472>
query(1472);
75 auto dnsBuffer =
new (
query.data()) DNS_MESSAGE_BUFFER;
76 DWORD dnsBufferSize =
query.size();
78 bool recursionDesired =
true;
80 SetLastError(ERROR_SUCCESS);
83 if (!DnsWriteQuestionToBuffer_W(dnsBuffer, &dnsBufferSize,
85 xid, recursionDesired)) {
87 query.resize(dnsBufferSize);
88 if (!DnsWriteQuestionToBuffer_W(dnsBuffer, &dnsBufferSize,
90 xid, recursionDesired)) {
91 return GetLastError();
96 dnsBuffer->MessageHead.AuthenticatedData =
true;
99 if (!self->sendDnsOverTls(
reply, { query.data(), qsizetype(dnsBufferSize) }, replyBuffer))
100 return DNS_STATUS(-1);
103 auto response =
reinterpret_cast<PDNS_MESSAGE_BUFFER
>(replyBuffer.data());
104 DNS_HEADER *
header = &response->MessageHead;
106 return DNS_ERROR_BAD_PACKET;
117 return DnsExtractRecordsFromMessage_W(response, replyBuffer.size(), &
results->pQueryRecords);
126 request.QueryName =
reinterpret_cast<const wchar_t *
>(requestName.
constData());
127 request.QueryType = requestType;
128 request.QueryOptions = DNS_QUERY_STANDARD | DNS_QUERY_TREAT_AS_FQDN;
131 memset(dnsAddresses, 0,
sizeof(dnsAddresses));
134 auto sa =
new (
addr[0].MaxSa) sockaddr;
135 request.pDnsServerList->MaxCount =
sizeof(dnsAddresses);
136 request.pDnsServerList->AddrCount = 1;
139 request.pDnsServerList->Family = sa->sa_family;
144 DNS_STATUS status = ERROR_INVALID_PARAMETER;
154 if (status == DNS_STATUS(-1))
156 if (status >= DNS_ERROR_RCODE_FORMAT_ERROR && status <= DNS_ERROR_RCODE_LAST)
157 return reply->makeDnsRcodeError(status - DNS_ERROR_RCODE_FORMAT_ERROR + 1);
158 else if (status == ERROR_TIMEOUT)
159 return reply->makeTimeoutError();
160 else if (status != ERROR_SUCCESS)
161 return reply->makeResolverSystemError(status);
166 lastEncodedName =
name;
167 cachedDecodedName = decodeLabel(
name);
168 return cachedDecodedName;
171 return lastEncodedName ==
name ? cachedDecodedName : extractAndCacheHost(
name);
197 record.d->value = extractAndCacheHost(
ptr->Data.Cname.pNameHost);
203 record.d->preference =
ptr->Data.Mx.wPreference;
223 record.d->priority =
ptr->Data.Srv.wPriority;
225 record.d->weight =
ptr->Data.Srv.wWeight;
235 const auto &tlsa =
ptr->Data.Tlsa;
238 const quint8 matchType = tlsa.bMatchingType;
243 record.d->value.assign(tlsa.bCertificateAssociationData,
244 tlsa.bCertificateAssociationData + tlsa.bCertificateAssociationDataLength);
245 reply->tlsAssociationRecords.append(std::move(
record));
250 for (
unsigned int i = 0;
i <
ptr->Data.Txt.dwStringCount; ++
i) {
257 DnsRecordListFree(
results.pQueryRecords, DnsFreeRecordList);
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
The QDnsDomainNameRecord class stores information about a domain name record.
The QDnsHostAddressRecord class stores information about a host address record.
The QDnsMailExchangeRecord class stores information about a DNS MX record.
The QDnsServiceRecord class stores information about a DNS SRV record.
The QDnsTextRecord class stores information about a DNS TXT record.
The QDnsTlsAssociationRecord class stores information about a DNS TLSA record.
CertificateUsage
This enumeration contains valid values for the certificate usage field of TLS Association queries.
Selector
This enumeration contains valid values for the selector field of TLS Association queries.
MatchingType
This enumeration contains valid values for the matching type field of TLS Association queries.
The QHostAddress class provides an IP address.
bool isNull() const
Returns true if this host address is not valid for any host or interface.
QByteArray toLatin1() const
Returns a Latin-1 representation of the string as a QByteArray.
\macro QT_RESTRICTED_CAST_FROM_ASCII
Combined button and popup list for selecting options.
QT_SOCKLEN_T setSockaddr(sockaddr_in *sin, const QHostAddress &addr, quint16 port=0)
static QString header(const QString &name)
constexpr quint16 DnsPort
struct Qt_DnsAddrArray * PDNS_ADDR_ARRAY
struct Qt_DnsAddr DNS_ADDR
struct Qt_DnsAddrArray DNS_ADDR_ARRAY
VOID WINAPI DNS_QUERY_COMPLETION_ROUTINE(PVOID pQueryContext, PDNS_QUERY_RESULT pQueryResults)
DNS_STATUS WINAPI DnsQueryEx(PDNS_QUERY_REQUEST pQueryRequest, PDNS_QUERY_RESULT pQueryResults, PDNS_QUERY_CANCEL pCancelHandle)
struct Qt_DNS_QUERY_RESULT DNS_QUERY_RESULT
static QT_BEGIN_NAMESPACE DNS_STATUS sendAlternate(QDnsLookupRunnable *self, QDnsLookupReply *reply, PDNS_QUERY_REQUEST request, PDNS_QUERY_RESULT results)
struct Qt_DnsAddr * PDNS_ADDR
struct Qt_DNS_QUERY_RESULT * PDNS_QUERY_RESULT
struct Qt_DNS_QUERY_REQUEST * PDNS_QUERY_REQUEST
DNS_QUERY_COMPLETION_ROUTINE * PDNS_QUERY_COMPLETION_ROUTINE
struct Qt_DNS_QUERY_REQUEST DNS_QUERY_REQUEST
constexpr T qFromBigEndian(T source)
static ControlElement< T > * ptr(QWidget *widget)
GLsizeiptr const void GLenum usage
QFileSelector selector
[1]
QNetworkRequest request(url)
PDNS_ADDR_ARRAY pDnsServerList
PDNS_QUERY_COMPLETION_ROUTINE pQueryCompletionCallback
PDNS_RECORD pQueryRecords
DWORD DnsAddrUserDword[8]