refactor(network): const methods

This commit is contained in:
Alex 2019-05-22 22:20:50 +02:00
parent 755d38d4d6
commit 85d60f95c4
2 changed files with 29 additions and 25 deletions

View File

@ -30,24 +30,24 @@ class Network : public ALabel {
void worker(); void worker();
void createInfoSocket(); void createInfoSocket();
void createEventSocket(); void createEventSocket();
int getExternalInterface(int skip_idx = -1); int getExternalInterface(int skip_idx = -1) const;
void getInterfaceAddress(); void getInterfaceAddress();
int netlinkRequest(void*, uint32_t, uint32_t groups = 0); int netlinkRequest(void*, uint32_t, uint32_t groups = 0) const;
int netlinkResponse(void*, uint32_t, uint32_t groups = 0); int netlinkResponse(void*, uint32_t, uint32_t groups = 0) const;
void parseEssid(struct nlattr**); void parseEssid(struct nlattr**);
void parseSignal(struct nlattr**); void parseSignal(struct nlattr**);
void parseFreq(struct nlattr**); void parseFreq(struct nlattr**);
bool associatedOrJoined(struct nlattr**); bool associatedOrJoined(struct nlattr**);
bool checkInterface(struct ifinfomsg* rtif, std::string name); bool checkInterface(struct ifinfomsg* rtif, std::string name);
int getPreferredIface(int skip_idx = -1); int getPreferredIface(int skip_idx = -1) const;
auto getInfo() -> void; auto getInfo() -> void;
void clearIface(); void clearIface();
bool wildcardMatch(const std::string& pattern, const std::string& text); bool wildcardMatch(const std::string& pattern, const std::string& text) const;
waybar::util::SleeperThread thread_; waybar::util::SleeperThread thread_;
waybar::util::SleeperThread thread_timer_; waybar::util::SleeperThread thread_timer_;
int ifid_; int ifid_;
int last_ext_iface_; mutable int last_ext_iface_;
sa_family_t family_; sa_family_t family_;
struct sockaddr_nl nladdr_ = {0}; struct sockaddr_nl nladdr_ = {0};
struct nl_sock* sock_ = nullptr; struct nl_sock* sock_ = nullptr;

View File

@ -101,6 +101,7 @@ waybar::modules::Network::Network(const std::string &id, const Json::Value &conf
createEventSocket(); createEventSocket();
auto default_iface = getPreferredIface(); auto default_iface = getPreferredIface();
if (default_iface != -1) { if (default_iface != -1) {
ifid_ = default_iface;
char ifname[IF_NAMESIZE]; char ifname[IF_NAMESIZE];
if_indextoname(default_iface, ifname); if_indextoname(default_iface, ifname);
ifname_ = ifname; ifname_ = ifname;
@ -339,7 +340,7 @@ auto waybar::modules::Network::update() -> void {
} }
// Based on https://gist.github.com/Yawning/c70d804d4b8ae78cc698 // Based on https://gist.github.com/Yawning/c70d804d4b8ae78cc698
int waybar::modules::Network::getExternalInterface(int skip_idx) { int waybar::modules::Network::getExternalInterface(int skip_idx) const {
static const uint32_t route_buffer_size = 8192; static const uint32_t route_buffer_size = 8192;
struct nlmsghdr * hdr = nullptr; struct nlmsghdr * hdr = nullptr;
struct rtmsg * rt = nullptr; struct rtmsg * rt = nullptr;
@ -497,7 +498,7 @@ void waybar::modules::Network::getInterfaceAddress() {
freeifaddrs(ifaddr); freeifaddrs(ifaddr);
} }
int waybar::modules::Network::netlinkRequest(void *req, uint32_t reqlen, uint32_t groups) { int waybar::modules::Network::netlinkRequest(void *req, uint32_t reqlen, uint32_t groups) const {
struct sockaddr_nl sa = {}; struct sockaddr_nl sa = {};
sa.nl_family = AF_NETLINK; sa.nl_family = AF_NETLINK;
sa.nl_groups = groups; sa.nl_groups = groups;
@ -511,7 +512,7 @@ int waybar::modules::Network::netlinkRequest(void *req, uint32_t reqlen, uint32_
return sendmsg(nl_socket_get_fd(ev_sock_), &msg, 0); return sendmsg(nl_socket_get_fd(ev_sock_), &msg, 0);
} }
int waybar::modules::Network::netlinkResponse(void *resp, uint32_t resplen, uint32_t groups) { int waybar::modules::Network::netlinkResponse(void *resp, uint32_t resplen, uint32_t groups) const {
struct sockaddr_nl sa = {}; struct sockaddr_nl sa = {};
sa.nl_family = AF_NETLINK; sa.nl_family = AF_NETLINK;
sa.nl_groups = groups; sa.nl_groups = groups;
@ -542,12 +543,12 @@ bool waybar::modules::Network::checkInterface(struct ifinfomsg *rtif, std::strin
return external_iface == rtif->ifi_index; return external_iface == rtif->ifi_index;
} }
int waybar::modules::Network::getPreferredIface(int skip_idx) { int waybar::modules::Network::getPreferredIface(int skip_idx) const {
int ifid = -1;
if (config_["interface"].isString()) { if (config_["interface"].isString()) {
ifid_ = if_nametoindex(config_["interface"].asCString()); ifid = if_nametoindex(config_["interface"].asCString());
if (ifid_ > 0) { if (ifid > 0) {
ifname_ = config_["interface"].asString(); return ifid;
return ifid_;
} else { } else {
// Try with wildcard // Try with wildcard
struct ifaddrs *ifaddr, *ifa; struct ifaddrs *ifaddr, *ifa;
@ -556,24 +557,21 @@ int waybar::modules::Network::getPreferredIface(int skip_idx) {
return -1; return -1;
} }
ifa = ifaddr; ifa = ifaddr;
ifid_ = -1; ifid = -1;
while (ifa != nullptr) { while (ifa != nullptr) {
if (wildcardMatch(config_["interface"].asString(), ifa->ifa_name)) { if (wildcardMatch(config_["interface"].asString(), ifa->ifa_name)) {
ifid_ = if_nametoindex(ifa->ifa_name); ifid = if_nametoindex(ifa->ifa_name);
break; break;
} }
ifa = ifa->ifa_next; ifa = ifa->ifa_next;
} }
freeifaddrs(ifaddr); freeifaddrs(ifaddr);
return ifid_; return ifid;
} }
} }
ifid_ = getExternalInterface(skip_idx); ifid = getExternalInterface(skip_idx);
if (ifid_ > 0) { if (ifid > 0) {
char ifname[IF_NAMESIZE]; return ifid;
if_indextoname(ifid_, ifname);
ifname_ = ifname;
return ifid_;
} }
return -1; return -1;
} }
@ -636,9 +634,14 @@ int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) {
net->dp.emit(); net->dp.emit();
} else if (rtif->ifi_index == net->ifid_) { } else if (rtif->ifi_index == net->ifid_) {
net->clearIface(); net->clearIface();
net->ifid_ = -1;
// Check for a new interface and get info // Check for a new interface and get info
auto new_iface = net->getPreferredIface(rtif->ifi_index); auto new_iface = net->getPreferredIface(rtif->ifi_index);
if (new_iface != -1) { if (new_iface != -1) {
net->ifid_ = new_iface;
char ifname[IF_NAMESIZE];
if_indextoname(new_iface, ifname);
net->ifname_ = ifname;
net->getInterfaceAddress(); net->getInterfaceAddress();
net->thread_timer_.wake_up(); net->thread_timer_.wake_up();
} else { } else {
@ -758,7 +761,8 @@ auto waybar::modules::Network::getInfo() -> void {
} }
// https://gist.github.com/rressi/92af77630faf055934c723ce93ae2495 // https://gist.github.com/rressi/92af77630faf055934c723ce93ae2495
bool waybar::modules::Network::wildcardMatch(const std::string &pattern, const std::string &text) { bool waybar::modules::Network::wildcardMatch(const std::string &pattern,
const std::string &text) const {
auto P = int(pattern.size()); auto P = int(pattern.size());
auto T = int(text.size()); auto T = int(text.size());