refactor(Network): clean nl socket
This commit is contained in:
parent
0dba3abc1d
commit
0ad2bc7516
|
@ -22,6 +22,7 @@ class Network : public ALabel {
|
||||||
static int scanCb(struct nl_msg*, void*);
|
static int scanCb(struct nl_msg*, void*);
|
||||||
|
|
||||||
void disconnected();
|
void disconnected();
|
||||||
|
void initNL80211();
|
||||||
int getExternalInterface();
|
int getExternalInterface();
|
||||||
void parseEssid(struct nlattr**);
|
void parseEssid(struct nlattr**);
|
||||||
void parseSignal(struct nlattr**);
|
void parseSignal(struct nlattr**);
|
||||||
|
@ -33,6 +34,8 @@ class Network : public ALabel {
|
||||||
sa_family_t family_;
|
sa_family_t family_;
|
||||||
int sock_fd_;
|
int sock_fd_;
|
||||||
struct sockaddr_nl nladdr_ = {0};
|
struct sockaddr_nl nladdr_ = {0};
|
||||||
|
struct nl_sock* sk_ = nullptr;
|
||||||
|
int nl80211_id_;
|
||||||
|
|
||||||
std::string essid_;
|
std::string essid_;
|
||||||
std::string ifname_;
|
std::string ifname_;
|
||||||
|
|
|
@ -28,6 +28,7 @@ waybar::modules::Network::Network(const Json::Value& config)
|
||||||
ifname_ = ifname;
|
ifname_ = ifname;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
initNL80211();
|
||||||
label_.set_name("network");
|
label_.set_name("network");
|
||||||
// Trigger first values
|
// Trigger first values
|
||||||
getInfo();
|
getInfo();
|
||||||
|
@ -76,6 +77,7 @@ waybar::modules::Network::Network(const Json::Value& config)
|
||||||
waybar::modules::Network::~Network()
|
waybar::modules::Network::~Network()
|
||||||
{
|
{
|
||||||
close(sock_fd_);
|
close(sock_fd_);
|
||||||
|
nl_socket_free(sk_);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto waybar::modules::Network::update() -> void
|
auto waybar::modules::Network::update() -> void
|
||||||
|
@ -112,6 +114,24 @@ void waybar::modules::Network::disconnected()
|
||||||
ifid_ = -1;
|
ifid_ = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void waybar::modules::Network::initNL80211()
|
||||||
|
{
|
||||||
|
sk_ = nl_socket_alloc();
|
||||||
|
if (genl_connect(sk_) != 0) {
|
||||||
|
nl_socket_free(sk_);
|
||||||
|
throw std::runtime_error("Can't connect to netlink socket");
|
||||||
|
}
|
||||||
|
if (nl_socket_modify_cb(sk_, NL_CB_VALID, NL_CB_CUSTOM, scanCb, this) < 0) {
|
||||||
|
nl_socket_free(sk_);
|
||||||
|
throw std::runtime_error("Can't connect to netlink socket");
|
||||||
|
}
|
||||||
|
nl80211_id_ = genl_ctrl_resolve(sk_, "nl80211");
|
||||||
|
if (nl80211_id_ < 0) {
|
||||||
|
nl_socket_free(sk_);
|
||||||
|
throw std::runtime_error("Can't resolve nl80211 interface");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Based on https://gist.github.com/Yawning/c70d804d4b8ae78cc698
|
// Based on https://gist.github.com/Yawning/c70d804d4b8ae78cc698
|
||||||
int waybar::modules::Network::getExternalInterface()
|
int waybar::modules::Network::getExternalInterface()
|
||||||
{
|
{
|
||||||
|
@ -328,7 +348,7 @@ void waybar::modules::Network::parseSignal(struct nlattr **bss) {
|
||||||
signal_strength_ = ((signal_strength_dbm_ - hardwareMin)
|
signal_strength_ = ((signal_strength_dbm_ - hardwareMin)
|
||||||
/ double{hardwareMax - hardwareMin}) * 100;
|
/ double{hardwareMax - hardwareMin}) * 100;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool waybar::modules::Network::associatedOrJoined(struct nlattr** bss)
|
bool waybar::modules::Network::associatedOrJoined(struct nlattr** bss)
|
||||||
{
|
{
|
||||||
|
@ -344,35 +364,20 @@ bool waybar::modules::Network::associatedOrJoined(struct nlattr** bss)
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto waybar::modules::Network::getInfo() -> void
|
auto waybar::modules::Network::getInfo() -> void
|
||||||
{
|
{
|
||||||
struct nl_sock *sk = nl_socket_alloc();
|
struct nl_msg* nl_msg = nlmsg_alloc();
|
||||||
if (genl_connect(sk) != 0) {
|
if (nl_msg == nullptr) {
|
||||||
nl_socket_free(sk);
|
nl_socket_free(sk_);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (nl_socket_modify_cb(sk, NL_CB_VALID, NL_CB_CUSTOM, scanCb, this) < 0) {
|
if (genlmsg_put(nl_msg, NL_AUTO_PORT, NL_AUTO_SEQ, nl80211_id_, 0, NLM_F_DUMP,
|
||||||
nl_socket_free(sk);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const int nl80211_id = genl_ctrl_resolve(sk, "nl80211");
|
|
||||||
if (nl80211_id < 0) {
|
|
||||||
nl_socket_free(sk);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
struct nl_msg *msg = nlmsg_alloc();
|
|
||||||
if (msg == nullptr) {
|
|
||||||
nl_socket_free(sk);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (genlmsg_put(msg, NL_AUTO_PORT, NL_AUTO_SEQ, nl80211_id, 0, NLM_F_DUMP,
|
|
||||||
NL80211_CMD_GET_SCAN, 0) == nullptr
|
NL80211_CMD_GET_SCAN, 0) == nullptr
|
||||||
|| nla_put_u32(msg, NL80211_ATTR_IFINDEX, ifid_) < 0) {
|
|| nla_put_u32(nl_msg, NL80211_ATTR_IFINDEX, ifid_) < 0) {
|
||||||
nlmsg_free(msg);
|
nlmsg_free(nl_msg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
nl_send_sync(sk, msg);
|
nl_send_sync(sk_, nl_msg);
|
||||||
nl_socket_free(sk);
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue