diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2023-08-29 19:24:06 -0700 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2023-09-09 11:55:41 -0700 |
commit | 62b53011d351ddc97a923900c2bfeb0b13b8264b (patch) | |
tree | 2ba1ec0ff95fb6a3331ddcfcc5c5f9d8bb5cf8b9 | |
parent | 88e9ce201b9599db7470c7879e0bf29262501a42 (diff) |
QNetworkInterface: replace CMake check for ifr_index with SFINAE
Detecting if a member exists is very easy and saves us from running the
test at CMake time. Saves about 350 ms.
Change-Id: I2b24e1d3cad44897906efffd178007fdcdd18e37
Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
-rw-r--r-- | src/network/configure.cmake | 20 | ||||
-rw-r--r-- | src/network/kernel/qnetworkinterface_unix.cpp | 30 |
2 files changed, 14 insertions, 36 deletions
diff --git a/src/network/configure.cmake b/src/network/configure.cmake index 8a9ad6b614..b11a1ec8c8 100644 --- a/src/network/configure.cmake +++ b/src/network/configure.cmake @@ -37,22 +37,6 @@ freeifaddrs(list); "# FIXME: use: unmapped library: network ) -# ifr_index -qt_config_compile_test(ifr_index - LABEL "ifr_index" - CODE -"#include <net/if.h> - -int main(void) -{ - /* BEGIN TEST: */ -struct ifreq req; -req.ifr_index = 0; - /* END TEST: */ - return 0; -} -") - # ipv6ifname qt_config_compile_test(ipv6ifname LABEL "IPv6 ifname" @@ -212,10 +196,6 @@ qt_feature("getifaddrs" PUBLIC CONDITION UNIX AND NOT QT_FEATURE_linux_netlink AND TEST_getifaddrs ) qt_feature_definition("getifaddrs" "QT_NO_GETIFADDRS" NEGATE VALUE "1") -qt_feature("ifr_index" PRIVATE - LABEL "ifr_index" - CONDITION UNIX AND NOT QT_FEATURE_linux_netlink AND TEST_ifr_index -) qt_feature("ipv6ifname" PUBLIC LABEL "IPv6 ifname" CONDITION UNIX AND NOT QT_FEATURE_linux_netlink AND TEST_ipv6ifname diff --git a/src/network/kernel/qnetworkinterface_unix.cpp b/src/network/kernel/qnetworkinterface_unix.cpp index fc508e7095..116e7d0ff5 100644 --- a/src/network/kernel/qnetworkinterface_unix.cpp +++ b/src/network/kernel/qnetworkinterface_unix.cpp @@ -52,7 +52,18 @@ static QHostAddress addressFromSockaddr(sockaddr *sa, int ifindex = 0, const QSt } } return address; +} +template <typename Req> [[maybe_unused]] +static auto &ifreq_index(Req &req, std::enable_if_t<sizeof(std::declval<Req>().ifr_index) != 0, int> = 0) +{ + return req.ifr_index; +} + +template <typename Req> [[maybe_unused]] +static auto &ifreq_index(Req &req, std::enable_if_t<sizeof(std::declval<Req>().ifr_ifindex) != 0, int> = 0) +{ + return req.ifr_ifindex; } uint QNetworkInterfaceManager::interfaceIndexFromName(const QString &name) @@ -71,11 +82,7 @@ uint QNetworkInterfaceManager::interfaceIndexFromName(const QString &name) uint id = 0; if (qt_safe_ioctl(socket, SIOCGIFINDEX, &req) >= 0) -# if QT_CONFIG(ifr_index) - id = req.ifr_index; -# else - id = req.ifr_ifindex; -# endif + id = ifreq_index(req); qt_safe_close(socket); return id; #else @@ -95,12 +102,7 @@ QString QNetworkInterfaceManager::interfaceNameFromIndex(uint index) int socket = qt_safe_socket(AF_INET, SOCK_STREAM, 0); if (socket >= 0) { memset(&req, 0, sizeof(ifreq)); -# if QT_CONFIG(ifr_index) - req.ifr_index = index; -# else - req.ifr_ifindex = index; -# endif - + ifreq_index(req) = index; if (qt_safe_ioctl(socket, SIOCGIFNAME, &req) >= 0) { qt_safe_close(socket); return QString::fromLatin1(req.ifr_name); @@ -185,11 +187,7 @@ static QNetworkInterfacePrivate *findInterface(int socket, QList<QNetworkInterfa // Get the interface index # ifdef SIOCGIFINDEX if (qt_safe_ioctl(socket, SIOCGIFINDEX, &req) >= 0) -# if QT_CONFIG(ifr_index) - ifindex = req.ifr_index; -# else - ifindex = req.ifr_ifindex; -# endif + ifindex = ifreq_index(req); # else ifindex = if_nametoindex(req.ifr_name); # endif |