]> git.sur5r.net Git - i3/i3status/blob - src/print_wireless_info.c
wireless: fix formats
[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 #ifdef LINUX
15 static int skfd = -1;
16
17 static int open_skfd() {
18     if (skfd == -1) {
19         skfd = iw_sockets_open();
20         if (skfd < 0) {
21             perror("iw_sockets_open");
22             return 0;
23         }
24     }
25     return -1;
26 }
27
28 static void close_skfd() {
29     if (skfd != -1) {
30         close(skfd);
31         skfd = -1;
32     }
33 }
34 #endif
35
36 const char *get_wireless_essid(const char *interface) {
37     static char part[512];
38     part[0] = '\0';
39 #ifdef LINUX
40     if (open_skfd()) {
41         wireless_config wcfg;
42         if (iw_get_basic_config(skfd, interface, &wcfg) >= 0)
43             snprintf(part, sizeof(part), "%s", wcfg.essid);
44     }
45 #endif
46     return part;
47 }
48
49 int get_wireless_quality_max(const char *interface) {
50 #ifdef LINUX
51     if (open_skfd()) {
52         iwrange range;
53         if (iw_get_range_info(skfd, interface, &range) >= 0)
54             return range.max_qual.qual;
55     }
56 #endif
57     return 0;
58 }
59
60 /*
61  * Just parses /proc/net/wireless looking for lines beginning with
62  * wlan_interface, extracting the quality of the link and adding the
63  * current IP address of wlan_interface.
64  *
65  */
66 void print_wireless_info(const char *interface, const char *format_up, const char *format_down) {
67         char buf[1024];
68         int quality = 0;
69         char *interfaces;
70         const char *walk;
71         memset(buf, 0, sizeof(buf));
72
73         if (!slurp("/proc/net/wireless", buf, sizeof(buf)))
74                 die("Could not open \"/proc/net/wireless\"\n");
75
76         interfaces = skip_character(buf, '\n', 1) + 1;
77         while ((interfaces = skip_character(interfaces, '\n', 1)+1) < buf+strlen(buf)) {
78                 while (isspace((int)*interfaces))
79                         interfaces++;
80                 if (!BEGINS_WITH(interfaces, interface))
81                         continue;
82                 if (sscanf(interfaces, "%*[^:]: 0000 %d", &quality) != 1)
83                         continue;
84                 break;
85         }
86
87         if ((quality == UCHAR_MAX) || (quality == 0)) {
88                 walk = format_down;
89                 printf("%s", color("#FF0000"));
90         } else {
91                 printf("%s", color("#00FF00"));
92                 walk = format_up;
93         }
94
95         for (; *walk != '\0'; walk++) {
96                 if (*walk != '%') {
97                         putchar(*walk);
98                         continue;
99                 }
100
101                 if (BEGINS_WITH(walk+1, "quality")) {
102                         int max_qual = get_wireless_quality_max(interface);
103                         if (max_qual && max_qual >= quality)
104                                 printf("%03d%%", (int)(quality * (100.0 / max_qual)));
105                         else
106                                 printf("%d dBm", quality);
107                         walk += strlen("quality");
108                 }
109
110                 if (BEGINS_WITH(walk+1, "essid")) {
111                         (void)printf("%s", get_wireless_essid(interface));
112                         walk += strlen("essid");
113                 }
114
115                 if (BEGINS_WITH(walk+1, "ip")) {
116                         const char *ip_address = get_ip_addr(interface);
117                         if (ip_address != NULL)
118                                 (void)printf("%s", get_ip_addr(interface));
119                         else (void)printf("no IP");
120                         walk += strlen("ip");
121                 }
122         }
123
124 #ifdef LINUX
125         close_skfd();
126 #endif
127
128         (void)printf("%s", endcolor());
129 }