Xinqi Bao's Git
1 /* See LICENSE file for copyright and license details. */
6 #include <sys/socket.h>
12 #if defined(__linux__)
14 #include <linux/wireless.h>
17 wifi_perc(const char *iface
)
20 int total
= 70; /* the max of /proc/net/wireless */
26 snprintf(path
, sizeof(path
), "%s%s%s", "/sys/class/net/", iface
,
28 if (!(fp
= fopen(path
, "r"))) {
29 fprintf(stderr
, "fopen '%s': %s\n", path
,
33 p
= fgets(status
, 5, fp
);
35 if(!p
|| strcmp(status
, "up\n") != 0) {
39 if (!(fp
= fopen("/proc/net/wireless", "r"))) {
40 fprintf(stderr
, "fopen '/proc/net/wireless': %s\n",
45 for (i
= 0; i
< 3; i
++) {
46 if (!(p
= fgets(buf
, sizeof(buf
) - 1, fp
)))
54 if (!(datastart
= strstr(buf
, iface
))) {
58 datastart
= (datastart
+(strlen(iface
)+1));
59 sscanf(datastart
+ 1, " %*d %d %*d %*d\t\t %*d\t "
60 "%*d\t\t%*d\t\t %*d\t %*d\t\t %*d", &cur
);
62 return bprintf("%d", (int)((float)cur
/ total
* 100));
66 wifi_essid(const char *iface
)
68 static char id
[IW_ESSID_MAX_SIZE
+1];
69 int sockfd
= socket(AF_INET
, SOCK_DGRAM
, 0);
72 memset(&wreq
, 0, sizeof(struct iwreq
));
73 wreq
.u
.essid
.length
= IW_ESSID_MAX_SIZE
+1;
74 snprintf(wreq
.ifr_name
, sizeof(wreq
.ifr_name
), "%s", iface
);
77 fprintf(stderr
, "socket 'AF_INET': %s\n",
81 wreq
.u
.essid
.pointer
= id
;
82 if (ioctl(sockfd
,SIOCGIWESSID
, &wreq
) < 0) {
83 fprintf(stderr
, "ioctl 'SIOCGIWESSID': %s\n", strerror(errno
));
90 if (!strcmp(id
, "")) {
96 #elif defined(__OpenBSD__)
98 #include <net/if_media.h>
99 #include <net80211/ieee80211.h>
100 #include <net80211/ieee80211_ioctl.h>
102 #include <sys/types.h>
105 load_ieee80211_nodereq(const char *iface
, struct ieee80211_nodereq
*nr
)
107 struct ieee80211_bssid bssid
;
109 memset(&bssid
, 0, sizeof(bssid
);
110 memset(nr
, 0, sizeof(struct ieee80211_nodereq
));
111 if ((sockfd
= socket(AF_INET
, SOCK_DGRAM
, 0)) == -1) {
112 fprintf(stderr
, "socket 'AF_INET': %s\n",
116 strlcpy(bssid
.i_name
, iface
, sizeof(bssid
.i_name
));
117 if ((ioctl(sockfd
, SIOCG80211BSSID
, &bssid
)) == -1) {
118 fprintf(stderr
, "ioctl 'SIOCG80211BSSID': %s\n",
123 strlcpy(nr
->nr_ifname
, iface
, sizeof(nr
->nr_ifname
));
124 memmove(&nr
->nr_macaddr
, bssid
.i_bssid
, sizeof(nr
->nr_macaddr
));
125 if ((ioctl(sockfd
, SIOCG80211NODE
, nr
)) == -1 && nr
->nr_rssi
) {
126 fprintf(stderr
, "ioctl 'SIOCG80211NODE': %s\n",
131 return close(sockfd
), 1;
136 wifi_perc(const char *iface
)
138 struct ieee80211_nodereq nr
;
141 if (load_ieee80211_nodereq(iface
, &nr
)) {
143 q
= IEEE80211_NODEREQ_RSSI(&nr
);
145 q
= nr
.nr_rssi
>= -50 ? 100 : (nr
.nr_rssi
<= -100 ? 0 :
146 (2 * (nr
.nr_rssi
+ 100)));
147 return bprintf("%d", q
);
153 wifi_essid(const char *iface
)
155 struct ieee80211_nodereq nr
;
157 if (load_ieee80211_nodereq(iface
, &nr
)) {
158 return bprintf("%s", nr
.nr_nwid
);