]> git.sur5r.net Git - i3/i3status/blobdiff - src/get_wireless_info.c
Implement getting the wireless ESSID
[i3/i3status] / src / get_wireless_info.c
index fd0c60b67cd78774d5ca1ec7d61f7e8b17e1aa46..77bb995b9b945f627968d5599be72c016d21649c 100644 (file)
@@ -1,11 +1,31 @@
+// vim:ts=8:expandtab
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
 #include <limits.h>
+#include <iwlib.h>
 
 #include "i3status.h"
 
+const char *get_wireless_essid() {
+        static char part[512];
+#ifdef LINUX
+        int skfd;
+        if ((skfd = iw_sockets_open()) < 0) {
+                perror("socket");
+                exit(-1);
+        }
+        struct wireless_config cfg;
+        if (iw_get_basic_config(skfd, wlan_interface, &cfg) >= 0)
+                snprintf(part, sizeof(part), "%s", cfg.essid);
+        else part[0] = '\0';
+#else
+        part[0] = '\0';
+#endif
+        return part;
+}
+
 /*
  * Just parses /proc/net/wireless looking for lines beginning with
  * wlan_interface, extracting the quality of the link and adding the
@@ -19,7 +39,8 @@ const char *get_wireless_info() {
         memset(buf, 0, sizeof(buf));
         memset(part, 0, sizeof(part));
 
-       slurp("/proc/net/wireless", buf, sizeof(buf));
+        if (!slurp("/proc/net/wireless", buf, sizeof(buf)))
+                die("Could not open \"/proc/net/wireless\"\n");
 
         interfaces = skip_character(buf, '\n', 1) + 1;
         while ((interfaces = skip_character(interfaces, '\n', 1)+1) < buf+strlen(buf)) {
@@ -31,11 +52,9 @@ const char *get_wireless_info() {
                 if (sscanf(interfaces, "%*[^:]: 0000 %d", &quality) != 1)
                         continue;
                 if ((quality == UCHAR_MAX) || (quality == 0)) {
-                        if (use_colors)
-                                (void)snprintf(part, sizeof(part), "%sW: down", color("#FF0000"));
-                        else (void)snprintf(part, sizeof(part), "W: down");
-                } else (void)snprintf(part, sizeof(part), "%sW: (%03d%%) %s",
-                                color("#00FF00"), quality, get_ip_addr(wlan_interface));
+                        (void)snprintf(part, sizeof(part), "%sW: down%s", color("#FF0000"), endcolor());
+                } else (void)snprintf(part, sizeof(part), "%sW: (%03d%% at %s) %s%s",
+                                color("#00FF00"), quality, get_wireless_essid(), get_ip_addr(wlan_interface), endcolor());
                 return part;
         }