aboutsummaryrefslogtreecommitdiff
path: root/modules/computer/loadavg.c
diff options
context:
space:
mode:
authorLeandro Pereira <leandro@hardinfo.org>2016-12-29 01:06:12 +0100
committerLeandro Pereira <leandro@hardinfo.org>2016-12-29 09:29:33 +0100
commit8eeef200c2ef081ecf58a8f356adc2d47090b2a3 (patch)
tree51e24b59f7ceb5fffbc629e32bc48806362a8e15 /modules/computer/loadavg.c
parent62925b3aaa6d79896e82cdeac77b58c09f75bf5f (diff)
Make load average work with locales that uses ',' for decimal separator
Diffstat (limited to 'modules/computer/loadavg.c')
-rw-r--r--modules/computer/loadavg.c47
1 files changed, 33 insertions, 14 deletions
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);
}