]> git.sur5r.net Git - i3/i3status/blob - src/print_wireless_info.c
Fix FTBFS on kFreeBSD and Hurd: libiw is Linux-only
[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
8 #ifdef LINUX
9 #include <iwlib.h>
10 #endif
11
12 #include "i3status.h"
13
14 static const char *get_wireless_essid(const char *interface) {
15         static char part[512];
16 #ifdef LINUX
17         int skfd;
18         if ((skfd = iw_sockets_open()) < 0) {
19                 perror("socket");
20                 exit(-1);
21         }
22         struct wireless_config wcfg;
23         if (iw_get_basic_config(skfd, interface, &wcfg) >= 0)
24                 snprintf(part, sizeof(part), "%s", wcfg.essid);
25         else part[0] = '\0';
26         (void)close(skfd);
27 #else
28         part[0] = '\0';
29 #endif
30         return part;
31 }
32
33 /*
34  * Just parses /proc/net/wireless looking for lines beginning with
35  * wlan_interface, extracting the quality of the link and adding the
36  * current IP address of wlan_interface.
37  *
38  */
39 void print_wireless_info(const char *interface, const char *format_up, const char *format_down) {
40         char buf[1024];
41         int quality = -1;
42         char *interfaces;
43         const char *walk;
44         memset(buf, 0, sizeof(buf));
45
46         if (!slurp("/proc/net/wireless", buf, sizeof(buf)))
47                 die("Could not open \"/proc/net/wireless\"\n");
48
49         interfaces = skip_character(buf, '\n', 1) + 1;
50         while ((interfaces = skip_character(interfaces, '\n', 1)+1) < buf+strlen(buf)) {
51                 while (isspace((int)*interfaces))
52                         interfaces++;
53                 if (!BEGINS_WITH(interfaces, interface))
54                         continue;
55                 if (sscanf(interfaces, "%*[^:]: 0000 %d", &quality) != 1)
56                         continue;
57                 break;
58         }
59
60         /* Interface could not be found */
61         if (quality == -1)
62                 return;
63
64         if ((quality == UCHAR_MAX) || (quality == 0)) {
65                 walk = format_down;
66                 printf("%s", color("#FF0000"));
67         } else {
68                 printf("%s", color("#00FF00"));
69                 walk = format_up;
70         }
71
72         for (; *walk != '\0'; walk++) {
73                 if (*walk != '%') {
74                         putchar(*walk);
75                         continue;
76                 }
77
78                 if (BEGINS_WITH(walk+1, "quality")) {
79                         (void)printf("%03d%%", quality);
80                         walk += strlen("quality");
81                 }
82
83                 if (BEGINS_WITH(walk+1, "essid")) {
84                         (void)printf("%s", get_wireless_essid(interface));
85                         walk += strlen("essid");
86                 }
87
88                 if (BEGINS_WITH(walk+1, "ip")) {
89                         (void)printf("%s", get_ip_addr(interface));
90                         walk += strlen("ip");
91                 }
92         }
93
94         (void)printf("%s", endcolor());
95 }