From 5c66b1a7700a21e2c568c0569d10d7314a9bb450 Mon Sep 17 00:00:00 2001 From: Robinhuett <5955614+Robinhuett@users.noreply.github.com> Date: Tue, 13 Nov 2018 21:31:26 +0100 Subject: [PATCH 1/3] feat(network): display ip address and subnetmask --- include/modules/network.hpp | 6 ++++++ src/modules/network.cpp | 36 +++++++++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/include/modules/network.hpp b/include/modules/network.hpp index 4e81c99..50b77e7 100644 --- a/include/modules/network.hpp +++ b/include/modules/network.hpp @@ -1,6 +1,8 @@ #pragma once #include +#include +#include #include #include #include @@ -24,6 +26,7 @@ class Network : public ALabel { void disconnected(); void initNL80211(); int getExternalInterface(); + void getInterfaceAddress(); void parseEssid(struct nlattr**); void parseSignal(struct nlattr**); bool associatedOrJoined(struct nlattr**); @@ -39,6 +42,9 @@ class Network : public ALabel { std::string essid_; std::string ifname_; + std::string ipaddr_; + std::string netmask_; + int cidr_; int signal_strength_dbm_; uint16_t signal_strength_; }; diff --git a/src/modules/network.cpp b/src/modules/network.cpp index e57e44a..b5b7fd8 100644 --- a/src/modules/network.cpp +++ b/src/modules/network.cpp @@ -26,6 +26,7 @@ waybar::modules::Network::Network(const Json::Value& config) char ifname[IF_NAMESIZE]; if_indextoname(ifid_, ifname); ifname_ = ifname; + getInterfaceAddress(); } } initNL80211(); @@ -64,6 +65,7 @@ waybar::modules::Network::Network(const Json::Value& config) char ifname[IF_NAMESIZE]; if_indextoname(ifid_, ifname); ifname_ = ifname; + getInterfaceAddress(); need_update = true; } } @@ -101,7 +103,10 @@ auto waybar::modules::Network::update() -> void fmt::arg("essid", essid_), fmt::arg("signaldBm", signal_strength_dbm_), fmt::arg("signalStrength", signal_strength_), - fmt::arg("ifname", ifname_) + fmt::arg("ifname", ifname_), + fmt::arg("netmask", netmask_), + fmt::arg("ipaddr", ipaddr_), + fmt::arg("cidr", cidr_) )); } @@ -110,6 +115,9 @@ void waybar::modules::Network::disconnected() essid_.clear(); signal_strength_dbm_ = 0; signal_strength_ = 0; + ipaddr_.clear(); + netmask_.clear(); + cidr_ = 0; ifname_.clear(); ifid_ = -1; } @@ -255,6 +263,32 @@ out: return ifidx; } +void waybar::modules::Network::getInterfaceAddress() { + unsigned int cidrRaw; + struct ifaddrs *ifaddr, *ifa; + int success = getifaddrs(&ifaddr); + if (success == 0) { + ifa = ifaddr; + while(ifa != NULL && ipaddr_.empty() && netmask_.empty()) { + if(ifa->ifa_addr->sa_family == family_) { + if(strcmp(ifa->ifa_name, ifname_.c_str()) == 0){ + ipaddr_=inet_ntoa(((struct sockaddr_in*)ifa->ifa_addr)->sin_addr); + netmask_=inet_ntoa(((struct sockaddr_in*)ifa->ifa_netmask)->sin_addr); + cidrRaw = ((struct sockaddr_in *)(ifa->ifa_netmask))->sin_addr.s_addr; + unsigned int cidr = 0; + while (cidrRaw) { + cidr += cidrRaw & 1; + cidrRaw >>= 1; + } + cidr_ = cidr; + } + } + ifa = ifa->ifa_next; + } + } + freeifaddrs(ifaddr); +} + int waybar::modules::Network::netlinkRequest(int fd, void *req, uint32_t reqlen, uint32_t groups) { From 50e782e02849bcc34faaf63372833b32aa2a8045 Mon Sep 17 00:00:00 2001 From: Robinhuett <5955614+Robinhuett@users.noreply.github.com> Date: Tue, 13 Nov 2018 21:40:47 +0100 Subject: [PATCH 2/3] chore: update example config --- resources/config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/config b/resources/config index 5bbeddf..8cfbd4d 100644 --- a/resources/config +++ b/resources/config @@ -59,7 +59,7 @@ "network": { // "interface": "wlp2s0", // (Optional) To force the use of this interface "format-wifi": "{essid} ({signalStrength}%) ", - "format-ethernet": "{ifname} ", + "format-ethernet": "{ifname}: {ipaddr}/{cidr} ", "format-disconnected": "Disconnected ⚠" }, "pulseaudio": { From 75cc1bc318bf84f438cac473a525d9de47c0f766 Mon Sep 17 00:00:00 2001 From: Robinhuett <5955614+Robinhuett@users.noreply.github.com> Date: Wed, 14 Nov 2018 10:31:17 +0100 Subject: [PATCH 3/3] refactor(network): codestyle and error handling --- src/modules/network.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/modules/network.cpp b/src/modules/network.cpp index b5b7fd8..34db62f 100644 --- a/src/modules/network.cpp +++ b/src/modules/network.cpp @@ -269,11 +269,11 @@ void waybar::modules::Network::getInterfaceAddress() { int success = getifaddrs(&ifaddr); if (success == 0) { ifa = ifaddr; - while(ifa != NULL && ipaddr_.empty() && netmask_.empty()) { - if(ifa->ifa_addr->sa_family == family_) { - if(strcmp(ifa->ifa_name, ifname_.c_str()) == 0){ - ipaddr_=inet_ntoa(((struct sockaddr_in*)ifa->ifa_addr)->sin_addr); - netmask_=inet_ntoa(((struct sockaddr_in*)ifa->ifa_netmask)->sin_addr); + while (ifa != NULL && ipaddr_.empty() && netmask_.empty()) { + if (ifa->ifa_addr->sa_family == family_) { + if (strcmp(ifa->ifa_name, ifname_.c_str()) == 0) { + ipaddr_ = inet_ntoa(((struct sockaddr_in*)ifa->ifa_addr)->sin_addr); + netmask_ = inet_ntoa(((struct sockaddr_in*)ifa->ifa_netmask)->sin_addr); cidrRaw = ((struct sockaddr_in *)(ifa->ifa_netmask))->sin_addr.s_addr; unsigned int cidr = 0; while (cidrRaw) { @@ -285,8 +285,12 @@ void waybar::modules::Network::getInterfaceAddress() { } ifa = ifa->ifa_next; } + freeifaddrs(ifaddr); + } else { + ipaddr_.clear(); + netmask_.clear(); + cidr_ = 0; } - freeifaddrs(ifaddr); } int waybar::modules::Network::netlinkRequest(int fd, void *req,