summaryrefslogtreecommitdiffstats
path: root/src/network/kernel
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@digia.com>2013-08-14 09:05:42 +0200
committerFrederik Gladhorn <frederik.gladhorn@digia.com>2013-08-14 09:06:31 +0200
commit5c23199d4e8ff21661dfa5aacc13149178e78cab (patch)
tree322aee61581d7c85f1ccb65e47d1e79eba1ba6c9 /src/network/kernel
parent252bad7c589e03d3e12df02354b00a84d8e3159a (diff)
parentc8d9b17367cfdcb034d11f8a168ca4ae3993e7c3 (diff)
Merge remote-tracking branch 'origin/stable' into dev
Conflicts: configure mkspecs/macx-xcode/Info.plist.app mkspecs/macx-xcode/Info.plist.lib qmake/doc/qmake.qdocconf src/corelib/global/qglobal.h tests/auto/other/exceptionsafety/exceptionsafety.pro tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp Change-Id: I3c769a4a82dc2e99a12c69123fbf17613fd2ac2a
Diffstat (limited to 'src/network/kernel')
-rw-r--r--src/network/kernel/qnetworkinterface_unix.cpp20
1 files changed, 9 insertions, 11 deletions
diff --git a/src/network/kernel/qnetworkinterface_unix.cpp b/src/network/kernel/qnetworkinterface_unix.cpp
index 0ec9554c82..b090213861 100644
--- a/src/network/kernel/qnetworkinterface_unix.cpp
+++ b/src/network/kernel/qnetworkinterface_unix.cpp
@@ -81,7 +81,7 @@
QT_BEGIN_NAMESPACE
-static QHostAddress addressFromSockaddr(sockaddr *sa)
+static QHostAddress addressFromSockaddr(sockaddr *sa, int ifindex = 0, const QString &ifname = QString())
{
QHostAddress address;
if (!sa)
@@ -92,7 +92,11 @@ static QHostAddress addressFromSockaddr(sockaddr *sa)
else if (sa->sa_family == AF_INET6) {
address.setAddress(((sockaddr_in6 *)sa)->sin6_addr.s6_addr);
int scope = ((sockaddr_in6 *)sa)->sin6_scope_id;
- if (scope) {
+ if (scope && scope == ifindex) {
+ // this is the most likely scenario:
+ // a scope ID in a socket is that of the interface this address came from
+ address.setScopeId(ifname);
+ } else if (scope) {
#ifndef QT_NO_IPV6IFNAME
char scopeid[IFNAMSIZ];
if (::if_indextoname(scope, scopeid)) {
@@ -410,14 +414,9 @@ static QList<QNetworkInterfacePrivate *> interfaceListing()
{
QList<QNetworkInterfacePrivate *> interfaces;
- int socket;
- if ((socket = qt_safe_socket(AF_INET, SOCK_STREAM, IPPROTO_IP)) == -1)
- return interfaces; // error
-
ifaddrs *interfaceListing;
if (getifaddrs(&interfaceListing) == -1) {
// error
- ::close(socket);
return interfaces;
}
@@ -439,20 +438,19 @@ static QList<QNetworkInterfacePrivate *> interfaceListing()
}
QNetworkAddressEntry entry;
- entry.setIp(addressFromSockaddr(ptr->ifa_addr));
+ entry.setIp(addressFromSockaddr(ptr->ifa_addr, iface->index, iface->name));
if (entry.ip().isNull())
// could not parse the address
continue;
- entry.setNetmask(addressFromSockaddr(ptr->ifa_netmask));
+ entry.setNetmask(addressFromSockaddr(ptr->ifa_netmask, iface->index, iface->name));
if (iface->flags & QNetworkInterface::CanBroadcast)
- entry.setBroadcast(addressFromSockaddr(ptr->ifa_broadaddr));
+ entry.setBroadcast(addressFromSockaddr(ptr->ifa_broadaddr, iface->index, iface->name));
iface->addressEntries << entry;
}
freeifaddrs(interfaceListing);
- ::close(socket);
return interfaces;
}
#endif