summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2023-05-08 19:49:04 -0700
committerThiago Macieira <thiago.macieira@intel.com>2023-05-14 21:44:20 -0700
commit678964b242342684455e5889d4e7e6e514bf77b0 (patch)
tree4220bad1f4b6ff8291b3305faaeab203b49f3604
parenteb9f88a07812608c77d28777ba2e911431f59990 (diff)
downloadqtbase-678964b242342684455e5889d4e7e6e514bf77b0.tar.gz
QDnsLookup/Unix: add support for res_setservers()
This API is found on FreeBSD, Darwin, Solaris, AIX, and Android Bionic. That means we complement IPv6 support for most platforms. Test on macOS: $ $objdir/tests/manual/qdnslookup/qdnslookup @fe80::1e1b:dff:fee2:49e6%en0 ; <<>> QDnsLookup 6.6.0 ;; status: NoError ;; QUESTION: ;qt-project.org IN A ;; ANSWER: qt-project.org 3336 IN A 52.18.144.254 ;; Query time: 2 ms ;; SERVER: fe80::1e1b:dff:fee2:49e6%en0#53 Dnsmasq log on the server confirms it was queried. Change-Id: I3e3bfef633af4130a03afffd175d59c67faa463f Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
-rw-r--r--src/network/configure.cmake23
-rw-r--r--src/network/kernel/qdnslookup_unix.cpp14
2 files changed, 37 insertions, 0 deletions
diff --git a/src/network/configure.cmake b/src/network/configure.cmake
index a26f979d3c..d0417d6e3a 100644
--- a/src/network/configure.cmake
+++ b/src/network/configure.cmake
@@ -119,6 +119,25 @@ int main()
"
)
+# res_setserver
+qt_config_compile_test(res_setservers
+ LABEL "res_setservers()"
+ LIBRARIES
+ WrapResolv::WrapResolv
+ CODE
+"#include <sys/types.h>
+#include <netinet/in.h>
+#include <resolv.h>
+int main()
+{
+ union res_sockaddr_union sa;
+ res_state s = nullptr;
+ res_setservers(s, &sa, 1);
+ return 0;
+}
+"
+)
+
# sctp
qt_config_compile_test(sctp
LABEL "SCTP support"
@@ -235,6 +254,10 @@ qt_feature("res_ninit" PRIVATE
CONDITION TEST_res_ninit
AUTODETECT UNIX
)
+qt_feature("res_setservers" PRIVATE
+ LABEL "res_setservers()"
+ CONDITION QT_FEATURE_res_ninit AND TEST_res_setservers
+)
qt_feature("securetransport" PUBLIC
LABEL "SecureTransport"
CONDITION APPLE
diff --git a/src/network/kernel/qdnslookup_unix.cpp b/src/network/kernel/qdnslookup_unix.cpp
index 240ace3c3c..0e10e8f928 100644
--- a/src/network/kernel/qdnslookup_unix.cpp
+++ b/src/network/kernel/qdnslookup_unix.cpp
@@ -24,6 +24,19 @@ QT_BEGIN_NAMESPACE
using namespace Qt::StringLiterals;
+#if QT_CONFIG(res_setservers)
+// https://www.ibm.com/docs/en/i/7.3?topic=ssw_ibm_i_73/apis/ressetservers.html
+// https://docs.oracle.com/cd/E86824_01/html/E54774/res-setservers-3resolv.html
+static const char *applyNameServer(res_state state, const QHostAddress &nameserver, quint16 port)
+{
+ if (nameserver.isNull())
+ return nullptr;
+ union res_sockaddr_union u;
+ setSockaddr(reinterpret_cast<sockaddr *>(&u.sin), nameserver, port);
+ res_setservers(state, &u, 1);
+ return nullptr;
+}
+#else
template <typename T> void setNsMap(T &ext, std::enable_if_t<sizeof(T::nsmap) != 0, uint16_t> v)
{
// Set nsmap[] to indicate that nsaddrs[0] is an IPv6 address
@@ -84,6 +97,7 @@ static const char *applyNameServer(res_state state, const QHostAddress &nameserv
}
return nullptr;
}
+#endif // !QT_CONFIG(res_setservers)
void QDnsLookupRunnable::query(const int requestType, const QByteArray &requestName, const QHostAddress &nameserver, QDnsLookupReply *reply)
{