diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-10-24 10:37:17 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2017-10-24 13:40:55 +0200 |
commit | fa9d12f4a20d618caedc77880459fa1af75fd50d (patch) | |
tree | 11bd3cb4541afb924b3ee17f867133e71eb0e090 /src/network/kernel | |
parent | 895cb4681ee78caaf9b99c88390a74ff1d79ae61 (diff) | |
parent | f174d31667dca184439f520b9624a1471d9556a6 (diff) |
Merge remote-tracking branch 'origin/5.10' into dev
Conflicts:
src/plugins/platforms/windows/qwindowsmousehandler.cpp
src/plugins/platforms/xcb/qxcbimage.cpp
tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
tests/manual/qtabletevent/regular_widgets/main.cpp
Done-with: Friedemann Kleint<Friedemann.Kleint@qt.io>
Done-with: MÃ¥rten Nordheim<marten.nordheim@qt.io>
Change-Id: I5b2499513a92c590ed0756f7d2e93c35a64b7f30
Diffstat (limited to 'src/network/kernel')
-rw-r--r-- | src/network/kernel/kernel.pri | 2 | ||||
-rw-r--r-- | src/network/kernel/qhostaddress.cpp | 86 | ||||
-rw-r--r-- | src/network/kernel/qhostinfo_unix.cpp | 50 | ||||
-rw-r--r-- | src/network/kernel/qhostinfo_win.cpp | 161 | ||||
-rw-r--r-- | src/network/kernel/qnetworkdatagram.cpp | 4 | ||||
-rw-r--r-- | src/network/kernel/qnetworkinterface_win.cpp | 1 |
6 files changed, 87 insertions, 217 deletions
diff --git a/src/network/kernel/kernel.pri b/src/network/kernel/kernel.pri index 716f745bc9..54b61f3ad3 100644 --- a/src/network/kernel/kernel.pri +++ b/src/network/kernel/kernel.pri @@ -49,8 +49,6 @@ win32: { SOURCES += kernel/qdnslookup_win.cpp \ kernel/qnetworkinterface_win.cpp LIBS_PRIVATE += -ldnsapi -liphlpapi - DEFINES += WINVER=0x0600 _WIN32_WINNT=0x0600 - } else { SOURCES += kernel/qdnslookup_winrt.cpp \ kernel/qnetworkinterface_winrt.cpp diff --git a/src/network/kernel/qhostaddress.cpp b/src/network/kernel/qhostaddress.cpp index 8b380960e6..72b6d2dc70 100644 --- a/src/network/kernel/qhostaddress.cpp +++ b/src/network/kernel/qhostaddress.cpp @@ -534,49 +534,6 @@ QHostAddress::QHostAddress(SpecialAddress address) } /*! - \overload - \since 5.8 - - Sets the special address specified by \a address. -*/ -void QHostAddress::setAddress(SpecialAddress address) -{ - d->clear(); - - Q_IPV6ADDR ip6; - memset(&ip6, 0, sizeof ip6); - quint32 ip4 = INADDR_ANY; - - switch (address) { - case Null: - return; - - case Broadcast: - ip4 = INADDR_BROADCAST; - break; - case LocalHost: - ip4 = INADDR_LOOPBACK; - break; - case AnyIPv4: - break; - - case LocalHostIPv6: - ip6[15] = 1; - Q_FALLTHROUGH(); - case AnyIPv6: - d->setAddress(ip6); - return; - - case Any: - d->protocol = QAbstractSocket::AnyIPProtocol; - return; - } - - // common IPv4 part - d->setAddress(ip4); -} - -/*! Destroys the host address object. */ QHostAddress::~QHostAddress() @@ -740,6 +697,49 @@ void QHostAddress::setAddress(const struct sockaddr *sockaddr) } /*! + \overload + \since 5.8 + + Sets the special address specified by \a address. +*/ +void QHostAddress::setAddress(SpecialAddress address) +{ + clear(); + + Q_IPV6ADDR ip6; + memset(&ip6, 0, sizeof ip6); + quint32 ip4 = INADDR_ANY; + + switch (address) { + case Null: + return; + + case Broadcast: + ip4 = INADDR_BROADCAST; + break; + case LocalHost: + ip4 = INADDR_LOOPBACK; + break; + case AnyIPv4: + break; + + case LocalHostIPv6: + ip6[15] = 1; + Q_FALLTHROUGH(); + case AnyIPv6: + d->setAddress(ip6); + return; + + case Any: + d->protocol = QAbstractSocket::AnyIPProtocol; + return; + } + + // common IPv4 part + d->setAddress(ip4); +} + +/*! Returns the IPv4 address as a number. For example, if the address is 127.0.0.1, the returned value is diff --git a/src/network/kernel/qhostinfo_unix.cpp b/src/network/kernel/qhostinfo_unix.cpp index 91e5d18ae5..d22608e22f 100644 --- a/src/network/kernel/qhostinfo_unix.cpp +++ b/src/network/kernel/qhostinfo_unix.cpp @@ -66,10 +66,6 @@ # include <gnu/lib-names.h> #endif -#if defined (QT_NO_GETADDRINFO) -static QBasicMutex getHostByNameMutex; -#endif - QT_BEGIN_NAMESPACE // Almost always the same. If not, specify in qplatformdefs.h. @@ -188,7 +184,6 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName) QHostAddress address; if (address.setAddress(hostName)) { // Reverse lookup -#if !defined (QT_NO_GETADDRINFO) sockaddr_in sa4; sockaddr_in6 sa6; sockaddr *sa = 0; @@ -211,12 +206,6 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName) char hbuf[NI_MAXHOST]; if (sa && getnameinfo(sa, saSize, hbuf, sizeof(hbuf), 0, 0, 0) == 0) results.setHostName(QString::fromLatin1(hbuf)); -#else - in_addr_t inetaddr = qt_safe_inet_addr(hostName.toLatin1().constData()); - struct hostent *ent = gethostbyaddr((const char *)&inetaddr, sizeof(inetaddr), AF_INET); - if (ent) - results.setHostName(QString::fromLatin1(ent->h_name)); -#endif if (results.hostName().isEmpty()) results.setHostName(address.toString()); @@ -235,7 +224,6 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName) return results; } -#if !defined (QT_NO_GETADDRINFO) // Call getaddrinfo, and place all IPv4 addresses at the start and // the IPv6 addresses at the end of the address list in results. addrinfo *res = 0; @@ -302,39 +290,6 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName) results.setErrorString(QString::fromLocal8Bit(gai_strerror(result))); } -#else - // Fall back to gethostbyname for platforms that don't define - // getaddrinfo. gethostbyname does not support IPv6, and it's not - // reentrant on all platforms. For now this is okay since we only - // use one QHostInfoAgent, but if more agents are introduced, locking - // must be provided. - QMutexLocker locker(&getHostByNameMutex); - hostent *result = gethostbyname(aceHostname.constData()); - if (result) { - if (result->h_addrtype == AF_INET) { - QList<QHostAddress> addresses; - for (char **p = result->h_addr_list; *p != 0; p++) { - QHostAddress addr; - addr.setAddress(ntohl(*((quint32 *)*p))); - if (!addresses.contains(addr)) - addresses.prepend(addr); - } - results.setAddresses(addresses); - } else { - results.setError(QHostInfo::UnknownError); - results.setErrorString(tr("Unknown address type")); - } -#if !defined(Q_OS_VXWORKS) - } else if (h_errno == HOST_NOT_FOUND || h_errno == NO_DATA - || h_errno == NO_ADDRESS) { - results.setError(QHostInfo::HostNotFound); - results.setErrorString(tr("Host not found")); -#endif - } else { - results.setError(QHostInfo::UnknownError); - results.setErrorString(tr("Unknown error")); - } -#endif // !defined (QT_NO_GETADDRINFO) #if defined(QHOSTINFO_DEBUG) if (results.error() != QHostInfo::NoError) { @@ -377,11 +332,6 @@ QString QHostInfo::localDomainName() if (local_res_init && local_res) { // using thread-unsafe version -#if defined(QT_NO_GETADDRINFO) - // We have to call res_init to be sure that _res was initialized - // So, for systems without getaddrinfo (which is thread-safe), we lock the mutex too - QMutexLocker locker(&getHostByNameMutex); -#endif local_res_init(); QString domainName = QUrl::fromAce(local_res->defdname); if (domainName.isEmpty()) diff --git a/src/network/kernel/qhostinfo_win.cpp b/src/network/kernel/qhostinfo_win.cpp index 9e5d556f2b..bea24b0af2 100644 --- a/src/network/kernel/qhostinfo_win.cpp +++ b/src/network/kernel/qhostinfo_win.cpp @@ -50,50 +50,12 @@ QT_BEGIN_NAMESPACE //#define QHOSTINFO_DEBUG -// Older SDKs do not include the addrinfo struct declaration, so we -// include a copy of it here. -struct qt_addrinfo -{ - int ai_flags; - int ai_family; - int ai_socktype; - int ai_protocol; - size_t ai_addrlen; - char *ai_canonname; - sockaddr *ai_addr; - qt_addrinfo *ai_next; -}; - //### #define QT_SOCKLEN_T int #ifndef NI_MAXHOST // already defined to 1025 in ws2tcpip.h? #define NI_MAXHOST 1024 #endif -typedef int (__stdcall *getnameinfoProto)(const sockaddr *, QT_SOCKLEN_T, const char *, DWORD, const char *, DWORD, int); -typedef int (__stdcall *getaddrinfoProto)(const char *, const char *, const qt_addrinfo *, qt_addrinfo **); -typedef int (__stdcall *freeaddrinfoProto)(qt_addrinfo *); -static getnameinfoProto local_getnameinfo = 0; -static getaddrinfoProto local_getaddrinfo = 0; -static freeaddrinfoProto local_freeaddrinfo = 0; - -static bool resolveLibraryInternal() -{ - // Attempt to resolve getaddrinfo(); without it we'll have to fall - // back to gethostbyname(), which has no IPv6 support. -#if defined (Q_OS_WINRT) - local_getaddrinfo = (getaddrinfoProto) &getaddrinfo; - local_freeaddrinfo = (freeaddrinfoProto) &freeaddrinfo; - local_getnameinfo = (getnameinfoProto) getnameinfo; -#else - local_getaddrinfo = (getaddrinfoProto) QSystemLibrary::resolve(QLatin1String("ws2_32"), "getaddrinfo"); - local_freeaddrinfo = (freeaddrinfoProto) QSystemLibrary::resolve(QLatin1String("ws2_32"), "freeaddrinfo"); - local_getnameinfo = (getnameinfoProto) QSystemLibrary::resolve(QLatin1String("ws2_32"), "getnameinfo"); -#endif - return true; -} -Q_GLOBAL_STATIC_WITH_ARGS(bool, resolveLibrary, (resolveLibraryInternal())) - static void translateWSAError(int error, QHostInfo *results) { switch (error) { @@ -114,49 +76,39 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName) { QSysInfo::machineHostName(); // this initializes ws2_32.dll - // Load res_init on demand. - resolveLibrary(); - QHostInfo results; #if defined(QHOSTINFO_DEBUG) qDebug("QHostInfoAgent::fromName(): looking up \"%s\" (IPv6 support is %s)", hostName.toLatin1().constData(), - (local_getaddrinfo && local_freeaddrinfo) ? "enabled" : "disabled"); + (getaddrinfo && freeaddrinfo) ? "enabled" : "disabled"); #endif QHostAddress address; if (address.setAddress(hostName)) { // Reverse lookup - if (local_getnameinfo) { - sockaddr_in sa4; - sockaddr_in6 sa6; - sockaddr *sa; - QT_SOCKLEN_T saSize; - if (address.protocol() == QAbstractSocket::IPv4Protocol) { - sa = (sockaddr *)&sa4; - saSize = sizeof(sa4); - memset(&sa4, 0, sizeof(sa4)); - sa4.sin_family = AF_INET; - sa4.sin_addr.s_addr = htonl(address.toIPv4Address()); - } else { - sa = (sockaddr *)&sa6; - saSize = sizeof(sa6); - memset(&sa6, 0, sizeof(sa6)); - sa6.sin6_family = AF_INET6; - memcpy(&sa6.sin6_addr, address.toIPv6Address().c, sizeof(sa6.sin6_addr)); - } - - char hbuf[NI_MAXHOST]; - if (local_getnameinfo(sa, saSize, hbuf, sizeof(hbuf), 0, 0, 0) == 0) - results.setHostName(QString::fromLatin1(hbuf)); + sockaddr_in sa4; + sockaddr_in6 sa6; + sockaddr *sa; + QT_SOCKLEN_T saSize; + if (address.protocol() == QAbstractSocket::IPv4Protocol) { + sa = (sockaddr *)&sa4; + saSize = sizeof(sa4); + memset(&sa4, 0, sizeof(sa4)); + sa4.sin_family = AF_INET; + sa4.sin_addr.s_addr = htonl(address.toIPv4Address()); } else { - unsigned long addr = inet_addr(hostName.toLatin1().constData()); - struct hostent *ent = gethostbyaddr((const char*)&addr, sizeof(addr), AF_INET); - if (ent) - results.setHostName(QString::fromLatin1(ent->h_name)); + sa = (sockaddr *)&sa6; + saSize = sizeof(sa6); + memset(&sa6, 0, sizeof(sa6)); + sa6.sin6_family = AF_INET6; + memcpy(&sa6.sin6_addr, address.toIPv6Address().c, sizeof(sa6.sin6_addr)); } + char hbuf[NI_MAXHOST]; + if (getnameinfo(sa, saSize, hbuf, sizeof(hbuf), 0, 0, 0) == 0) + results.setHostName(QString::fromLatin1(hbuf)); + if (results.hostName().isEmpty()) results.setHostName(address.toString()); results.setAddresses(QList<QHostAddress>() << address); @@ -172,64 +124,35 @@ QHostInfo QHostInfoAgent::fromName(const QString &hostName) return results; } - if (local_getaddrinfo && local_freeaddrinfo) { - // Call getaddrinfo, and place all IPv4 addresses at the start - // and the IPv6 addresses at the end of the address list in - // results. - qt_addrinfo *res; - int err = local_getaddrinfo(aceHostname.constData(), 0, 0, &res); - if (err == 0) { - QList<QHostAddress> addresses; - for (qt_addrinfo *p = res; p != 0; p = p->ai_next) { - switch (p->ai_family) { - case AF_INET: { - QHostAddress addr; - addr.setAddress(ntohl(((sockaddr_in *) p->ai_addr)->sin_addr.s_addr)); - if (!addresses.contains(addr)) - addresses.append(addr); - } - break; - case AF_INET6: { - QHostAddress addr; - addr.setAddress(((sockaddr_in6 *) p->ai_addr)->sin6_addr.s6_addr); - if (!addresses.contains(addr)) - addresses.append(addr); - } - break; - default: - results.setError(QHostInfo::UnknownError); - results.setErrorString(tr("Unknown address type")); - } + addrinfo *res; + int err = getaddrinfo(aceHostname.constData(), 0, 0, &res); + if (err == 0) { + QList<QHostAddress> addresses; + for (addrinfo *p = res; p != 0; p = p->ai_next) { + switch (p->ai_family) { + case AF_INET: { + QHostAddress addr; + addr.setAddress(ntohl(((sockaddr_in *) p->ai_addr)->sin_addr.s_addr)); + if (!addresses.contains(addr)) + addresses.append(addr); + } + break; + case AF_INET6: { + QHostAddress addr; + addr.setAddress(((sockaddr_in6 *) p->ai_addr)->sin6_addr.s6_addr); + if (!addresses.contains(addr)) + addresses.append(addr); } - results.setAddresses(addresses); - local_freeaddrinfo(res); - } else { - translateWSAError(WSAGetLastError(), &results); - } - } else { - // Fall back to gethostbyname, which only supports IPv4. - hostent *ent = gethostbyname(aceHostname.constData()); - if (ent) { - char **p; - QList<QHostAddress> addresses; - switch (ent->h_addrtype) { - case AF_INET: - for (p = ent->h_addr_list; *p != 0; p++) { - long *ip4Addr = (long *) *p; - QHostAddress temp; - temp.setAddress(ntohl(*ip4Addr)); - addresses << temp; - } break; default: results.setError(QHostInfo::UnknownError); results.setErrorString(tr("Unknown address type")); - break; } - results.setAddresses(addresses); - } else { - translateWSAError(WSAGetLastError(), &results); } + results.setAddresses(addresses); + freeaddrinfo(res); + } else { + translateWSAError(WSAGetLastError(), &results); } #if defined(QHOSTINFO_DEBUG) diff --git a/src/network/kernel/qnetworkdatagram.cpp b/src/network/kernel/qnetworkdatagram.cpp index dd412b69d1..d167190684 100644 --- a/src/network/kernel/qnetworkdatagram.cpp +++ b/src/network/kernel/qnetworkdatagram.cpp @@ -124,9 +124,7 @@ QT_BEGIN_NAMESPACE \row \li Linux \li Supported \li Supported \li Supported \row \li OS X \li Supported \li Supported \li Only for IPv6 \row \li Other Unix supporting RFC 3542 \li Only for IPv6 \li Only for IPv6 \li Only for IPv6 - \row \li Windows XP and older \li Not supported \li Not supported \li Not supported - \row \li Windows Vista & up \li Supported \li Supported \li Supported - \row \li Windows CE \li Not supported \li Not supported \li Not supported + \row \li Windows (desktop) \li Supported \li Supported \li Supported \row \li Windows RT \li Not supported \li Not supported \li Not supported \endtable diff --git a/src/network/kernel/qnetworkinterface_win.cpp b/src/network/kernel/qnetworkinterface_win.cpp index 8344fb04c2..64c3fa6f83 100644 --- a/src/network/kernel/qnetworkinterface_win.cpp +++ b/src/network/kernel/qnetworkinterface_win.cpp @@ -56,6 +56,7 @@ // (http://sourceforge.net/p/mingw-w64/mailman/message/32935366/) #include <winsock2.h> #include <ws2ipdef.h> +#include <wincrypt.h> #include <iphlpapi.h> #include <ws2tcpip.h> |