Xinqi Bao's Git
1 /* See LICENSE file for copyright and license details. */
6 #include <sys/socket.h>
11 #if defined(__linux__)
13 #include <linux/wireless.h>
16 wifi_perc(const char *interface
)
25 if (esnprintf(path
, sizeof(path
), "/sys/class/net/%s/operstate",
29 if (!(fp
= fopen(path
, "r"))) {
30 warn("fopen '%s':", path
);
33 p
= fgets(status
, 5, fp
);
35 if (!p
|| strcmp(status
, "up\n") != 0) {
39 if (!(fp
= fopen("/proc/net/wireless", "r"))) {
40 warn("fopen '/proc/net/wireless':");
44 for (i
= 0; i
< 3; i
++) {
45 if (!(p
= fgets(buf
, sizeof(buf
) - 1, fp
)))
53 if (!(datastart
= strstr(buf
, interface
))) {
57 datastart
= (datastart
+(strlen(interface
)+1));
58 sscanf(datastart
+ 1, " %*d %d %*d %*d\t\t %*d\t "
59 "%*d\t\t%*d\t\t %*d\t %*d\t\t %*d", &cur
);
61 /* 70 is the max of /proc/net/wireless */
62 return bprintf("%d", (int)((float)cur
/ 70 * 100));
66 wifi_essid(const char *interface
)
68 static char id
[IW_ESSID_MAX_SIZE
+1];
72 memset(&wreq
, 0, sizeof(struct iwreq
));
73 wreq
.u
.essid
.length
= IW_ESSID_MAX_SIZE
+1;
74 if (esnprintf(wreq
.ifr_name
, sizeof(wreq
.ifr_name
), "%s",
79 if ((sockfd
= socket(AF_INET
, SOCK_DGRAM
, 0)) < 0) {
80 warn("socket 'AF_INET':");
83 wreq
.u
.essid
.pointer
= id
;
84 if (ioctl(sockfd
,SIOCGIWESSID
, &wreq
) < 0) {
85 warn("ioctl 'SIOCGIWESSID':");
92 if (!strcmp(id
, "")) {
98 #elif defined(__OpenBSD__)
100 #include <net/if_media.h>
101 #include <net80211/ieee80211.h>
102 #include <sys/select.h> /* before <sys/ieee80211_ioctl.h> for NBBY */
103 #include <net80211/ieee80211_ioctl.h>
105 #include <sys/types.h>
108 load_ieee80211_nodereq(const char *interface
, struct ieee80211_nodereq
*nr
)
110 struct ieee80211_bssid bssid
;
112 uint8_t zero_bssid
[IEEE80211_ADDR_LEN
];
114 memset(&bssid
, 0, sizeof(bssid
));
115 memset(nr
, 0, sizeof(struct ieee80211_nodereq
));
116 if ((sockfd
= socket(AF_INET
, SOCK_DGRAM
, 0)) < 0) {
117 warn("socket 'AF_INET':");
120 strlcpy(bssid
.i_name
, interface
, sizeof(bssid
.i_name
));
121 if ((ioctl(sockfd
, SIOCG80211BSSID
, &bssid
)) < 0) {
122 warn("ioctl 'SIOCG80211BSSID':");
126 memset(&zero_bssid
, 0, sizeof(zero_bssid
));
127 if (memcmp(bssid
.i_bssid
, zero_bssid
,
128 IEEE80211_ADDR_LEN
) == 0) {
132 strlcpy(nr
->nr_ifname
, interface
, sizeof(nr
->nr_ifname
));
133 memcpy(&nr
->nr_macaddr
, bssid
.i_bssid
, sizeof(nr
->nr_macaddr
));
134 if ((ioctl(sockfd
, SIOCG80211NODE
, nr
)) < 0 && nr
->nr_rssi
) {
135 warn("ioctl 'SIOCG80211NODE':");
140 return close(sockfd
), 1;
144 wifi_perc(const char *interface
)
146 struct ieee80211_nodereq nr
;
149 if (load_ieee80211_nodereq(interface
, &nr
)) {
150 if (nr
.nr_max_rssi
) {
151 q
= IEEE80211_NODEREQ_RSSI(&nr
);
153 q
= nr
.nr_rssi
>= -50 ? 100 :
154 (nr
.nr_rssi
<= -100 ? 0 :
155 (2 * (nr
.nr_rssi
+ 100)));
157 return bprintf("%d", q
);
164 wifi_essid(const char *interface
)
166 struct ieee80211_nodereq nr
;
168 if (load_ieee80211_nodereq(interface
, &nr
)) {
169 return bprintf("%s", nr
.nr_nwid
);