From bb50e22fd3ad82381dbf750a790b8380a1a1bba5 Mon Sep 17 00:00:00 2001
From: Michael Stapelberg <michael@stapelberg.de>
Date: Wed, 22 Jul 2009 00:09:32 +0200
Subject: Use getloadavg() instead of using /proc, patch by Baptiste Daroussin

---
 src/get_load.c | 24 ++++++++++--------------
 1 file changed, 10 insertions(+), 14 deletions(-)

(limited to 'src')

diff --git a/src/get_load.c b/src/get_load.c
index 4f82813..4f04b94 100644
--- a/src/get_load.c
+++ b/src/get_load.c
@@ -1,25 +1,21 @@
 // vim:ts=8:expandtab
 #include "i3status.h"
+#include <err.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
 
 const char *get_load() {
         static char part[512];
 
 /* Get load */
-#ifdef LINUX
-        slurp("/proc/loadavg", part, sizeof(part));
-        *skip_character(part, ' ', 3) = '\0';
+#if defined(__FreeBSD__) || defined(linux) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) || defined(sun)
+        double loadavg[3];
+        if (getloadavg(loadavg, 3) == -1)
+                errx(-1, "getloadavg() failed\n");
+        (void)snprintf(part, sizeof(part), "%1.2f %1.2f %1.2f", loadavg[0], loadavg[1], loadavg[2]);
 #else
-        /* TODO: correctly check for NetBSD, check if it works the same on *BSD */
-        struct loadavg load;
-        size_t length = sizeof(struct loadavg);
-        int mib[2] = { CTL_VM, VM_LOADAVG };
-        if (sysctl(mib, 2, &load, &length, NULL, 0) < 0)
-                die("Could not sysctl({ CTL_VM, VM_LOADAVG })\n");
-        double scale = load.fscale;
-        (void)snprintf(part, sizeof(part), "%.02f %.02f %.02f",
-                        (double)load.ldavg[0] / scale,
-                        (double)load.ldavg[1] / scale,
-                        (double)load.ldavg[2] / scale);
+        part[0] = '\0';
 #endif
 
         return part;
-- 
cgit v1.2.3