reimplement QHostAddress via inet_pton() and inet_ntop()

both inet_pton() and inet_ntop() are supposed to be part of POSIX.1-2001
(see https://linux.die.net/man/3/inet_pton and
https://linux.die.net/man/3/inet_ntop), this makes QHostAddress input
requirements much more strict (e.g. whitespace in the input makes the
resulting QHostAddress object not valid) thus some QHostAddress tests fail
but QHostInfo tests pass. amends (such as return value checks) can be done
later

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2024-03-29 15:24:20 +02:00
parent d89749b46e
commit ac0689a666
17 changed files with 285 additions and 1308 deletions

View file

@ -548,8 +548,6 @@ katie_generate_obsolete(QIncompatibleFlag QtCore qglobal.h)
katie_generate_obsolete(QInputEvent QtGui qevent.h)
katie_generate_obsolete(QInternal QtCore qnamespace.h)
katie_generate_obsolete(QIntValidator QtGui qvalidator.h)
katie_generate_obsolete(QIPv6Address QtNetwork qhostaddress.h)
katie_generate_obsolete(Q_IPV6ADDR QtNetwork qhostaddress.h)
katie_generate_obsolete(QItemEditorCreatorBase QtGui qitemeditorfactory.h)
katie_generate_obsolete(QItemEditorCreator QtGui qitemeditorfactory.h)
katie_generate_obsolete(QItemSelection QtGui qitemselectionmodel.h)

View file

@ -814,7 +814,6 @@ include/katie/QtNetwork/QAbstractSocket
include/katie/QtNetwork/QCryptographicHash
include/katie/QtNetwork/QHostAddress
include/katie/QtNetwork/QHostInfo
include/katie/QtNetwork/QIPv6Address
include/katie/QtNetwork/QLocalServer
include/katie/QtNetwork/QLocalSocket
include/katie/QtNetwork/QNetworkAddressEntry
@ -822,7 +821,6 @@ include/katie/QtNetwork/QNetworkInterface
include/katie/QtNetwork/QTcpServer
include/katie/QtNetwork/QTcpSocket
include/katie/QtNetwork/QUdpSocket
include/katie/QtNetwork/Q_IPV6ADDR
include/katie/QtNetwork/QtNetwork
include/katie/QtNetwork/qabstractsocket.h
include/katie/QtNetwork/qcryptographichash.h

View file

@ -246,9 +246,7 @@ incmap = {
'QtEvents': 'qevent.h',
},
'QtNetwork': {
'QIPv6Address': 'qhostaddress.h',
'QNetworkAddressEntry': 'qnetworkinterface.h',
'Q_IPV6ADDR': 'qhostaddress.h',
},
'QtTest': {
'QEventSizeOfChecker': 'qtestspontaneevent.h',

View file

@ -203,7 +203,6 @@ classlist = [
"QHostInfo",
"QHoverEvent",
"QIODevice",
"QIPv6Address",
"QIcon",
"QIconEngine",
"QIdentityProxyModel",
@ -578,7 +577,6 @@ classlist = [
"QXmlStreamNotationDeclarations",
"QXmlStreamReader",
"QXmlStreamWriter",
"Q_IPV6ADDR",
"Q_PID",
"Qt",
"QtAlgorithms",

File diff suppressed because it is too large Load diff

View file

@ -29,22 +29,10 @@
struct sockaddr;
QT_BEGIN_NAMESPACE
class QHostAddressPrivate;
class Q_NETWORK_EXPORT QIPv6Address
{
public:
inline quint8 &operator [](int index) { return c[index]; }
inline quint8 operator [](int index) const { return c[index]; }
quint8 c[16];
};
typedef QIPv6Address Q_IPV6ADDR;
class Q_NETWORK_EXPORT QHostAddress
{
public:
@ -58,61 +46,39 @@ public:
};
QHostAddress();
explicit QHostAddress(quint32 ip4Addr);
explicit QHostAddress(quint8 *ip6Addr);
explicit QHostAddress(const Q_IPV6ADDR &ip6Addr);
explicit QHostAddress(const sockaddr *sockaddr);
explicit QHostAddress(const QString &address);
explicit QHostAddress(const QByteArray &address);
QHostAddress(const QHostAddress &copy);
QHostAddress(SpecialAddress address);
~QHostAddress();
QHostAddress &operator=(const QHostAddress &other);
QHostAddress &operator=(const QString &address);
QHostAddress &operator=(const QByteArray &address);
void setAddress(quint32 ip4Addr);
void setAddress(quint8 *ip6Addr);
void setAddress(const Q_IPV6ADDR &ip6Addr);
void setAddress(const sockaddr *sockaddr);
bool setAddress(const QString &address);
bool setAddress(const QByteArray &address);
QAbstractSocket::NetworkLayerProtocol protocol() const;
quint32 toIPv4Address() const;
Q_IPV6ADDR toIPv6Address() const;
QString toString() const;
QByteArray toString() const;
QString scopeId() const;
void setScopeId(const QString &id);
QByteArray scopeId() const;
void setScopeId(const QByteArray &id);
bool operator ==(const QHostAddress &address) const;
bool operator ==(SpecialAddress address) const;
inline bool operator !=(const QHostAddress &address) const
{ return !operator==(address); }
inline bool operator !=(SpecialAddress address) const
{ return !operator==(address); }
bool isNull() const;
void clear();
bool isInSubnet(const QHostAddress &subnet, int netmask) const;
bool isInSubnet(const QPair<QHostAddress, int> &subnet) const;
static QPair<QHostAddress, int> parseSubnet(const QString &subnet);
private:
friend class QNetmaskAddress;
QScopedPointer<QHostAddressPrivate> d;
};
inline bool operator ==(QHostAddress::SpecialAddress address1, const QHostAddress &address2)
{ return address2 == address1; }
#ifndef QT_NO_DEBUG_STREAM
Q_NETWORK_EXPORT QDebug operator<<(QDebug, const QHostAddress &);
#endif
Q_NETWORK_EXPORT uint qHash(const QHostAddress &key);
#ifndef QT_NO_DATASTREAM

View file

@ -38,20 +38,18 @@ QT_BEGIN_NAMESPACE
#include "qhostaddress.h"
#include "qabstractsocket.h"
class QNetmaskAddress: public QHostAddress
class QHostAddressPrivate
{
int length;
public:
QNetmaskAddress() : QHostAddress(), length(-1) { }
QHostAddressPrivate();
bool setAddress(const QString &address);
bool setAddress(const QHostAddress &address);
QAbstractSocket::NetworkLayerProtocol protocol;
QByteArray ipString;
QByteArray scopeId;
int prefixLength() const;
void setPrefixLength(QAbstractSocket::NetworkLayerProtocol proto, int len);
friend class QHostAddress;
};
QT_END_NAMESPACE
#endif

View file

@ -65,7 +65,8 @@ QHostInfo QHostInfoPrivate::fromName(const QString &hostName)
results.d->errorStr = QCoreApplication::translate("QHostInfo", "Unknown error");
QHostAddress address;
if (address.setAddress(hostName)) {
if (address.setAddress(hostName.toLatin1())) {
const QByteArray addressStr = address.toString();
#if defined(QHOSTINFO_DEBUG)
qDebug("QHostInfoPrivate::fromName(%s) looking up address...",
hostName.toLatin1().constData());
@ -83,7 +84,9 @@ QHostInfo QHostInfoPrivate::fromName(const QString &hostName)
saSize = sizeof(sa4);
::memset(&sa4, 0, sizeof(sa4));
sa4.sin_family = AF_INET;
sa4.sin_addr.s_addr = htonl(address.toIPv4Address());
struct in_addr ia;
inet_pton(AF_INET, addressStr.constData(), &ia);
sa4.sin_addr = ia;
}
#ifndef QT_NO_IPV6
else {
@ -91,7 +94,9 @@ QHostInfo QHostInfoPrivate::fromName(const QString &hostName)
saSize = sizeof(sa6);
::memset(&sa6, 0, sizeof(sa6));
sa6.sin6_family = AF_INET6;
::memcpy(sa6.sin6_addr.s6_addr, address.toIPv6Address().c, sizeof(sa6.sin6_addr.s6_addr));
struct in6_addr ia6;
inet_pton(AF_INET6, addressStr.constData(), &ia6);
sa6.sin6_addr = ia6;
}
#endif
@ -184,16 +189,16 @@ QHostInfo QHostInfoPrivate::fromName(const QString &hostName)
qDebug() << "getaddrinfo node: flags:" << node->ai_flags << "family:" << node->ai_family << "ai_socktype:" << node->ai_socktype << "ai_protocol:" << node->ai_protocol << "ai_addrlen:" << node->ai_addrlen;
#endif
if (node->ai_family == AF_INET) {
QHostAddress addr(ntohl(((sockaddr_in *) node->ai_addr)->sin_addr.s_addr));
QHostAddress addr(node->ai_addr);
if (!addresses.contains(addr))
addresses.append(addr);
}
#ifndef QT_NO_IPV6
else if (node->ai_family == AF_INET6) {
sockaddr_in6 *sa6 = (sockaddr_in6 *) node->ai_addr;
QHostAddress addr(sa6->sin6_addr.s6_addr);
QHostAddress addr(node->ai_addr);
if (sa6->sin6_scope_id)
addr.setScopeId(QString::number(sa6->sin6_scope_id));
addr.setScopeId(QByteArray::number(sa6->sin6_scope_id));
if (!addresses.contains(addr))
addresses.append(addr);
}

View file

@ -30,35 +30,6 @@
QT_BEGIN_NAMESPACE
static QList<QNetworkInterfacePrivate *> postProcess(QList<QNetworkInterfacePrivate *> list)
{
// Some platforms report a netmask but don't report a broadcast address
// Go through all available addresses and calculate the broadcast address
// from the IP and the netmask
//
// This is an IPv4-only thing -- IPv6 has no concept of broadcasts
// The math is:
// broadcast = IP | ~netmask
QList<QNetworkInterfacePrivate *>::Iterator it = list.begin();
for ( ; it != list.end(); ++it) {
QList<QNetworkAddressEntry>::Iterator addr_it = (*it)->addressEntries.begin();
const QList<QNetworkAddressEntry>::Iterator addr_end = (*it)->addressEntries.end();
for ( ; addr_it != addr_end; ++addr_it) {
if (addr_it->ip().protocol() != QAbstractSocket::IPv4Protocol)
continue;
if (!addr_it->netmask().isNull() && addr_it->broadcast().isNull()) {
QHostAddress bcast = addr_it->ip();
bcast = QHostAddress(bcast.toIPv4Address() | ~addr_it->netmask().toIPv4Address());
addr_it->setBroadcast(bcast);
}
}
}
return list;
}
/*!
\class QNetworkAddressEntry
\brief The QNetworkAddressEntry class stores one IP address
@ -138,15 +109,6 @@ QHostAddress QNetworkAddressEntry::ip() const
return d->address;
}
/*!
Sets the IP address the QNetworkAddressEntry object contains to \a
newIp.
*/
void QNetworkAddressEntry::setIp(const QHostAddress &newIp)
{
d->address = newIp;
}
/*!
Returns the netmask associated with the IP address. The
netmask is expressed in the form of an IP address, such as
@ -165,58 +127,6 @@ QHostAddress QNetworkAddressEntry::netmask() const
return d->netmask;
}
/*!
Sets the netmask that this QNetworkAddressEntry object contains to
\a newNetmask. Setting the netmask also sets the prefix length to
match the new netmask.
\sa setPrefixLength()
*/
void QNetworkAddressEntry::setNetmask(const QHostAddress &newNetmask)
{
if (newNetmask.protocol() != ip().protocol()) {
d->netmask = QNetmaskAddress();
return;
}
d->netmask.setAddress(newNetmask);
}
/*!
\since 4.5
Returns the prefix length of this IP address. The prefix length
matches the number of bits set to 1 in the netmask (see
netmask()). For IPv4 addresses, the value is between 0 and 32. For
IPv6 addresses, it's contained between 0 and 128 and is the
preferred form of representing addresses.
This function returns -1 if the prefix length could not be
determined (i.e., netmask() returns a null QHostAddress()).
\sa netmask()
*/
int QNetworkAddressEntry::prefixLength() const
{
return d->netmask.prefixLength();
}
/*!
\since 4.5
Sets the prefix length of this IP address to \a length. The value
of \a length must be valid for this type of IP address: between 0
and 32 for IPv4 addresses, between 0 and 128 for IPv6
addresses. Setting to any invalid value is equivalent to setting
to -1, which means "no prefix length".
Setting the prefix length also sets the netmask (see netmask()).
\sa setNetmask()
*/
void QNetworkAddressEntry::setPrefixLength(int length)
{
d->netmask.setPrefixLength(d->address.protocol(), length);
}
/*!
Returns the broadcast address associated with the IPv4
address and netmask. It can usually be derived from those two by
@ -235,15 +145,6 @@ QHostAddress QNetworkAddressEntry::broadcast() const
return d->broadcast;
}
/*!
Sets the broadcast IP address of this QNetworkAddressEntry object
to \a newBroadcast.
*/
void QNetworkAddressEntry::setBroadcast(const QHostAddress &newBroadcast)
{
d->broadcast = newBroadcast;
}
/*!
\class QNetworkInterface
\brief The QNetworkInterface class provides a listing of the host's IP
@ -446,8 +347,7 @@ QNetworkInterface QNetworkInterface::interfaceFromIndex(int index)
QList<QNetworkInterface> QNetworkInterface::allInterfaces()
{
QList<QNetworkInterface> result;
QList<QNetworkInterfacePrivate *> list = postProcess(QNetworkInterfacePrivate::scan());
foreach (QNetworkInterfacePrivate* priv, list) {
foreach (QNetworkInterfacePrivate* priv, QNetworkInterfacePrivate::scan()) {
QNetworkInterface iface;
iface.d = QSharedDataPointer<QNetworkInterfacePrivate>(priv);
result << iface;

View file

@ -33,6 +33,8 @@ QT_BEGIN_NAMESPACE
template<typename T> class QList;
class QNetworkAddressEntryPrivate;
class QNetworkInterfacePrivate;
class Q_NETWORK_EXPORT QNetworkAddressEntry
{
public:
@ -45,21 +47,15 @@ public:
{ return !(*this == other); }
QHostAddress ip() const;
void setIp(const QHostAddress &newIp);
QHostAddress netmask() const;
void setNetmask(const QHostAddress &newNetmask);
int prefixLength() const;
void setPrefixLength(int length);
QHostAddress broadcast() const;
void setBroadcast(const QHostAddress &newBroadcast);
private:
friend QNetworkInterfacePrivate;
QScopedPointer<QNetworkAddressEntryPrivate> d;
};
class QNetworkInterfacePrivate;
class Q_NETWORK_EXPORT QNetworkInterface
{
public:

View file

@ -48,7 +48,7 @@ class QNetworkAddressEntryPrivate
{
public:
QHostAddress address;
QNetmaskAddress netmask;
QHostAddress netmask;
QHostAddress broadcast;
};

View file

@ -64,19 +64,19 @@ static QHostAddress addressFromSockaddr(sockaddr *sa)
return address;
if (sa->sa_family == AF_INET)
address.setAddress(htonl(((sockaddr_in *)sa)->sin_addr.s_addr));
address.setAddress(sa);
#ifndef QT_NO_IPV6
else if (sa->sa_family == AF_INET6) {
address.setAddress(((sockaddr_in6 *)sa)->sin6_addr.s6_addr);
address.setAddress(sa);
int scope = ((sockaddr_in6 *)sa)->sin6_scope_id;
if (scope) {
#ifndef QT_NO_IPV6IFNAME
QSTACKARRAY(char, scopeid, IFNAMSIZ);
if (::if_indextoname(scope, scopeid) != 0) {
address.setScopeId(QString::fromLatin1(scopeid));
address.setScopeId(QByteArray(scopeid));
} else
#endif
address.setScopeId(QString::number(scope));
address.setScopeId(QByteArray::number(scope));
}
}
#endif
@ -127,14 +127,14 @@ QList<QNetworkInterfacePrivate *> QNetworkInterfacePrivate::scan()
}
QNetworkAddressEntry entry;
entry.setIp(addressFromSockaddr(ifiter->ifa_addr));
entry.d->address = addressFromSockaddr(ifiter->ifa_addr);
if (entry.ip().isNull())
// could not parse the address
continue;
entry.setNetmask(addressFromSockaddr(ifiter->ifa_netmask));
entry.d->netmask = addressFromSockaddr(ifiter->ifa_netmask);
if (iface->flags & QNetworkInterface::CanBroadcast)
entry.setBroadcast(addressFromSockaddr(ifiter->ifa_broadaddr));
entry.d->broadcast = addressFromSockaddr(ifiter->ifa_broadaddr);
iface->addressEntries << entry;

View file

@ -1080,7 +1080,7 @@ void QAbstractSocket::connectToHost(const QString &hostName, quint16 port,
emit stateChanged(d->state);
QHostAddress temp;
if (temp.setAddress(hostName)) {
if (temp.setAddress(hostName.toLatin1())) {
QHostInfo info;
info.d->err = QHostInfo::NoError;
info.d->errorStr = QCoreApplication::translate("QHostInfo", "Unknown error");

View file

@ -56,16 +56,16 @@ static inline void qt_socket_getPortAndAddress(const struct sockaddr_storage *ss
{
#if !defined(QT_NO_IPV6)
if (ss->ss_family == AF_INET6) {
struct sockaddr_in6 *si6 = (struct sockaddr_in6 *)ss;
const struct sockaddr_in6 *si6 = (const struct sockaddr_in6 *)ss;
if (addr) {
addr->setAddress(si6->sin6_addr.s6_addr);
addr->setAddress((const struct sockaddr *) ss);
#ifndef QT_NO_IPV6IFNAME
QSTACKARRAY(char, scopeid, IFNAMSIZ);
if (::if_indextoname(si6->sin6_scope_id, scopeid)) {
addr->setScopeId(QString::fromLatin1(scopeid));
addr->setScopeId(QByteArray(scopeid));
} else
#endif
addr->setScopeId(QString::number(si6->sin6_scope_id));
addr->setScopeId(QByteArray::number(si6->sin6_scope_id));
}
if (port)
*port = ntohs(si6->sin6_port);
@ -73,11 +73,11 @@ static inline void qt_socket_getPortAndAddress(const struct sockaddr_storage *ss
}
#endif
struct sockaddr_in *si4 = (struct sockaddr_in *)ss;
const struct sockaddr_in *si4 = (const struct sockaddr_in *)ss;
if (port)
*port = ntohs(si4->sin_port);
if (addr) {
addr->setAddress(ntohl(si4->sin_addr.s_addr));
addr->setAddress((const struct sockaddr *) ss);
}
}
@ -282,6 +282,8 @@ bool QAbstractSocketEnginePrivate::nativeConnect(const QHostAddress &addr, quint
qDebug("QAbstractSocketEnginePrivate::nativeConnect() : %d ", socketDescriptor);
#endif
const QByteArray addrStr = addr.toString();
struct sockaddr_in sockAddrIPv4;
struct sockaddr *sockAddrPtr = 0;
QT_SOCKLEN_T sockAddrSize = 0;
@ -295,14 +297,15 @@ bool QAbstractSocketEnginePrivate::nativeConnect(const QHostAddress &addr, quint
sockAddrIPv6.sin6_port = htons(port);
QString scopeid = addr.scopeId();
bool ok;
bool ok = false;
sockAddrIPv6.sin6_scope_id = scopeid.toInt(&ok);
#ifndef QT_NO_IPV6IFNAME
if (!ok)
sockAddrIPv6.sin6_scope_id = ::if_nametoindex(scopeid.toLatin1());
#endif
Q_IPV6ADDR ip6 = addr.toIPv6Address();
memcpy(&sockAddrIPv6.sin6_addr.s6_addr, &ip6, sizeof(ip6));
struct in6_addr inAddrIPv6;
inet_pton(AF_INET6, addrStr.constData(), &inAddrIPv6);
sockAddrIPv6.sin6_addr = inAddrIPv6;
sockAddrSize = sizeof(sockAddrIPv6);
sockAddrPtr = (struct sockaddr *) &sockAddrIPv6;
@ -312,7 +315,9 @@ bool QAbstractSocketEnginePrivate::nativeConnect(const QHostAddress &addr, quint
memset(&sockAddrIPv4, 0, sizeof(sockAddrIPv4));
sockAddrIPv4.sin_family = AF_INET;
sockAddrIPv4.sin_port = htons(port);
sockAddrIPv4.sin_addr.s_addr = htonl(addr.toIPv4Address());
struct in_addr inAddrIPv4;
inet_pton(AF_INET, addrStr.constData(), &inAddrIPv4);
sockAddrIPv4.sin_addr = inAddrIPv4;
sockAddrSize = sizeof(sockAddrIPv4);
sockAddrPtr = (struct sockaddr *) &sockAddrIPv4;
@ -387,6 +392,8 @@ bool QAbstractSocketEnginePrivate::nativeConnect(const QHostAddress &addr, quint
bool QAbstractSocketEnginePrivate::nativeBind(const QHostAddress &address, quint16 port)
{
const QByteArray addrStr = address.toString();
struct sockaddr_in sockAddrIPv4;
struct sockaddr *sockAddrPtr = 0;
QT_SOCKLEN_T sockAddrSize = 0;
@ -395,16 +402,18 @@ bool QAbstractSocketEnginePrivate::nativeBind(const QHostAddress &address, quint
struct sockaddr_in6 sockAddrIPv6;
if (address.protocol() == QAbstractSocket::IPv6Protocol) {
const QByteArray scopeid = address.scopeId();
memset(&sockAddrIPv6, 0, sizeof(sockAddrIPv6));
sockAddrIPv6.sin6_family = AF_INET6;
sockAddrIPv6.sin6_port = htons(port);
#ifndef QT_NO_IPV6IFNAME
sockAddrIPv6.sin6_scope_id = ::if_nametoindex(address.scopeId().toLatin1().data());
sockAddrIPv6.sin6_scope_id = ::if_nametoindex(scopeid.constData());
#else
sockAddrIPv6.sin6_scope_id = address.scopeId().toInt();
sockAddrIPv6.sin6_scope_id = scopeid.toInt();
#endif
Q_IPV6ADDR tmp = address.toIPv6Address();
memcpy(&sockAddrIPv6.sin6_addr.s6_addr, &tmp, sizeof(tmp));
struct in6_addr inAddrIPv6;
inet_pton(AF_INET6, addrStr.constData(), &inAddrIPv6);
sockAddrIPv6.sin6_addr = inAddrIPv6;
sockAddrSize = sizeof(sockAddrIPv6);
sockAddrPtr = (struct sockaddr *) &sockAddrIPv6;
} else
@ -413,7 +422,9 @@ bool QAbstractSocketEnginePrivate::nativeBind(const QHostAddress &address, quint
memset(&sockAddrIPv4, 0, sizeof(sockAddrIPv4));
sockAddrIPv4.sin_family = AF_INET;
sockAddrIPv4.sin_port = htons(port);
sockAddrIPv4.sin_addr.s_addr = htonl(address.toIPv4Address());
struct in_addr inAddrIPv4;
inet_pton(AF_INET, addrStr.constData(), &inAddrIPv4);
sockAddrIPv4.sin_addr = inAddrIPv4;
sockAddrSize = sizeof(sockAddrIPv4);
sockAddrPtr = (struct sockaddr *) &sockAddrIPv4;
}
@ -509,6 +520,8 @@ static bool multicastMembershipHelper(QAbstractSocketEnginePrivate *d,
const QHostAddress &groupAddress,
const QNetworkInterface &interface)
{
const QByteArray groupAddressStr = groupAddress.toString();
int level = 0;
int sockOpt = 0;
void *sockArg;
@ -524,9 +537,10 @@ static bool multicastMembershipHelper(QAbstractSocketEnginePrivate *d,
sockArg = &mreq6;
sockArgSize = sizeof(mreq6);
memset(&mreq6, 0, sizeof(mreq6));
Q_IPV6ADDR ip6 = groupAddress.toIPv6Address();
memcpy(&mreq6.ipv6mr_multiaddr, &ip6, sizeof(ip6));
mreq6.ipv6mr_interface = interface.index();
struct in6_addr ia6;
inet_pton(AF_INET6, groupAddressStr.constData(), &ia6);
mreq6.ipv6mr_multiaddr = ia6;
} else
#endif
if (groupAddress.protocol() == QAbstractSocket::IPv4Protocol) {
@ -535,13 +549,18 @@ static bool multicastMembershipHelper(QAbstractSocketEnginePrivate *d,
sockArg = &mreq4;
sockArgSize = sizeof(mreq4);
memset(&mreq4, 0, sizeof(mreq4));
mreq4.imr_multiaddr.s_addr = htonl(groupAddress.toIPv4Address());
struct in_addr ia;
inet_pton(AF_INET, groupAddressStr.constData(), &ia);
mreq4.imr_multiaddr = ia;
if (interface.isValid()) {
QList<QNetworkAddressEntry> addressEntries = interface.addressEntries();
if (!addressEntries.isEmpty()) {
QHostAddress firstIP = addressEntries.first().ip();
mreq4.imr_interface.s_addr = htonl(firstIP.toIPv4Address());
const QByteArray firstIPStr = firstIP.toString();
struct in_addr ia;
inet_pton(AF_INET, firstIPStr.constData(), &ia);
mreq4.imr_interface = ia;
} else {
d->setError(QAbstractSocket::NetworkError,
QAbstractSocketEnginePrivate::NetworkUnreachableErrorString);
@ -623,7 +642,9 @@ QNetworkInterface QAbstractSocketEnginePrivate::nativeMulticastInterface() const
if (::getsockopt(socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF, &v, &sizeofv) == -1)
return QNetworkInterface();
if (v.s_addr != 0 && sizeofv >= sizeof(v)) {
QHostAddress ipv4(ntohl(v.s_addr));
QSTACKARRAY(char, ntopbuffer, INET_ADDRSTRLEN + 1);
inet_ntop(AF_INET, &v.s_addr, ntopbuffer, INET_ADDRSTRLEN);
QHostAddress ipv4(ntopbuffer);
QList<QNetworkInterface> ifaces = QNetworkInterface::allInterfaces();
for (int i = 0; i < ifaces.count(); ++i) {
const QNetworkInterface &iface = ifaces.at(i);
@ -654,7 +675,8 @@ bool QAbstractSocketEnginePrivate::nativeSetMulticastInterface(const QNetworkInt
const QNetworkAddressEntry &entry = entries.at(i);
const QHostAddress &ip = entry.ip();
if (ip.protocol() == QAbstractSocket::IPv4Protocol) {
v.s_addr = htonl(ip.toIPv4Address());
const QByteArray ipStr = ip.toString();
inet_pton(AF_INET, ipStr.constData(), &v);
int r = ::setsockopt(socketDescriptor, IPPROTO_IP, IP_MULTICAST_IF, &v, sizeof(v));
if (r != -1)
return true;
@ -765,6 +787,8 @@ qint64 QAbstractSocketEnginePrivate::nativeReceiveDatagram(char *data, qint64 ma
qint64 QAbstractSocketEnginePrivate::nativeSendDatagram(const char *data, qint64 len,
const QHostAddress &host, quint16 port)
{
const QByteArray hostStr = host.toString();
struct sockaddr_in sockAddrIPv4;
struct sockaddr *sockAddrPtr = 0;
QT_SOCKLEN_T sockAddrSize = 0;
@ -776,8 +800,9 @@ qint64 QAbstractSocketEnginePrivate::nativeSendDatagram(const char *data, qint64
sockAddrIPv6.sin6_family = AF_INET6;
sockAddrIPv6.sin6_port = htons(port);
Q_IPV6ADDR tmp = host.toIPv6Address();
memcpy(&sockAddrIPv6.sin6_addr.s6_addr, &tmp, sizeof(tmp));
struct in6_addr ia6;
inet_pton(AF_INET6, hostStr.constData(), &ia6);
sockAddrIPv6.sin6_addr = ia6;
QString scopeid = host.scopeId();
bool ok;
sockAddrIPv6.sin6_scope_id = scopeid.toInt(&ok);
@ -793,7 +818,9 @@ qint64 QAbstractSocketEnginePrivate::nativeSendDatagram(const char *data, qint64
memset(&sockAddrIPv4, 0, sizeof(sockAddrIPv4));
sockAddrIPv4.sin_family = AF_INET;
sockAddrIPv4.sin_port = htons(port);
sockAddrIPv4.sin_addr.s_addr = htonl(host.toIPv4Address());
struct in_addr ia;
inet_pton(AF_INET, hostStr.constData(), &ia);
sockAddrIPv4.sin_addr = ia;
sockAddrSize = sizeof(sockAddrIPv4);
sockAddrPtr = (struct sockaddr *)&sockAddrIPv4;
}

View file

@ -231,7 +231,6 @@ static const struct ClassTblData {
{ QLatin1String("QHostInfo"), QLatin1String("QtNetwork/qhostinfo.h") },
{ QLatin1String("QHoverEvent"), QLatin1String("QtGui/qevent.h") },
{ QLatin1String("QIODevice"), QLatin1String("QtCore/qiodevice.h") },
{ QLatin1String("QIPv6Address"), QLatin1String("QtNetwork/qhostaddress.h") },
{ QLatin1String("QIcon"), QLatin1String("QtGui/qicon.h") },
{ QLatin1String("QIconEngine"), QLatin1String("QtGui/qiconengine.h") },
{ QLatin1String("QIdentityProxyModel"), QLatin1String("QtGui/qidentityproxymodel.h") },

View file

@ -62,10 +62,6 @@ private slots:
void hashKey();
void streaming_data();
void streaming();
void parseSubnet_data();
void parseSubnet();
void isInSubnet_data();
void isInSubnet();
};
QT_BEGIN_NAMESPACE
@ -75,7 +71,7 @@ namespace QTest {
{
if (addr.protocol() == QAbstractSocket::UnknownNetworkLayerProtocol)
return qstrdup("<invalid>");
return qstrdup(addr.toString().toLatin1());
return qstrdup(addr.toString());
}
}
QT_END_NAMESPACE
@ -107,7 +103,7 @@ void tst_QHostAddress::constructor_QString_data()
void tst_QHostAddress::constructor_QString()
{
QFETCH(QString, address);
QFETCH(QByteArray, address);
QFETCH(bool, ok);
QFETCH(int, protocol);
@ -136,87 +132,88 @@ void tst_QHostAddress::constructor_QString()
void tst_QHostAddress::setAddress_QString_data()
{
QTest::addColumn<QString>("address");
QTest::addColumn<QByteArray>("address");
QTest::addColumn<bool>("ok");
QTest::addColumn<QString>("resAddr");
QTest::addColumn<QByteArray>("resAddr");
QTest::addColumn<int>("protocol"); // 4: IPv4, 6: IPv6, other: undefined
//next we fill it with data
QTest::newRow("ip4_00") << QString("127.0.0.1") << (bool)true << QString("127.0.0.1") << 4;
QTest::newRow("ip4_01") << QString("255.3.2.1") << (bool)true << QString("255.3.2.1") << 4;
QTest::newRow("ip4_03") << QString(" 255.3.2.1") << (bool)true << QString("255.3.2.1") << 4;
QTest::newRow("ip4_04") << QString("255.3.2.1\r ") << (bool)true << QString("255.3.2.1") << 4;
QTest::newRow("ip4_05") << QString("0.0.0.0") << (bool)true << QString("0.0.0.0") << 4;
QTest::newRow("ip4_00") << QByteArray("127.0.0.1") << (bool)true << QByteArray("127.0.0.1") << 4;
QTest::newRow("ip4_01") << QByteArray("255.3.2.1") << (bool)true << QByteArray("255.3.2.1") << 4;
QTest::newRow("ip4_03") << QByteArray(" 255.3.2.1") << (bool)true << QByteArray("255.3.2.1") << 4;
QTest::newRow("ip4_04") << QByteArray("255.3.2.1\r ") << (bool)true << QByteArray("255.3.2.1") << 4;
QTest::newRow("ip4_05") << QByteArray("0.0.0.0") << (bool)true << QByteArray("0.0.0.0") << 4;
// for the format of IPv6 addresses see also RFC 5952
QTest::newRow("ip6_00") << QString("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210") << (bool)true << QString("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210") << 6;
QTest::newRow("ip6_01") << QString("1080:0000:0000:0000:0008:0800:200C:417A") << (bool)true << QString("1080::8:800:200C:417A") << 6;
QTest::newRow("ip6_02") << QString("1080:0:0:0:8:800:200C:417A") << (bool)true << QString("1080::8:800:200C:417A") << 6;
QTest::newRow("ip6_03") << QString("1080::8:800:200C:417A") << (bool)true << QString("1080::8:800:200C:417A") << 6;
QTest::newRow("ip6_04") << QString("FF01::43") << (bool)true << QString("FF01::43") << 6;
QTest::newRow("ip6_05") << QString("::1") << (bool)true << QString("::1") << 6;
QTest::newRow("ip6_06") << QString("1::") << (bool)true << QString("1::") << 6;
QTest::newRow("ip6_07") << QString("::") << (bool)true << QString("::") << 6;
QTest::newRow("ip6_08") << QString("0:0:0:0:0:0:13.1.68.3") << (bool)true << QString("::D01:4403") << 6;
QTest::newRow("ip6_09") << QString("::13.1.68.3") << (bool)true << QString("::D01:4403") << 6;
QTest::newRow("ip6_10") << QString("0:0:0:0:0:FFFF:129.144.52.38") << (bool)true << QString("::FFFF:8190:3426") << 6;
QTest::newRow("ip6_11") << QString("::FFFF:129.144.52.38") << (bool)true << QString("::FFFF:8190:3426") << 6;
QTest::newRow("ip6_12") << QString("1::FFFF:129.144.52.38") << (bool)true << QString("1::FFFF:8190:3426") << 6;
QTest::newRow("ip6_13") << QString("A:B::D:E") << (bool)true << QString("A:B::D:E") << 6;
QTest::newRow("ip6_14") << QString("1080:0:1:0:8:800:200C:417A") << (bool)true << QString("1080:0:1:0:8:800:200C:417A") << 6;
QTest::newRow("ip6_15") << QString("1080:0:1:0:8:800:200C:0") << (bool)true << QString("1080:0:1:0:8:800:200C:0") << 6;
QTest::newRow("ip6_16") << QString("1080:0:1:0:8:800:0:0") << (bool)true << QString("1080:0:1:0:8:800::") << 6;
QTest::newRow("ip6_17") << QString("1080:0:0:0:8:800:0:0") << (bool)true << QString("1080::8:800:0:0") << 6;
QTest::newRow("ip6_18") << QString("0:1:1:1:8:800:0:0") << (bool)true << QString("0:1:1:1:8:800::") << 6;
QTest::newRow("ip6_19") << QString("0:1:1:1:8:800:0:1") << (bool)true << QString("0:1:1:1:8:800:0:1") << 6;
QTest::newRow("ip6_00") << QByteArray("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210") << (bool)true << QByteArray("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210") << 6;
QTest::newRow("ip6_01") << QByteArray("1080:0000:0000:0000:0008:0800:200C:417A") << (bool)true << QByteArray("1080::8:800:200C:417A") << 6;
QTest::newRow("ip6_02") << QByteArray("1080:0:0:0:8:800:200C:417A") << (bool)true << QByteArray("1080::8:800:200C:417A") << 6;
QTest::newRow("ip6_03") << QByteArray("1080::8:800:200C:417A") << (bool)true << QByteArray("1080::8:800:200C:417A") << 6;
QTest::newRow("ip6_04") << QByteArray("FF01::43") << (bool)true << QByteArray("FF01::43") << 6;
QTest::newRow("ip6_05") << QByteArray("::1") << (bool)true << QByteArray("::1") << 6;
QTest::newRow("ip6_06") << QByteArray("1::") << (bool)true << QByteArray("1::") << 6;
QTest::newRow("ip6_07") << QByteArray("::") << (bool)true << QByteArray("::") << 6;
QTest::newRow("ip6_08") << QByteArray("0:0:0:0:0:0:13.1.68.3") << (bool)true << QByteArray("::D01:4403") << 6;
QTest::newRow("ip6_09") << QByteArray("::13.1.68.3") << (bool)true << QByteArray("::D01:4403") << 6;
QTest::newRow("ip6_10") << QByteArray("0:0:0:0:0:FFFF:129.144.52.38") << (bool)true << QByteArray("::FFFF:8190:3426") << 6;
QTest::newRow("ip6_11") << QByteArray("::FFFF:129.144.52.38") << (bool)true << QByteArray("::FFFF:8190:3426") << 6;
QTest::newRow("ip6_12") << QByteArray("1::FFFF:129.144.52.38") << (bool)true << QByteArray("1::FFFF:8190:3426") << 6;
QTest::newRow("ip6_13") << QByteArray("A:B::D:E") << (bool)true << QByteArray("A:B::D:E") << 6;
QTest::newRow("ip6_14") << QByteArray("1080:0:1:0:8:800:200C:417A") << (bool)true << QByteArray("1080:0:1:0:8:800:200C:417A") << 6;
QTest::newRow("ip6_15") << QByteArray("1080:0:1:0:8:800:200C:0") << (bool)true << QByteArray("1080:0:1:0:8:800:200C:0") << 6;
QTest::newRow("ip6_16") << QByteArray("1080:0:1:0:8:800:0:0") << (bool)true << QByteArray("1080:0:1:0:8:800::") << 6;
QTest::newRow("ip6_17") << QByteArray("1080:0:0:0:8:800:0:0") << (bool)true << QByteArray("1080::8:800:0:0") << 6;
QTest::newRow("ip6_18") << QByteArray("0:1:1:1:8:800:0:0") << (bool)true << QByteArray("0:1:1:1:8:800::") << 6;
QTest::newRow("ip6_19") << QByteArray("0:1:1:1:8:800:0:1") << (bool)true << QByteArray("0:1:1:1:8:800:0:1") << 6;
QTest::newRow("error_00") << QString("foobarcom") << (bool)false << QString() << 0;
QTest::newRow("error_01") << QString("foo.bar.com") << (bool)false << QString() << 0;
QTest::newRow("error_02") << QString("") << (bool)false << QString() << 0;
QTest::newRow("error_03") << QString() << (bool)false << QString() << 0;
QTest::newRow("error_04") << QString(" \t\r") << (bool)false << QString() << 0;
QTest::newRow("error_00") << QByteArray("foobarcom") << (bool)false << QByteArray() << 0;
QTest::newRow("error_01") << QByteArray("foo.bar.com") << (bool)false << QByteArray() << 0;
QTest::newRow("error_02") << QByteArray("") << (bool)false << QByteArray() << 0;
QTest::newRow("error_03") << QByteArray() << (bool)false << QByteArray() << 0;
QTest::newRow("error_04") << QByteArray(" \t\r") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip4_00") << QString("256.9.9.9") << (bool)false << QString() << 0;
QTest::newRow("error_ip4_01") << QString("-1.9.9.9") << (bool)false << QString() << 0;
QTest::newRow("error_ip4_02") << QString("123.0.0") << (bool)false << QString() << 0;
QTest::newRow("error_ip4_03") << QString("123.0.0.0.0") << (bool)false << QString() << 0;
QTest::newRow("error_ip4_04") << QString("255.2 3.2.1") << (bool)false << QString() << 0;
QTest::newRow("error_ip4_00") << QByteArray("256.9.9.9") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip4_01") << QByteArray("-1.9.9.9") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip4_02") << QByteArray("123.0.0") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip4_03") << QByteArray("123.0.0.0.0") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip4_04") << QByteArray("255.2 3.2.1") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip6_00") << QString(":") << (bool)false << QString() << 0;
QTest::newRow("error_ip6_01") << QString(":::") << (bool)false << QString() << 0;
QTest::newRow("error_ip6_02") << QString("::AAAA:") << (bool)false << QString() << 0;
QTest::newRow("error_ip6_03") << QString(":AAAA::") << (bool)false << QString() << 0;
QTest::newRow("error_ip6_04") << QString("FFFF:::129.144.52.38") << (bool)false << QString() << 0;
QTest::newRow("error_ip6_05") << QString("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210:1234") << (bool)false << QString() << 0;
QTest::newRow("error_ip6_06") << QString("129.144.52.38::") << (bool)false << QString() << 0;
QTest::newRow("error_ip6_07") << QString("::129.144.52.38:129.144.52.38") << (bool)false << QString() << 0;
QTest::newRow("error_ip6_08") << QString(":::129.144.52.38") << (bool)false << QString() << 0;
QTest::newRow("error_ip6_09") << QString("1FEDC:BA98:7654:3210:FEDC:BA98:7654:3210") << (bool)false << QString() << 0;
QTest::newRow("error_ip6_10") << QString("::FFFFFFFF") << (bool)false << QString() << 0;
QTest::newRow("error_ip6_11") << QString("::EFGH") << (bool)false << QString() << 0;
QTest::newRow("error_ip6_12") << QString("ABCD:ABCD:ABCD") << (bool)false << QString() << 0;
QTest::newRow("error_ip6_13") << QString("::ABCD:ABCD::") << (bool)false << QString() << 0;
QTest::newRow("error_ip6_14") << QString("1::2::3") << (bool)false << QString() << 0;
QTest::newRow("error_ip6_15") << QString("1:2:::") << (bool)false << QString() << 0;
QTest::newRow("error_ip6_16") << QString(":::1:2") << (bool)false << QString() << 0;
QTest::newRow("error_ip6_17") << QString("1:::2") << (bool)false << QString() << 0;
QTest::newRow("error_ip6_18") << QString("FEDC::7654:3210:FEDC:BA98::3210") << (bool)false << QString() << 0;
QTest::newRow("error_ip6_19") << QString("ABCD:ABCD:ABCD:1.2.3.4") << (bool)false << QString() << 0;
QTest::newRow("error_ip6_20") << QString("ABCD::ABCD::ABCD:1.2.3.4") << (bool)false << QString() << 0;
QTest::newRow("error_ip6_00") << QByteArray(":") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip6_01") << QByteArray(":::") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip6_02") << QByteArray("::AAAA:") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip6_03") << QByteArray(":AAAA::") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip6_04") << QByteArray("FFFF:::129.144.52.38") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip6_05") << QByteArray("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210:1234") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip6_06") << QByteArray("129.144.52.38::") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip6_07") << QByteArray("::129.144.52.38:129.144.52.38") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip6_08") << QByteArray(":::129.144.52.38") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip6_09") << QByteArray("1FEDC:BA98:7654:3210:FEDC:BA98:7654:3210") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip6_10") << QByteArray("::FFFFFFFF") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip6_11") << QByteArray("::EFGH") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip6_12") << QByteArray("ABCD:ABCD:ABCD") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip6_13") << QByteArray("::ABCD:ABCD::") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip6_14") << QByteArray("1::2::3") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip6_15") << QByteArray("1:2:::") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip6_16") << QByteArray(":::1:2") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip6_17") << QByteArray("1:::2") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip6_18") << QByteArray("FEDC::7654:3210:FEDC:BA98::3210") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip6_19") << QByteArray("ABCD:ABCD:ABCD:1.2.3.4") << (bool)false << QByteArray() << 0;
QTest::newRow("error_ip6_20") << QByteArray("ABCD::ABCD::ABCD:1.2.3.4") << (bool)false << QByteArray() << 0;
}
void tst_QHostAddress::setAddress_QString()
{
QFETCH(QString, address);
QFETCH(QByteArray, address);
QFETCH(bool, ok);
QFETCH(QByteArray, resAddr);
QFETCH(int, protocol);
QHostAddress hostAddr;
QVERIFY(hostAddr.setAddress(address) == ok);
if (ok)
QTEST(hostAddr.toString(), "resAddr");
QTEST(hostAddr.toString(), resAddr);
if ( protocol == 4 ) {
QVERIFY( hostAddr.protocol() == QAbstractSocket::IPv4Protocol || hostAddr.protocol() == QAbstractSocket::UnknownNetworkLayerProtocol );
@ -232,44 +229,45 @@ void tst_QHostAddress::setAddress_QString()
void tst_QHostAddress::specialAddresses_data()
{
QTest::addColumn<QString>("text");
QTest::addColumn<QByteArray>("text");
QTest::addColumn<int>("address");
QTest::addColumn<bool>("result");
QTest::newRow("localhost_1") << QString("127.0.0.1") << (int)QHostAddress::LocalHost << true;
QTest::newRow("localhost_2") << QString("127.0.0.2") << (int)QHostAddress::LocalHost << false;
QTest::newRow("localhost_3") << QString("127.0.0.2") << (int)QHostAddress::LocalHostIPv6 << false;
QTest::newRow("localhost_1") << QByteArray("127.0.0.1") << (int)QHostAddress::LocalHost << true;
QTest::newRow("localhost_2") << QByteArray("127.0.0.2") << (int)QHostAddress::LocalHost << false;
QTest::newRow("localhost_3") << QByteArray("127.0.0.2") << (int)QHostAddress::LocalHostIPv6 << false;
QTest::newRow("localhost_ipv6_4") << QString("::1") << (int)QHostAddress::LocalHostIPv6 << true;
QTest::newRow("localhost_ipv6_5") << QString("::2") << (int)QHostAddress::LocalHostIPv6 << false;
QTest::newRow("localhost_ipv6_6") << QString("::1") << (int)QHostAddress::LocalHost << false;
QTest::newRow("localhost_ipv6_4") << QByteArray("::1") << (int)QHostAddress::LocalHostIPv6 << true;
QTest::newRow("localhost_ipv6_5") << QByteArray("::2") << (int)QHostAddress::LocalHostIPv6 << false;
QTest::newRow("localhost_ipv6_6") << QByteArray("::1") << (int)QHostAddress::LocalHost << false;
QTest::newRow("null_1") << QString("") << (int)QHostAddress::Null << true;
QTest::newRow("null_2") << QString("bjarne") << (int)QHostAddress::Null << true;
QTest::newRow("null_1") << QByteArray("") << (int)QHostAddress::Null << true;
QTest::newRow("null_2") << QByteArray("bjarne") << (int)QHostAddress::Null << true;
QTest::newRow("compare_from_null") << QString("") << (int)QHostAddress::Broadcast << false;
QTest::newRow("compare_from_null") << QByteArray("") << (int)QHostAddress::Broadcast << false;
QTest::newRow("broadcast_1") << QString("255.255.255.255") << (int)QHostAddress::Any << false;
QTest::newRow("broadcast_2") << QString("255.255.255.255") << (int)QHostAddress::Broadcast << true;
QTest::newRow("broadcast_1") << QByteArray("255.255.255.255") << (int)QHostAddress::Any << false;
QTest::newRow("broadcast_2") << QByteArray("255.255.255.255") << (int)QHostAddress::Broadcast << true;
QTest::newRow("any_ipv6") << QString("::") << (int)QHostAddress::AnyIPv6 << true;
QTest::newRow("any_ipv4") << QString("0.0.0.0") << (int)QHostAddress::Any << true;
QTest::newRow("any_ipv6") << QByteArray("::") << (int)QHostAddress::AnyIPv6 << true;
QTest::newRow("any_ipv4") << QByteArray("0.0.0.0") << (int)QHostAddress::Any << true;
}
void tst_QHostAddress::specialAddresses()
{
QFETCH(QString, text);
QFETCH(QByteArray, text);
QFETCH(int, address);
QFETCH(bool, result);
QVERIFY((QHostAddress(text) == (QHostAddress::SpecialAddress)address) == result);
QHostAddress specialaddress = QHostAddress((QHostAddress::SpecialAddress)address);
QVERIFY((QHostAddress(text) == specialaddress) == result);
QHostAddress setter;
setter.setAddress(text);
if (result) {
QVERIFY(setter == (QHostAddress::SpecialAddress) address);
QVERIFY(setter == specialaddress);
} else {
QVERIFY(!((QHostAddress::SpecialAddress) address == setter));
QVERIFY(!(specialaddress == setter));
}
}
@ -308,9 +306,12 @@ void tst_QHostAddress::assignment()
QCOMPARE(address, QHostAddress("::1"));
QHostAddress addr("4.2.2.1");
const QByteArray addStr = addr.toString();
sockaddr_in sockAddr;
sockAddr.sin_family = AF_INET;
sockAddr.sin_addr.s_addr = htonl(addr.toIPv4Address());
struct in_addr ia;
inet_pton(AF_INET, addStr.constData(), &ia);
sockAddr.sin_addr = ia;
address.setAddress((sockaddr *)&sockAddr);
QCOMPARE(address, addr);
}
@ -318,17 +319,17 @@ void tst_QHostAddress::assignment()
void tst_QHostAddress::scopeId()
{
QHostAddress address("fe80::2e0:4cff:fefb:662a%eth0");
QCOMPARE(address.scopeId(), QString("eth0"));
QCOMPARE(address.toString().toLower(), QString("fe80::2e0:4cff:fefb:662a%eth0"));
QCOMPARE(address.scopeId(), QByteArray("eth0"));
QCOMPARE(address.toString().toLower(), QByteArray("fe80::2e0:4cff:fefb:662a%eth0"));
QHostAddress address2("fe80::2e0:4cff:fefb:662a");
QCOMPARE(address2.scopeId(), QString());
address2.setScopeId(QString("en0"));
QCOMPARE(address2.toString().toLower(), QString("fe80::2e0:4cff:fefb:662a%en0"));
QCOMPARE(address2.scopeId(), QByteArray());
address2.setScopeId(QByteArray("en0"));
QCOMPARE(address2.toString().toLower(), QByteArray("fe80::2e0:4cff:fefb:662a%en0"));
address2 = address;
QCOMPARE(address2.scopeId(), QString("eth0"));
QCOMPARE(address2.toString().toLower(), QString("fe80::2e0:4cff:fefb:662a%eth0"));
QCOMPARE(address2.scopeId(), QByteArray("eth0"));
QCOMPARE(address2.toString().toLower(), QByteArray("fe80::2e0:4cff:fefb:662a%eth0"));
}
void tst_QHostAddress::hashKey()
@ -341,17 +342,16 @@ void tst_QHostAddress::streaming_data()
{
QTest::addColumn<QHostAddress>("address");
QTest::newRow("1") << QHostAddress();
QTest::newRow("2") << QHostAddress(0xDEADBEEF);
QTest::newRow("3") << QHostAddress("127.128.129.130");
QTest::newRow("4") << QHostAddress("1080:0000:0000:0000:0008:0800:200C:417A");
QTest::newRow("5") << QHostAddress("fe80::2e0:4cff:fefb:662a%eth0");
QTest::newRow("6") << QHostAddress(QHostAddress::Null);
QTest::newRow("7") << QHostAddress(QHostAddress::LocalHost);
QTest::newRow("8") << QHostAddress(QHostAddress::LocalHostIPv6);
QTest::newRow("9") << QHostAddress(QHostAddress::Broadcast);
QTest::newRow("10") << QHostAddress(QHostAddress::Any);
QTest::newRow("11") << QHostAddress(QHostAddress::AnyIPv6);
QTest::newRow("12") << QHostAddress("foo.bar.com");
QTest::newRow("2") << QHostAddress("127.128.129.130");
QTest::newRow("3") << QHostAddress("1080:0000:0000:0000:0008:0800:200C:417A");
QTest::newRow("4") << QHostAddress("fe80::2e0:4cff:fefb:662a%eth0");
QTest::newRow("5") << QHostAddress(QHostAddress::Null);
QTest::newRow("6") << QHostAddress(QHostAddress::LocalHost);
QTest::newRow("7") << QHostAddress(QHostAddress::LocalHostIPv6);
QTest::newRow("8") << QHostAddress(QHostAddress::Broadcast);
QTest::newRow("9") << QHostAddress(QHostAddress::Any);
QTest::newRow("10") << QHostAddress(QHostAddress::AnyIPv6);
QTest::newRow("11") << QHostAddress("foo.bar.com");
}
void tst_QHostAddress::streaming()
@ -368,225 +368,6 @@ void tst_QHostAddress::streaming()
QCOMPARE(address, address2);
}
void tst_QHostAddress::parseSubnet_data()
{
QTest::addColumn<QString>("subnet");
QTest::addColumn<QHostAddress>("prefix");
QTest::addColumn<int>("prefixLength");
// invalid/error values
QTest::newRow("empty") << QString() << QHostAddress() << -1;
QTest::newRow("invalid_01") << "foobar" << QHostAddress() << -1;
QTest::newRow("invalid_02") << " " << QHostAddress() << -1;
QTest::newRow("invalid_03") << "1.2.3.a" << QHostAddress() << -1;
QTest::newRow("invalid_04") << "1.2.3.4.5" << QHostAddress() << -1;
QTest::newRow("invalid_05") << "1.2.3.4:80" << QHostAddress() << -1;
QTest::newRow("invalid_06") << "1.2.3.4/33" << QHostAddress() << -1;
QTest::newRow("invalid_07") << "1.2.3.4/-1" << QHostAddress() << -1;
QTest::newRow("invalid_08") << "1.2.3.4/256.0.0.0" << QHostAddress() << -1;
QTest::newRow("invalid_09") << "1.2.3.4/255.253.0.0" << QHostAddress() << -1;
QTest::newRow("invalid_10") << "1.2.3.4/255.0.0.255" << QHostAddress() << -1;
QTest::newRow("invalid_11") << "1.2.3.4." << QHostAddress() << -1;
QTest::newRow("invalid_20") << "ffff::/-1" << QHostAddress() << -1;
QTest::newRow("invalid_21") << "ffff::/129" << QHostAddress() << -1;
QTest::newRow("invalid_22") << "ffff::/255.255.0.0" << QHostAddress() << -1;
QTest::newRow("invalid_23") << "ffff::/ff00::" << QHostAddress() << -1;
// correct IPv4 with netmask
QTest::newRow("netmask_0") << "0.0.0.0/0.0.0.0" << QHostAddress(QHostAddress::Any) << 0;
QTest::newRow("netmask_1") << "0.0.0.0/255.128.0.0" << QHostAddress(QHostAddress::Any) << 9;
QTest::newRow("netmask_2") << "0.0.0.0/255.192.0.0" << QHostAddress(QHostAddress::Any) << 10;
QTest::newRow("netmask_3") << "0.0.0.0/255.224.0.0" << QHostAddress(QHostAddress::Any) << 11;
QTest::newRow("netmask_4") << "0.0.0.0/255.240.0.0" << QHostAddress(QHostAddress::Any) << 12;
QTest::newRow("netmask_5") << "0.0.0.0/255.248.0.0" << QHostAddress(QHostAddress::Any) << 13;
QTest::newRow("netmask_6") << "0.0.0.0/255.252.0.0" << QHostAddress(QHostAddress::Any) << 14;
QTest::newRow("netmask_7") << "0.0.0.0/255.254.0.0" << QHostAddress(QHostAddress::Any) << 15;
QTest::newRow("netmask_8") << "0.0.0.0/255.255.0.0" << QHostAddress(QHostAddress::Any) << 16;
QTest::newRow("netmask_16") << "0.0.0.0/255.255.0.0" << QHostAddress(QHostAddress::Any) << 16;
QTest::newRow("netmask_24") << "0.0.0.0/255.255.255.0" << QHostAddress(QHostAddress::Any) << 24;
QTest::newRow("netmask_31") << "0.0.0.0/255.255.255.254" << QHostAddress(QHostAddress::Any) << 31;
QTest::newRow("netmask_32") << "0.0.0.0/255.255.255.255" << QHostAddress(QHostAddress::Any) << 32;
// correct IPv4 with prefix
QTest::newRow("prefix_0") << "0.0.0.0/0" << QHostAddress(QHostAddress::Any) << 0;
QTest::newRow("prefix_1") << "0.0.0.0/1" << QHostAddress(QHostAddress::Any) << 1;
QTest::newRow("prefix_9") << "0.0.0.0/9" << QHostAddress(QHostAddress::Any) << 9;
QTest::newRow("prefix_31") << "0.0.0.0/31" << QHostAddress(QHostAddress::Any) << 31;
QTest::newRow("prefix_32") << "0.0.0.0/32" << QHostAddress(QHostAddress::Any) << 32;
// correct IPv4 without prefix or netmask
QTest::newRow("classA") << "10" << QHostAddress("10.0.0.0") << 8;
QTest::newRow("classA+dot") << "10." << QHostAddress("10.0.0.0") << 8;
QTest::newRow("classB") << "172.16" << QHostAddress("172.16.0.0") << 16;
QTest::newRow("classB+dot") << "172.16." << QHostAddress("172.16.0.0") << 16;
QTest::newRow("classC") << "192.168.0" << QHostAddress("192.168.0.0") << 24;
QTest::newRow("classC+dot") << "192.168.0" << QHostAddress("192.168.0.0") << 24;
QTest::newRow("full-ipv4") << "192.168.0.1" << QHostAddress("192.168.0.1") << 32;
// correct IPv6 with prefix
QTest::newRow("ipv6_01") << "::/0" << QHostAddress(QHostAddress::AnyIPv6) << 0;
QTest::newRow("ipv6_03") << "::/3" << QHostAddress(QHostAddress::AnyIPv6) << 3;
QTest::newRow("ipv6_16") << "::/16" << QHostAddress(QHostAddress::AnyIPv6) << 16;
QTest::newRow("ipv6_48") << "::/48" << QHostAddress(QHostAddress::AnyIPv6) << 48;
QTest::newRow("ipv6_127") << "::/127" << QHostAddress(QHostAddress::AnyIPv6) << 127;
QTest::newRow("ipv6_128") << "::/128" << QHostAddress(QHostAddress::AnyIPv6) << 128;
// tail bit clearing:
QTest::newRow("clear_01") << "255.255.255.255/31" << QHostAddress("255.255.255.254") << 31;
QTest::newRow("clear_08") << "255.255.255.255/24" << QHostAddress("255.255.255.0") << 24;
QTest::newRow("clear_09") << "255.255.255.255/23" << QHostAddress("255.255.254.0") << 23;
QTest::newRow("clear_10") << "255.255.255.255/22" << QHostAddress("255.255.252.0") << 22;
QTest::newRow("clear_11") << "255.255.255.255/21" << QHostAddress("255.255.248.0") << 21;
QTest::newRow("clear_12") << "255.255.255.255/20" << QHostAddress("255.255.240.0") << 20;
QTest::newRow("clear_13") << "255.255.255.255/19" << QHostAddress("255.255.224.0") << 19;
QTest::newRow("clear_14") << "255.255.255.255/18" << QHostAddress("255.255.192.0") << 18;
QTest::newRow("clear_15") << "255.255.255.255/17" << QHostAddress("255.255.128.0") << 17;
QTest::newRow("clear_16") << "255.255.255.255/16" << QHostAddress("255.255.0.0") << 16;
QTest::newRow("clear_24") << "255.255.255.255/8" << QHostAddress("255.0.0.0") << 8;
QTest::newRow("clear_31") << "255.255.255.255/1" << QHostAddress("128.0.0.0") << 1;
QTest::newRow("clear_32") << "255.255.255.255/0" << QHostAddress("0.0.0.0") << 0;
// same for IPv6:
QTest::newRow("ipv6_clear_01") << "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/127"
<< QHostAddress("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe")
<< 127;
QTest::newRow("ipv6_clear_07") << "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/121"
<< QHostAddress("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff80")
<< 121;
QTest::newRow("ipv6_clear_08") << "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/120"
<< QHostAddress("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00")
<< 120;
QTest::newRow("ipv6_clear_16") << "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/112"
<< QHostAddress("ffff:ffff:ffff:ffff:ffff:ffff:ffff:0")
<< 112;
QTest::newRow("ipv6_clear_80") << "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/48"
<< QHostAddress("ffff:ffff:ffff::")
<< 48;
QTest::newRow("ipv6_clear_81") << "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/47"
<< QHostAddress("ffff:ffff:fffe::")
<< 47;
QTest::newRow("ipv6_clear_82") << "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/46"
<< QHostAddress("ffff:ffff:fffc::")
<< 46;
QTest::newRow("ipv6_clear_83") << "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/45"
<< QHostAddress("ffff:ffff:fff8::")
<< 45;
QTest::newRow("ipv6_clear_84") << "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/44"
<< QHostAddress("ffff:ffff:fff0::")
<< 44;
QTest::newRow("ipv6_clear_85") << "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/43"
<< QHostAddress("ffff:ffff:ffe0::")
<< 43;
QTest::newRow("ipv6_clear_86") << "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/42"
<< QHostAddress("ffff:ffff:ffc0::")
<< 42;
QTest::newRow("ipv6_clear_87") << "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/41"
<< QHostAddress("ffff:ffff:ff80::")
<< 41;
QTest::newRow("ipv6_clear_88") << "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/40"
<< QHostAddress("ffff:ffff:ff00::")
<< 40;
QTest::newRow("ipv6_clear_125") << "3fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/3"
<< QHostAddress("2000::")
<< 3;
QTest::newRow("ipv6_clear_127") << "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/1"
<< QHostAddress("8000::")
<< 1;
QTest::newRow("ipv6_clear_128") << "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/0"
<< QHostAddress(QHostAddress::AnyIPv6)
<< 0;
}
void tst_QHostAddress::parseSubnet()
{
QFETCH(QString, subnet);
QFETCH(QHostAddress, prefix);
QFETCH(int, prefixLength);
QPair<QHostAddress, int> result = QHostAddress::parseSubnet(subnet);
QCOMPARE(result.first, prefix);
QCOMPARE(result.second, prefixLength);
}
void tst_QHostAddress::isInSubnet_data()
{
QTest::addColumn<QHostAddress>("address");
QTest::addColumn<QHostAddress>("prefix");
QTest::addColumn<int>("prefixLength");
QTest::addColumn<bool>("result");
// invalid QHostAddresses are never in any subnets
QTest::newRow("invalid_01") << QHostAddress() << QHostAddress() << 32 << false;
QTest::newRow("invalid_02") << QHostAddress() << QHostAddress(QHostAddress::Any) << 32 << false;
QTest::newRow("invalid_03") << QHostAddress() << QHostAddress(QHostAddress::Any) << 8 << false;
QTest::newRow("invalid_04") << QHostAddress() << QHostAddress(QHostAddress::Any) << 0 << false;
QTest::newRow("invalid_05") << QHostAddress() << QHostAddress("255.255.255.0") << 24 << false;
QTest::newRow("invalid_06") << QHostAddress() << QHostAddress(QHostAddress::AnyIPv6) << 0 << false;
QTest::newRow("invalid_07") << QHostAddress() << QHostAddress(QHostAddress::AnyIPv6) << 32 << false;
QTest::newRow("invalid_08") << QHostAddress() << QHostAddress(QHostAddress::AnyIPv6) << 128<< false;
// and no host address can be in a subnet whose prefix is invalid
QTest::newRow("invalid_20") << QHostAddress(QHostAddress::Any) << QHostAddress() << 16 << false;
QTest::newRow("invalid_21") << QHostAddress(QHostAddress::AnyIPv6) << QHostAddress() << 16 << false;
QTest::newRow("invalid_22") << QHostAddress(QHostAddress::LocalHost) << QHostAddress() << 16 << false;
QTest::newRow("invalid_23") << QHostAddress(QHostAddress::LocalHostIPv6) << QHostAddress() << 16 << false;
// negative netmasks don't make sense:
QTest::newRow("invalid_30") << QHostAddress(QHostAddress::Any) << QHostAddress(QHostAddress::Any) << -1 << false;
QTest::newRow("invalid_31") << QHostAddress(QHostAddress::AnyIPv6) << QHostAddress(QHostAddress::AnyIPv6) << -1 << false;
// we don't support IPv4 belonging in an IPv6 netmask and vice-versa
QTest::newRow("v4-in-v6") << QHostAddress(QHostAddress::LocalHost) << QHostAddress(QHostAddress::AnyIPv6) << 0 << false;
QTest::newRow("v6-in-v4") << QHostAddress(QHostAddress::LocalHostIPv6) << QHostAddress(QHostAddress::Any) << 0 << false;
QTest::newRow("v4-in-v6mapped") << QHostAddress(QHostAddress::LocalHost) << QHostAddress("ffff:ffff:ffff:ffff:ffff:ffff:255.0.0.0") << 113 << false;
QTest::newRow("v4-in-v6mapped2") << QHostAddress(QHostAddress::LocalHost) << QHostAddress("::ffff:255.0.0.0") << 113 << false;
// IPv4 correct ones
QTest::newRow("netmask_0") << QHostAddress(QHostAddress::LocalHost) << QHostAddress(QHostAddress::Any) << 0 << true;
QTest::newRow("netmask_0bis") << QHostAddress(QHostAddress::LocalHost) << QHostAddress("255.255.0.0") << 0 << true;
QTest::newRow("netmask_0ter") << QHostAddress(QHostAddress::LocalHost) << QHostAddress("1.2.3.4") << 0 << true;
QTest::newRow("netmask_1") << QHostAddress(QHostAddress::LocalHost) << QHostAddress(QHostAddress::Any) << 1 << true;
QTest::newRow("~netmask_1") << QHostAddress(QHostAddress::LocalHost) << QHostAddress("128.0.0.0") << 1 << false;
QTest::newRow("netmask_1bis") << QHostAddress("224.0.0.1") << QHostAddress("128.0.0.0") << 1 << true;
QTest::newRow("~netmask_1bis") << QHostAddress("224.0.0.1") << QHostAddress("0.0.0.0") << 1 << false;
QTest::newRow("netmask_8") << QHostAddress(QHostAddress::LocalHost) << QHostAddress("127.0.0.0") << 8 << true;
QTest::newRow("~netmask_8") << QHostAddress(QHostAddress::LocalHost) << QHostAddress("126.0.0.0") << 8 << false;
QTest::newRow("netmask_15") << QHostAddress("10.0.1.255") << QHostAddress("10.0.0.0") << 15 << true;
QTest::newRow("netmask_16") << QHostAddress("172.16.0.1") << QHostAddress("172.16.0.0") << 16 << true;
// the address is always in the subnet containing its address, regardless of length:
QTest::newRow("same_01") << QHostAddress(QHostAddress::LocalHost) << QHostAddress(QHostAddress::LocalHost) << 1 << true;
QTest::newRow("same_07") << QHostAddress(QHostAddress::LocalHost) << QHostAddress(QHostAddress::LocalHost) << 7 << true;
QTest::newRow("same_8") << QHostAddress(QHostAddress::LocalHost) << QHostAddress(QHostAddress::LocalHost) << 8 << true;
QTest::newRow("same_24") << QHostAddress(QHostAddress::LocalHost) << QHostAddress(QHostAddress::LocalHost) << 23 << true;
QTest::newRow("same_31") << QHostAddress(QHostAddress::LocalHost) << QHostAddress(QHostAddress::LocalHost) << 31 << true;
QTest::newRow("same_32") << QHostAddress(QHostAddress::LocalHost) << QHostAddress(QHostAddress::LocalHost) << 32 << true;
// IPv6 correct ones:
QTest::newRow("ipv6_netmask_0") << QHostAddress(QHostAddress::LocalHostIPv6) << QHostAddress(QHostAddress::AnyIPv6) << 0 << true;
QTest::newRow("ipv6_netmask_0bis") << QHostAddress(QHostAddress::LocalHostIPv6) << QHostAddress(QHostAddress::LocalHostIPv6) << 0 << true;
QTest::newRow("ipv6_netmask_0ter") << QHostAddress(QHostAddress::LocalHostIPv6) << QHostAddress("ffff::") << 0 << true;
QTest::newRow("ipv6_netmask_1") << QHostAddress(QHostAddress::LocalHostIPv6) << QHostAddress(QHostAddress::AnyIPv6) << 1 << true;
QTest::newRow("ipv6_netmask_1bis") << QHostAddress("fec0::1") << QHostAddress("8000::") << 1 << true;
QTest::newRow("~ipv6_netmask_1") << QHostAddress(QHostAddress::LocalHostIPv6) << QHostAddress("8000::") << 1 << false;
QTest::newRow("~ipv6_netmask_1bis") << QHostAddress("fec0::1") << QHostAddress("::") << 1 << false;
QTest::newRow("ipv6_netmask_47") << QHostAddress("2:3:5::1") << QHostAddress("2:3:4::") << 47 << true;
QTest::newRow("ipv6_netmask_48") << QHostAddress("2:3:4::1") << QHostAddress("2:3:4::") << 48 << true;
QTest::newRow("~ipv6_netmask_48") << QHostAddress("2:3:5::1") << QHostAddress("2:3:4::") << 48 << false;
QTest::newRow("ipv6_netmask_127") << QHostAddress("2:3:4:5::1") << QHostAddress("2:3:4:5::") << 127 << true;
QTest::newRow("ipv6_netmask_128") << QHostAddress("2:3:4:5::1") << QHostAddress("2:3:4:5::1") << 128 << true;
QTest::newRow("~ipv6_netmask_128") << QHostAddress("2:3:4:5::1") << QHostAddress("2:3:4:5::0") << 128 << false;
}
void tst_QHostAddress::isInSubnet()
{
QFETCH(QHostAddress, address);
QFETCH(QHostAddress, prefix);
QFETCH(int, prefixLength);
QTEST(address.isInSubnet(prefix, prefixLength), "result");
}
QTEST_MAIN(tst_QHostAddress)
#include "moc_tst_qhostaddress.cpp"

View file

@ -194,22 +194,22 @@ void tst_QHostInfo::lookupIPv6()
void tst_QHostInfo::reverseLookup_data()
{
QTest::addColumn<QString>("address");
QTest::addColumn<QByteArray>("address");
QTest::addColumn<QStringList>("hostNames");
QTest::addColumn<int>("err");
QTest::newRow("qt-project.org") << QString("87.238.53.172") << QStringList(QString("tufsla.qtproject.c.bitbit.net")) << 0;
QTest::newRow("qt-project.org") << QByteArray("87.238.53.172") << QStringList(QString("tufsla.qtproject.c.bitbit.net")) << 0;
QTest::newRow("gitorious.org") << QString("87.238.52.168") << QStringList(QString("gitorious.org")) << 0;
QTest::newRow("gitorious.org") << QByteArray("87.238.52.168") << QStringList(QString("gitorious.org")) << 0;
if (!ipv6Available)
QTest::newRow("bogus-name") << QString("1.2..4") << QStringList() << 1;
QTest::newRow("bogus-name") << QByteArray("1.2..4") << QStringList() << 1;
else
QTest::newRow("bogus-name") << QString("1::2::::4") << QStringList() << 1;
QTest::newRow("bogus-name") << QByteArray("1::2::::4") << QStringList() << 1;
}
void tst_QHostInfo::reverseLookup()
{
QFETCH(QString, address);
QFETCH(QByteArray, address);
QFETCH(QStringList, hostNames);
QFETCH(int, err);
@ -219,7 +219,7 @@ void tst_QHostInfo::reverseLookup()
QVERIFY(hostNames.contains(info.hostName()));
QCOMPARE(info.addresses().first(), QHostAddress(address));
} else {
QCOMPARE(info.hostName(), address);
QCOMPARE(info.hostName().toLatin1(), address);
QCOMPARE(info.error(), QHostInfo::HostNotFound);
}