]> git.sur5r.net Git - i3/i3status/blob - src/print_wireless_info.c
Breaks configfiles! Major refactoring of i3status, see below
[i3/i3status] / src / print_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 static const char *get_wireless_essid(const char *interface) {
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 wcfg;
20         if (iw_get_basic_config(skfd, interface, &wcfg) >= 0)
21                 snprintf(part, sizeof(part), "%s", wcfg.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 void print_wireless_info(const char *interface, const char *format_up, const char *format_down) {
37         char buf[1024];
38         int quality = -1;
39         char *interfaces;
40         const char *walk;
41         memset(buf, 0, sizeof(buf));
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, interface))
51                         continue;
52                 if (sscanf(interfaces, "%*[^:]: 0000 %d", &quality) != 1)
53                         continue;
54                 break;
55         }
56
57         /* Interface could not be found */
58         if (quality == -1)
59                 return;
60
61         if ((quality == UCHAR_MAX) || (quality == 0)) {
62                 walk = format_down;
63                 printf("%s", color("#FF0000"));
64         } else {
65                 printf("%s", color("#00FF00"));
66                 walk = format_up;
67         }
68
69         for (; *walk != '\0'; walk++) {
70                 if (*walk != '%') {
71                         putchar(*walk);
72                         continue;
73                 }
74
75                 if (BEGINS_WITH(walk+1, "quality")) {
76                         (void)printf("%03d%%", quality);
77                         walk += strlen("quality");
78                 }
79
80                 if (BEGINS_WITH(walk+1, "essid")) {
81                         (void)printf("%s", get_wireless_essid(interface));
82                         walk += strlen("essid");
83                 }
84
85                 if (BEGINS_WITH(walk+1, "ip")) {
86                         (void)printf("%s", get_ip_addr(interface));
87                         walk += strlen("ip");
88                 }
89         }
90
91         (void)printf("%s", endcolor());
92 }