|
|
@ -14,7 +14,17 @@ |
|
|
|
#include <QSize>
|
|
|
|
#include <QtEndian>
|
|
|
|
|
|
|
|
extern "C" { |
|
|
|
#include <netinet/in.h>
|
|
|
|
#include <net/if.h>
|
|
|
|
} |
|
|
|
|
|
|
|
static QString ifidx2name(unsigned int ifindex) { |
|
|
|
char buf[IF_NAMESIZE]; |
|
|
|
char *n = ::if_indextoname(ifindex, buf); |
|
|
|
if (!n) return QString(); |
|
|
|
return QString::fromUtf8(n, qstrnlen(n, IF_NAMESIZE)); |
|
|
|
} |
|
|
|
|
|
|
|
namespace Avahi { |
|
|
|
|
|
|
@ -23,12 +33,9 @@ namespace Avahi { |
|
|
|
case AVAHI_PROTO_INET: |
|
|
|
return QHostAddress(qFromBigEndian((quint32) address->data.ipv4.address)); |
|
|
|
case AVAHI_PROTO_INET6: { |
|
|
|
struct sockaddr_in6 a; |
|
|
|
memset(&a, 0, sizeof(a)); |
|
|
|
a.sin6_family = AF_INET6; |
|
|
|
a.sin6_scope_id = interface; |
|
|
|
memcpy(a.sin6_addr.s6_addr, address->data.ipv6.address, 16); |
|
|
|
return QHostAddress((const sockaddr*) &a); |
|
|
|
QHostAddress addr((quint8*) address->data.ipv6.address); |
|
|
|
if (interface >= 0) addr.setScopeId(ifidx2name(interface)); |
|
|
|
return addr; |
|
|
|
} |
|
|
|
case AVAHI_PROTO_UNSPEC: |
|
|
|
return QHostAddress(); |
|
|
|