diff options
| author | Fernando Tarlá Cardoso Lemos | 2010-06-20 15:05:33 -0300 | 
|---|---|---|
| committer | Michael Stapelberg | 2010-06-24 23:57:36 +0200 | 
| commit | 29e9a99f065137481dcab887971dae7e4a8c3e21 (patch) | |
| tree | a4c75f85288e98ef41149e31e79fd991437cfdd5 | |
| parent | ddate: Use static memory / only allocate format copy memory once (diff) | |
Take into account the wireless quality maximum.
| -rw-r--r-- | src/print_wireless_info.c | 63 | 
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());  } | 
