summaryrefslogtreecommitdiff
path: root/src/print_wireless_info.c
diff options
context:
space:
mode:
authorFernando Tarlá Cardoso Lemos <fernandotcl@gmail.com>2010-06-20 15:05:33 -0300
committerMichael Stapelberg <michael@stapelberg.de>2010-06-24 23:57:36 +0200
commit29e9a99f065137481dcab887971dae7e4a8c3e21 (patch)
treea4c75f85288e98ef41149e31e79fd991437cfdd5 /src/print_wireless_info.c
parent93ea987f84c528c8405c3fe388b0f3f2b79d61b4 (diff)
Take into account the wireless quality maximum.
Diffstat (limited to 'src/print_wireless_info.c')
-rw-r--r--src/print_wireless_info.c63
1 files changed, 49 insertions, 14 deletions
diff --git a/src/print_wireless_info.c b/src/print_wireless_info.c
index 968ff66..e5d38fb 100644
--- a/src/print_wireless_info.c
+++ b/src/print_wireless_info.c
@@ -11,23 +11,50 @@
#include "i3status.h"
-static const char *get_wireless_essid(const char *interface) {
- static char part[512];
#ifdef LINUX
- int skfd;
- if ((skfd = iw_sockets_open()) < 0) {
- perror("socket");
- exit(-1);
+static int skfd = -1;
+
+static int open_skfd() {
+ if (skfd == -1) {
+ skfd = iw_sockets_open();
+ if (skfd < 0) {
+ perror("iw_sockets_open");
+ return 0;
}
- struct wireless_config wcfg;
+ }
+ return -1;
+}
+
+static void close_skfd() {
+ if (skfd != -1) {
+ close(skfd);
+ skfd = -1;
+ }
+}
+#endif
+
+const char *get_wireless_essid(const char *interface) {
+ static char part[512];
+ part[0] = '\0';
+#ifdef LINUX
+ if (open_skfd()) {
+ wireless_config wcfg;
if (iw_get_basic_config(skfd, interface, &wcfg) >= 0)
- snprintf(part, sizeof(part), "%s", wcfg.essid);
- else part[0] = '\0';
- (void)close(skfd);
-#else
- part[0] = '\0';
+ snprintf(part, sizeof(part), "%s", wcfg.essid);
+ }
#endif
- return part;
+ return part;
+}
+
+int get_wireless_quality_max(const char *interface) {
+#ifdef LINUX
+ if (open_skfd()) {
+ iwrange range;
+ if (iw_get_range_info(skfd, interface, &range) >= 0)
+ return range.max_qual.qual;
+ }
+#endif
+ return 0;
}
/*
@@ -72,7 +99,11 @@ void print_wireless_info(const char *interface, const char *format_up, const cha
}
if (BEGINS_WITH(walk+1, "quality")) {
- (void)printf("%03d%%", quality);
+ int max_qual = get_wireless_quality_max(interface);
+ if (max_qual && max_qual >= quality)
+ printf("%d/%d", quality, max_qual);
+ else
+ printf("%d", quality);
walk += strlen("quality");
}
@@ -90,5 +121,9 @@ void print_wireless_info(const char *interface, const char *format_up, const cha
}
}
+#ifdef LINUX
+ close_skfd();
+#endif
+
(void)printf("%s", endcolor());
}