diff options
-rw-r--r-- | x11/i3status/Makefile | 2 | ||||
-rw-r--r-- | x11/i3status/files/patch-print_wireless_info.c | 75 |
2 files changed, 76 insertions, 1 deletions
diff --git a/x11/i3status/Makefile b/x11/i3status/Makefile index 9ecb3a2e9919..e9062607a0fa 100644 --- a/x11/i3status/Makefile +++ b/x11/i3status/Makefile @@ -2,7 +2,7 @@ PORTNAME= i3status PORTVERSION= 2.8 -PORTREVISION= 3 +PORTREVISION= 4 CATEGORIES= x11 MASTER_SITES= http://i3wm.org/i3status/ diff --git a/x11/i3status/files/patch-print_wireless_info.c b/x11/i3status/files/patch-print_wireless_info.c new file mode 100644 index 000000000000..30aeaac82c58 --- /dev/null +++ b/x11/i3status/files/patch-print_wireless_info.c @@ -0,0 +1,75 @@ +--- src/print_wireless_info.c.orig 2014-01-05 03:34:06.000000000 -0800 ++++ src/print_wireless_info.c 2015-08-13 20:12:29.854380000 -0700 +@@ -193,10 +193,14 @@ static int get_wireless_info(const char + return 1; + #endif + #if defined(__FreeBSD__) || defined(__DragonFly__) +- int s, len, inwid; +- uint8_t buf[24 * 1024], *cp; ++ int s, inwid; ++ union { ++ struct ieee80211req_sta_req req; ++ uint8_t buf[24 * 1024]; ++ } u; + struct ieee80211req na; +- char network_id[IEEE80211_NWID_LEN + 1]; ++ char bssid[IEEE80211_ADDR_LEN]; ++ size_t len; + + if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1) + return (0); +@@ -224,31 +228,38 @@ static int get_wireless_info(const char + + memset(&na, 0, sizeof(na)); + strlcpy(na.i_name, interface, sizeof(na.i_name)); +- na.i_type = IEEE80211_IOC_SCAN_RESULTS; +- na.i_data = buf; +- na.i_len = sizeof(buf); ++ na.i_type = IEEE80211_IOC_BSSID; ++ na.i_data = bssid; ++ na.i_len = sizeof(bssid); ++ ++ if (ioctl(s, SIOCG80211, (caddr_t)&na) == -1) { ++ close(s); ++ return (0); ++ } ++ ++ memcpy(u.req.is_u.macaddr, bssid, sizeof(bssid)); ++ memset(&na, 0, sizeof(na)); ++ strlcpy(na.i_name, interface, sizeof(na.i_name)); ++ na.i_type = IEEE80211_IOC_STA_INFO; ++ na.i_data = &u; ++ na.i_len = sizeof(u); + + if (ioctl(s, SIOCG80211, (caddr_t)&na) == -1) { +- printf("fail\n"); + close(s); + return (0); + } + + close(s); +- len = na.i_len; +- cp = buf; +- struct ieee80211req_scan_result *sr; +- uint8_t *vp; +- sr = (struct ieee80211req_scan_result *)cp; +- vp = (u_int8_t *)(sr + 1); +- strlcpy(network_id, (const char *)vp, sr->isr_ssid_len + 1); +- if (!strcmp(network_id, &info->essid[0])) { +- info->signal_level = sr->isr_rssi; ++ if (na.i_len >= sizeof(u.req)) { ++ /* ++ * Just use the first BSSID returned even if there are ++ * multiple APs sharing the same BSSID. ++ */ ++ info->signal_level = u.req.info[0].isi_rssi / 2 + ++ u.req.info[0].isi_noise; + info->flags |= WIRELESS_INFO_FLAG_HAS_SIGNAL; +- info->noise_level = sr->isr_noise; ++ info->noise_level = u.req.info[0].isi_noise; + info->flags |= WIRELESS_INFO_FLAG_HAS_NOISE; +- info->quality = sr->isr_intval; +- info->flags |= WIRELESS_INFO_FLAG_HAS_QUALITY; + } + + return 1; |