From 1145788ab34b728940d255305585890b83dc9b10 Mon Sep 17 00:00:00 2001 From: Moritz Jordan Date: Sat, 4 Jan 2020 03:11:34 +0100 Subject: [PATCH] fix(network): display of IPv6 address --- src/modules/network.cpp | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/src/modules/network.cpp b/src/modules/network.cpp index a332d5a2..f9146c75 100644 --- a/src/modules/network.cpp +++ b/src/modules/network.cpp @@ -439,7 +439,6 @@ out: } void waybar::modules::Network::getInterfaceAddress() { - unsigned int cidrRaw; struct ifaddrs *ifaddr, *ifa; cidr_ = 0; int success = getifaddrs(&ifaddr); @@ -451,18 +450,34 @@ void waybar::modules::Network::getInterfaceAddress() { if (ifa->ifa_addr != nullptr && ifa->ifa_addr->sa_family == family_ && ifa->ifa_name == ifname_) { char ipaddr[INET6_ADDRSTRLEN]; - ipaddr_ = inet_ntop(family_, - &reinterpret_cast(ifa->ifa_addr)->sin_addr, - ipaddr, - INET6_ADDRSTRLEN); char netmask[INET6_ADDRSTRLEN]; - auto net_addr = reinterpret_cast(ifa->ifa_netmask); - netmask_ = inet_ntop(family_, &net_addr->sin_addr, netmask, INET6_ADDRSTRLEN); - cidrRaw = net_addr->sin_addr.s_addr; unsigned int cidr = 0; - while (cidrRaw) { - cidr += cidrRaw & 1; - cidrRaw >>= 1; + if (family_ == AF_INET) { + ipaddr_ = inet_ntop(AF_INET, + &reinterpret_cast(ifa->ifa_addr)->sin_addr, + ipaddr, + INET_ADDRSTRLEN); + auto net_addr = reinterpret_cast(ifa->ifa_netmask); + netmask_ = inet_ntop(AF_INET, &net_addr->sin_addr, netmask, INET_ADDRSTRLEN); + unsigned int cidrRaw = net_addr->sin_addr.s_addr; + while (cidrRaw) { + cidr += cidrRaw & 1; + cidrRaw >>= 1; + } + } else { + ipaddr_ = inet_ntop(AF_INET6, + &reinterpret_cast(ifa->ifa_addr)->sin6_addr, + ipaddr, + INET6_ADDRSTRLEN); + auto net_addr = reinterpret_cast(ifa->ifa_netmask); + netmask_ = inet_ntop(AF_INET6, &net_addr->sin6_addr, netmask, INET6_ADDRSTRLEN); + for (size_t i = 0; i < sizeof(net_addr->sin6_addr.s6_addr); ++i) { + unsigned char cidrRaw = net_addr->sin6_addr.s6_addr[i]; + while (cidrRaw) { + cidr += cidrRaw & 1; + cidrRaw >>= 1; + } + } } cidr_ = cidr; break;