diff options
| author | Leandro Pereira <leandro@hardinfo.org> | 2016-12-29 01:06:12 +0100 | 
|---|---|---|
| committer | Leandro Pereira <leandro@hardinfo.org> | 2016-12-29 09:29:33 +0100 | 
| commit | 8eeef200c2ef081ecf58a8f356adc2d47090b2a3 (patch) | |
| tree | 51e24b59f7ceb5fffbc629e32bc48806362a8e15 /modules | |
| parent | 62925b3aaa6d79896e82cdeac77b58c09f75bf5f (diff) | |
Make load average work with locales that uses ',' for decimal separator
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/computer.c | 2 | ||||
| -rw-r--r-- | modules/computer/loadavg.c | 47 | 
2 files changed, 33 insertions, 16 deletions
| diff --git a/modules/computer.c b/modules/computer.c index a739b471..7167582f 100644 --- a/modules/computer.c +++ b/modules/computer.c @@ -98,7 +98,6 @@ gchar *hi_get_field(gchar * field)  {      gchar *tmp; -    setlocale(LC_ALL, "C"); //Load Average is not updated if locale is not C, switch locale to C      if (g_str_equal(field, "Memory")) {  	MemoryInfo *mi = computer_get_memory(); @@ -118,7 +117,6 @@ gchar *hi_get_field(gchar * field)      } else {  	tmp = g_strdup("");      } -    setlocale(LC_ALL, "");// switch locale back to normal      return tmp;  } diff --git a/modules/computer/loadavg.c b/modules/computer/loadavg.c index e970fd44..7311dbf0 100644 --- a/modules/computer/loadavg.c +++ b/modules/computer/loadavg.c @@ -16,34 +16,53 @@   *    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA   */ +#include <string.h> +  #include "hardinfo.h"  #include "computer.h" -LoadInfo * -computer_get_loadinfo(void) +static gboolean +computer_get_loadinfo(LoadInfo *li)  { -    LoadInfo *li = g_new0(LoadInfo, 1);      FILE *procloadavg; +    char buf[64]; +    int ret;      procloadavg = fopen("/proc/loadavg", "r"); -    (void)fscanf(procloadavg, "%f %f %f", &(li->load1), &(li->load5), -	   &(li->load15)); +    if (!procloadavg) +        return FALSE; + +    if (!fgets(buf, sizeof(buf), procloadavg)) { +        fclose(procloadavg); +        return FALSE; +    } + +    ret = sscanf(buf, "%f %f %f", &li->load1, &li->load5, &li->load15); +    if (ret != 3) { +        size_t len = strlen(buf); +        size_t i; + +        for (i = 0; i < len; i++) { +            if (buf[i] == '.') +                buf[i] = ','; +        } + +        ret = sscanf(buf, "%f %f %f", &li->load1, &li->load5, &li->load15); +    } +      fclose(procloadavg); -    return li; +    return ret == 3;  }  gchar *  computer_get_formatted_loadavg()  { -    LoadInfo *li; -    gchar *tmp; -    li = computer_get_loadinfo(); +    LoadInfo li; -    tmp = -	g_strdup_printf("%.2f, %.2f, %.2f", li->load1, li->load5, -			li->load15); +    if (!computer_get_loadinfo(&li)) +        return g_strdup(_("Couldn't obtain load average")); -    g_free(li); -    return tmp; +    return g_strdup_printf("%.2f, %.2f, %.2f", li.load1, li.load5, +        li.load15);  } | 
