]> git.sur5r.net Git - i3/i3status/blob - src/get_wireless_info.c
Add debian changelog entry to keep updates from overwriting local versions
[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         (void)close(skfd);
24 #else
25         part[0] = '\0';
26 #endif
27         return part;
28 }
29
30 /*
31  * Just parses /proc/net/wireless looking for lines beginning with
32  * wlan_interface, extracting the quality of the link and adding the
33  * current IP address of wlan_interface.
34  *
35  */
36 const char *get_wireless_info() {
37         char buf[1024];
38         static char part[512];
39         char *interfaces;
40         memset(buf, 0, sizeof(buf));
41         memset(part, 0, sizeof(part));
42
43         if (!slurp("/proc/net/wireless", buf, sizeof(buf)))
44                 die("Could not open \"/proc/net/wireless\"\n");
45
46         interfaces = skip_character(buf, '\n', 1) + 1;
47         while ((interfaces = skip_character(interfaces, '\n', 1)+1) < buf+strlen(buf)) {
48                 while (isspace((int)*interfaces))
49                         interfaces++;
50                 if (!BEGINS_WITH(interfaces, wlan_interface))
51                         continue;
52                 int quality;
53                 if (sscanf(interfaces, "%*[^:]: 0000 %d", &quality) != 1)
54                         continue;
55                 if ((quality == UCHAR_MAX) || (quality == 0)) {
56                         (void)snprintf(part, sizeof(part), "%sW: down%s", color("#FF0000"), endcolor());
57                 } else (void)snprintf(part, sizeof(part), "%sW: (%03d%% at %s) %s%s",
58                                 color("#00FF00"), quality, get_wireless_essid(), get_ip_addr(wlan_interface), endcolor());
59                 return part;
60         }
61
62         return part;
63 }
64