]> git.sur5r.net Git - i3/i3status/blob - src/get_wireless_info.c
Implement getting the wireless ESSID
[i3/i3status] / src / get_wireless_info.c
1 // vim:ts=8:expandtab
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <ctype.h>
6 #include <limits.h>
7 #include <iwlib.h>
8
9 #include "i3status.h"
10
11 const char *get_wireless_essid() {
12         static char part[512];
13 #ifdef LINUX
14         int skfd;
15         if ((skfd = iw_sockets_open()) < 0) {
16                 perror("socket");
17                 exit(-1);
18         }
19         struct wireless_config cfg;
20         if (iw_get_basic_config(skfd, wlan_interface, &cfg) >= 0)
21                 snprintf(part, sizeof(part), "%s", cfg.essid);
22         else part[0] = '\0';
23 #else
24         part[0] = '\0';
25 #endif
26         return part;
27 }
28
29 /*
30  * Just parses /proc/net/wireless looking for lines beginning with
31  * wlan_interface, extracting the quality of the link and adding the
32  * current IP address of wlan_interface.
33  *
34  */
35 const char *get_wireless_info() {
36         char buf[1024];
37         static char part[512];
38         char *interfaces;
39         memset(buf, 0, sizeof(buf));
40         memset(part, 0, sizeof(part));
41
42         if (!slurp("/proc/net/wireless", buf, sizeof(buf)))
43                 die("Could not open \"/proc/net/wireless\"\n");
44
45         interfaces = skip_character(buf, '\n', 1) + 1;
46         while ((interfaces = skip_character(interfaces, '\n', 1)+1) < buf+strlen(buf)) {
47                 while (isspace((int)*interfaces))
48                         interfaces++;
49                 if (!BEGINS_WITH(interfaces, wlan_interface))
50                         continue;
51                 int quality;
52                 if (sscanf(interfaces, "%*[^:]: 0000 %d", &quality) != 1)
53                         continue;
54                 if ((quality == UCHAR_MAX) || (quality == 0)) {
55                         (void)snprintf(part, sizeof(part), "%sW: down%s", color("#FF0000"), endcolor());
56                 } else (void)snprintf(part, sizeof(part), "%sW: (%03d%% at %s) %s%s",
57                                 color("#00FF00"), quality, get_wireless_essid(), get_ip_addr(wlan_interface), endcolor());
58                 return part;
59         }
60
61         return part;
62 }
63