]> git.sur5r.net Git - i3/i3status/blob - src/print_wireless_info.c
Treat the interface as 'down' when it cannot be found in /proc/net/wireless (Thanks...
[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 = 0;
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         if ((quality == UCHAR_MAX) || (quality == 0)) {
61                 walk = format_down;
62                 printf("%s", color("#FF0000"));
63         } else {
64                 printf("%s", color("#00FF00"));
65                 walk = format_up;
66         }
67
68         for (; *walk != '\0'; walk++) {
69                 if (*walk != '%') {
70                         putchar(*walk);
71                         continue;
72                 }
73
74                 if (BEGINS_WITH(walk+1, "quality")) {
75                         (void)printf("%03d%%", quality);
76                         walk += strlen("quality");
77                 }
78
79                 if (BEGINS_WITH(walk+1, "essid")) {
80                         (void)printf("%s", get_wireless_essid(interface));
81                         walk += strlen("essid");
82                 }
83
84                 if (BEGINS_WITH(walk+1, "ip")) {
85                         const char *ip_address = get_ip_addr(interface);
86                         if (ip_address != NULL)
87                                 (void)printf("%s", get_ip_addr(interface));
88                         else (void)printf("no IP");
89                         walk += strlen("ip");
90                 }
91         }
92
93         (void)printf("%s", endcolor());
94 }