refactor wifi on linux
This commit is contained in:
@ -26,24 +26,16 @@
|
|||||||
static char resp[4096];
|
static char resp[4096];
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
findattr(int attr, char *p, char *e, size_t *len)
|
findattr(int attr, const char *p, const char *e, size_t *len)
|
||||||
{
|
{
|
||||||
|
while (p < e) {
|
||||||
struct nlattr nla;
|
struct nlattr nla;
|
||||||
size_t alen;
|
|
||||||
|
|
||||||
while ((size_t)(e-p) >= sizeof(nla)) {
|
|
||||||
memcpy(&nla, p, sizeof(nla));
|
memcpy(&nla, p, sizeof(nla));
|
||||||
if (nla.nla_len < NLA_HDRLEN)
|
|
||||||
return NULL;
|
|
||||||
if (nla.nla_type == attr) {
|
if (nla.nla_type == attr) {
|
||||||
p += NLA_HDRLEN;
|
*len = nla.nla_len - NLA_HDRLEN;
|
||||||
*len = nla.nla_len-NLA_HDRLEN;
|
return (char *)(p + NLA_HDRLEN);
|
||||||
return (size_t)(e-p)>=*len?p:NULL;
|
|
||||||
}
|
}
|
||||||
alen = NLA_ALIGN(nla.nla_len);
|
p += NLA_ALIGN(nla.nla_len);
|
||||||
if ((size_t)(e-p) < alen)
|
|
||||||
return NULL;
|
|
||||||
p += alen;
|
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -97,9 +89,10 @@
|
|||||||
}
|
}
|
||||||
if ((size_t)r <= sizeof(ctrl))
|
if ((size_t)r <= sizeof(ctrl))
|
||||||
return 0;
|
return 0;
|
||||||
p = findattr(CTRL_ATTR_FAMILY_ID, resp+sizeof(ctrl), resp+r, &len);
|
p = findattr(CTRL_ATTR_FAMILY_ID, resp + sizeof(ctrl), resp + r, &len);
|
||||||
if (p && len == 2)
|
if (p && len == 2)
|
||||||
memcpy(&id, p, 2);
|
memcpy(&id, p, 2);
|
||||||
|
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,11 +165,12 @@
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((size_t)r <= NLMSG_HDRLEN+GENL_HDRLEN)
|
if ((size_t)r <= NLMSG_HDRLEN + GENL_HDRLEN)
|
||||||
return NULL;
|
return NULL;
|
||||||
p = findattr(NL80211_ATTR_SSID, resp+NLMSG_HDRLEN+GENL_HDRLEN, resp+r, &len);
|
p = findattr(NL80211_ATTR_SSID, resp + NLMSG_HDRLEN + GENL_HDRLEN, resp + r, &len);
|
||||||
if (p)
|
if (p)
|
||||||
p[len] = 0;
|
p[len] = 0;
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -188,8 +182,9 @@
|
|||||||
uint16_t fam = nl80211fam();
|
uint16_t fam = nl80211fam();
|
||||||
ssize_t r;
|
ssize_t r;
|
||||||
size_t len;
|
size_t len;
|
||||||
char req[NLMSG_HDRLEN+GENL_HDRLEN+NLA_HDRLEN+NLA_ALIGN(4)] = {0}, *p = req, *e;
|
char req[NLMSG_HDRLEN + GENL_HDRLEN + NLA_HDRLEN + NLA_ALIGN(4)] = {0}, *p = req, *e;
|
||||||
int idx = ifindex(interface);
|
int idx = ifindex(interface);
|
||||||
|
|
||||||
if (idx < 0) {
|
if (idx < 0) {
|
||||||
fprintf(stderr, "interface %s not found\n", interface);
|
fprintf(stderr, "interface %s not found\n", interface);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -209,16 +204,17 @@
|
|||||||
}, sizeof(struct genlmsghdr));
|
}, sizeof(struct genlmsghdr));
|
||||||
p += GENL_HDRLEN;
|
p += GENL_HDRLEN;
|
||||||
memcpy(p, &(struct nlattr){
|
memcpy(p, &(struct nlattr){
|
||||||
.nla_len = NLA_HDRLEN+4,
|
.nla_len = NLA_HDRLEN + 4,
|
||||||
.nla_type = NL80211_ATTR_IFINDEX,
|
.nla_type = NL80211_ATTR_IFINDEX,
|
||||||
}, sizeof(struct nlattr));
|
}, sizeof(struct nlattr));
|
||||||
p += NLA_HDRLEN;
|
p += NLA_HDRLEN;
|
||||||
memcpy(p, &(uint32_t){idx}, 4);
|
memcpy(p, &idx, 4);
|
||||||
|
|
||||||
if (send(nlsock, req, sizeof(req), 0) != sizeof(req)) {
|
if (send(nlsock, req, sizeof(req), 0) != sizeof(req)) {
|
||||||
warn("send 'AF_NETLINK':");
|
warn("send 'AF_NETLINK':");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
*strength = 0;
|
*strength = 0;
|
||||||
while (1) {
|
while (1) {
|
||||||
r = recv(nlsock, resp, sizeof(resp), 0);
|
r = recv(nlsock, resp, sizeof(resp), 0);
|
||||||
@ -228,9 +224,11 @@
|
|||||||
}
|
}
|
||||||
if ((size_t)r < sizeof(hdr))
|
if ((size_t)r < sizeof(hdr))
|
||||||
return NULL;
|
return NULL;
|
||||||
for (p = resp; p != resp+r && (size_t)(resp+r-p) >= sizeof(hdr); p = e) {
|
|
||||||
|
for (p = resp; p != resp + r && (size_t)(resp + r-p) >= sizeof(hdr); p = e) {
|
||||||
memcpy(&hdr, p, sizeof(hdr));
|
memcpy(&hdr, p, sizeof(hdr));
|
||||||
e = resp+r-p<hdr.nlmsg_len?resp+r:p+hdr.nlmsg_len;
|
e = resp + r - p < hdr.nlmsg_len ? resp + r : p + hdr.nlmsg_len;
|
||||||
|
|
||||||
if (!*strength && hdr.nlmsg_len > NLMSG_HDRLEN+GENL_HDRLEN) {
|
if (!*strength && hdr.nlmsg_len > NLMSG_HDRLEN+GENL_HDRLEN) {
|
||||||
p += NLMSG_HDRLEN+GENL_HDRLEN;
|
p += NLMSG_HDRLEN+GENL_HDRLEN;
|
||||||
p = findattr(NL80211_ATTR_STA_INFO, p, e, &len);
|
p = findattr(NL80211_ATTR_STA_INFO, p, e, &len);
|
||||||
@ -240,7 +238,7 @@
|
|||||||
snprintf(strength, sizeof(strength), "%d", RSSI_TO_PERC(*p));
|
snprintf(strength, sizeof(strength), "%d", RSSI_TO_PERC(*p));
|
||||||
}
|
}
|
||||||
if (hdr.nlmsg_type == NLMSG_DONE)
|
if (hdr.nlmsg_type == NLMSG_DONE)
|
||||||
return *strength?strength:NULL;
|
return *strength ? strength : NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user