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] 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 4e81c998..50b77e7d 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 e57e44aa..b5b7fd87 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) {