]> git.ipfire.org Git - pakfire.git/commitdiff
os: Add function to read loadavg
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 30 Oct 2023 11:08:17 +0000 (11:08 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 30 Oct 2023 11:08:17 +0000 (11:08 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/include/pakfire/os.h
src/libpakfire/os.c
tests/libpakfire/os.c

index 70e608bee639913c69dadc7989e74b804f41ea41..a8a28cac76e9f351ba01b4d331c171b1824761a1 100644 (file)
@@ -54,6 +54,16 @@ struct pakfire_cpustat {
 
 int pakfire_cpustat(struct pakfire_cpustat* cpustat);
 
+// Load Average
+
+struct pakfire_loadavg {
+       double load1;
+       double load5;
+       double load15;
+};
+
+int pakfire_loadavg(struct pakfire_loadavg* loadavg);
+
 // Meminfo
 
 struct pakfire_meminfo {
index bfb03a7dfe00d716d27145bbdb57d7d952ac61b5..7c19018b4898c2e1809d57f95e26c842602e1f0b 100644 (file)
@@ -191,6 +191,24 @@ int pakfire_cpustat(struct pakfire_cpustat* cpustat) {
        return pakfire_parse_file("/proc/stat", pakfire_parse_cpustat, cpustat);
 }
 
+// Load Average
+
+static int pakfire_parse_loadavg(char* line, size_t length, void* data) {
+       struct pakfire_loadavg* loadavg = data;
+       int r;
+
+       // Parse the first three values
+       r = sscanf(line, "%lf %lf %lf", &loadavg->load1, &loadavg->load5, &loadavg->load15);
+       if (r < 3)
+               return -EINVAL;
+
+       return 0;
+}
+
+int pakfire_loadavg(struct pakfire_loadavg* loadavg) {
+       return pakfire_parse_file("/proc/loadavg", pakfire_parse_loadavg, loadavg);
+}
+
 // Meminfo
 
 static int pakfire_parse_meminfo_value(uint64_t* mem, const char* s) {
index 9cc6a27da6ffaf9e2016ed3c4564e9a51c262640..2c1d90a6013f0703fd95154e5a8db53685f50cb2 100644 (file)
@@ -61,6 +61,22 @@ FAIL:
        return EXIT_FAILURE;
 }
 
+// This test parses /proc/loadavg
+static int test_loadavg(const struct test* t) {
+       struct pakfire_loadavg loadavg = {};
+
+       ASSERT_SUCCESS(pakfire_loadavg(&loadavg));
+
+       ASSERT(loadavg.load1  >= 0);
+       ASSERT(loadavg.load5  >= 0);
+       ASSERT(loadavg.load15 >= 0);
+
+       return EXIT_SUCCESS;
+
+FAIL:
+       return EXIT_FAILURE;
+}
+
 // This test parses /proc/meminfo
 static int test_meminfo(const struct test* t) {
        struct pakfire_meminfo meminfo = {};
@@ -89,6 +105,7 @@ FAIL:
 int main(int argc, const char* argv[]) {
        testsuite_add_test(test_cpuinfo);
        testsuite_add_test(test_cpustat);
+       testsuite_add_test(test_loadavg);
        testsuite_add_test(test_meminfo);
 
        return testsuite_run(argc, argv);