diff options
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); } |