network: Fix use of carrier information
Some RTM_NEWLINK messages may not have the IFLA_CARRIER information.
This is the case when a WiFi interface report scan result are
available. `carrier` is used regardless of if it is present in the
message or not. This would result in the interface appearing
"disconnected" in waybar when it isn't.
This patch now check that `carrier` is available before using it.
The same thing could potentially happen to `ifname` so check if it's
set before recording it.
Fixes: c1427ff
(network: Handle carrier information)
Fixes #388
This commit is contained in:
parent
94a882bf95
commit
28dfb0ba41
|
@ -425,7 +425,7 @@ int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) {
|
||||||
struct rtattr *ifla = IFLA_RTA(ifi);
|
struct rtattr *ifla = IFLA_RTA(ifi);
|
||||||
const char *ifname = NULL;
|
const char *ifname = NULL;
|
||||||
size_t ifname_len = 0;
|
size_t ifname_len = 0;
|
||||||
bool carrier = false;
|
std::optional<bool> carrier;
|
||||||
|
|
||||||
if (net->ifid_ != -1 && ifi->ifi_index != net->ifid_) {
|
if (net->ifid_ != -1 && ifi->ifi_index != net->ifid_) {
|
||||||
return NL_OK;
|
return NL_OK;
|
||||||
|
@ -446,11 +446,13 @@ int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) {
|
||||||
|
|
||||||
if (!is_del_event && ifi->ifi_index == net->ifid_) {
|
if (!is_del_event && ifi->ifi_index == net->ifid_) {
|
||||||
// Update inferface information
|
// Update inferface information
|
||||||
if (net->ifname_.empty()) {
|
if (net->ifname_.empty() && ifname != NULL) {
|
||||||
std::string new_ifname (ifname, ifname_len);
|
std::string new_ifname (ifname, ifname_len);
|
||||||
net->ifname_ = new_ifname;
|
net->ifname_ = new_ifname;
|
||||||
}
|
}
|
||||||
net->carrier_ = carrier;
|
if (carrier.has_value()) {
|
||||||
|
net->carrier_ = carrier.value();
|
||||||
|
}
|
||||||
} else if (!is_del_event && net->ifid_ == -1) {
|
} else if (!is_del_event && net->ifid_ == -1) {
|
||||||
// Checking if it's an interface we care about.
|
// Checking if it's an interface we care about.
|
||||||
std::string new_ifname (ifname, ifname_len);
|
std::string new_ifname (ifname, ifname_len);
|
||||||
|
@ -459,7 +461,9 @@ int waybar::modules::Network::handleEvents(struct nl_msg *msg, void *data) {
|
||||||
|
|
||||||
net->ifname_ = new_ifname;
|
net->ifname_ = new_ifname;
|
||||||
net->ifid_ = ifi->ifi_index;
|
net->ifid_ = ifi->ifi_index;
|
||||||
net->carrier_ = carrier;
|
if (carrier.has_value()) {
|
||||||
|
net->carrier_ = carrier.value();
|
||||||
|
}
|
||||||
net->thread_timer_.wake_up();
|
net->thread_timer_.wake_up();
|
||||||
/* An address for this new interface should be received via an
|
/* An address for this new interface should be received via an
|
||||||
* RTM_NEWADDR event either because we ask for a dump of both links
|
* RTM_NEWADDR event either because we ask for a dump of both links
|
||||||
|
|
Loading…
Reference in New Issue