Xinqi Bao's Git

b0c81f930fbfae569be444d592035396b45783af
[slstatus.git] / wifi.c
1 #include <err.h>
2 #include <ifaddrs.h>
3 #include <linux/wireless.h>
4 #include <sys/socket.h>
5 #include <stdio.h>
6 #include <limits.h>
7 #include <string.h>
8 #include <sys/ioctl.h>
9 #include <unistd.h>
10
11 #include "util.h"
12
13 const char *
14 wifi_perc(const char *iface)
15 {
16 int i, perc;
17 char *p, *datastart;
18 char path[PATH_MAX];
19 char status[5];
20 FILE *fp;
21
22 snprintf(path, sizeof(path), "%s%s%s", "/sys/class/net/", iface, "/operstate");
23 fp = fopen(path, "r");
24 if (fp == NULL) {
25 warn("Failed to open file %s", path);
26 return NULL;
27 }
28 p = fgets(status, 5, fp);
29 fclose(fp);
30 if(!p || strcmp(status, "up\n") != 0) {
31 return NULL;
32 }
33
34 fp = fopen("/proc/net/wireless", "r");
35 if (fp == NULL) {
36 warn("Failed to open file /proc/net/wireless");
37 return NULL;
38 }
39
40 for (i = 0; i < 3; i++) {
41 if (!(p = fgets(buf, sizeof(buf) - 1, fp)))
42 break;
43 }
44 fclose(fp);
45 if (i < 2 || !p)
46 return NULL;
47
48 if ((datastart = strstr(buf, iface)) == NULL)
49 return NULL;
50
51 datastart = (datastart+(strlen(iface)+1));
52 sscanf(datastart + 1, " %*d %d %*d %*d %*d %*d %*d %*d %*d %*d", &perc);
53
54 return bprintf("%d", perc);
55 }
56
57 const char *
58 wifi_essid(const char *iface)
59 {
60 static char id[IW_ESSID_MAX_SIZE+1];
61 int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
62 struct iwreq wreq;
63
64 memset(&wreq, 0, sizeof(struct iwreq));
65 wreq.u.essid.length = IW_ESSID_MAX_SIZE+1;
66 snprintf(wreq.ifr_name, sizeof(wreq.ifr_name), "%s", iface);
67
68 if (sockfd == -1) {
69 warn("Failed to get ESSID for interface %s", iface);
70 return NULL;
71 }
72 wreq.u.essid.pointer = id;
73 if (ioctl(sockfd,SIOCGIWESSID, &wreq) == -1) {
74 warn("Failed to get ESSID for interface %s", iface);
75 return NULL;
76 }
77
78 close(sockfd);
79
80 if (strcmp(id, "") == 0)
81 return NULL;
82 else
83 return id;
84 }