summaryrefslogtreecommitdiff
path: root/slstatus.c
diff options
context:
space:
mode:
authorJody Leonard <me@jodyleonard.com>2016-10-14 05:44:46 -0400
committerJody Leonard <me@jodyleonard.com>2016-10-15 05:48:46 -0400
commitc60af317f3cb49381258c2480636a7b390b9ff3b (patch)
treedf8e42be9f11e0fe0f5ceee328f75814901d61d4 /slstatus.c
parent59ed3b6d8d594e00d72ecd3beadb512f797146ee (diff)
Add functions for measuring swap
Diffstat (limited to 'slstatus.c')
-rw-r--r--slstatus.c128
1 files changed, 128 insertions, 0 deletions
diff --git a/slstatus.c b/slstatus.c
index efdc9b0..f39a2dc 100644
--- a/slstatus.c
+++ b/slstatus.c
@@ -57,6 +57,10 @@ static char *ram_perc(void);
static char *ram_used(void);
static char *ram_total(void);
static char *run_command(const char *cmd);
+static char *swap_free(void);
+static char *swap_perc(void);
+static char *swap_used(void);
+static char *swap_total(void);
static char *temp(const char *file);
static char *uid(void);
static char *uptime(void);
@@ -418,6 +422,130 @@ run_command(const char *cmd)
}
static char *
+swap_free(void)
+{
+ long free;
+ FILE *fp;
+ char buf[2048];
+ size_t bytes_read;
+ char *match;
+
+ fp = fopen("/proc/meminfo", "r");
+ if (fp == NULL) {
+ warn("Failed to open file /proc/meminfo");
+ return smprintf(UNKNOWN_STR);
+ }
+ bytes_read = fread(buf, sizeof(char), sizeof(buf), fp);
+ buf[bytes_read] = '\0';
+ fclose(fp);
+ if (bytes_read == 0 || bytes_read == sizeof(buf)) {
+ warn("Failed to read /proc/meminfo\n");
+ return smprintf(UNKNOWN_STR);
+ }
+
+ match = strstr(buf, "SwapFree");
+ sscanf(match, "SwapFree: %ld kB\n", &free);
+
+ return smprintf("%f", (float)free / 1024 / 1024);
+}
+
+static char *
+swap_perc(void)
+{
+ long total, free, cached;
+ FILE *fp;
+ char buf[2048];
+ size_t bytes_read;
+ char *match;
+
+ fp = fopen("/proc/meminfo", "r");
+ if (fp == NULL) {
+ warn("Failed to open file /proc/meminfo");
+ return smprintf(UNKNOWN_STR);
+ }
+ bytes_read = fread(buf, sizeof(char), sizeof(buf), fp);
+ buf[bytes_read] = '\0';
+ fclose(fp);
+ if (bytes_read == 0 || bytes_read == sizeof(buf)) {
+ warn("Failed to read /proc/meminfo\n");
+ return smprintf(UNKNOWN_STR);
+ }
+
+ match = strstr(buf, "SwapCached");
+ sscanf(match, "SwapCached: %ld kB\n", &cached);
+
+ match = strstr(buf, "SwapTotal");
+ sscanf(match, "SwapTotal: %ld kB\n", &total);
+
+ match = strstr(buf, "SwapFree");
+ sscanf(match, "SwapFree: %ld kB\n", &free);
+
+ return smprintf("%d%%", 100 * (total - free - cached) / total);
+}
+
+static char *
+swap_total(void)
+{
+ long total;
+ FILE *fp;
+ char buf[2048];
+ size_t bytes_read;
+ char *match;
+
+ fp = fopen("/proc/meminfo", "r");
+ if (fp == NULL) {
+ warn("Failed to open file /proc/meminfo");
+ return smprintf(UNKNOWN_STR);
+ }
+ bytes_read = fread(buf, sizeof(char), sizeof(buf), fp);
+ buf[bytes_read] = '\0';
+ fclose(fp);
+ if (bytes_read == 0 || bytes_read == sizeof(buf)) {
+ warn("Failed to read /proc/meminfo\n");
+ return smprintf(UNKNOWN_STR);
+ }
+
+ match = strstr(buf, "SwapTotal");
+ sscanf(match, "SwapTotal: %ld kB\n", &total);
+
+ return smprintf("%f", (float)total / 1024 / 1024);
+}
+
+static char *
+swap_used(void)
+{
+ long total, free, cached;
+ FILE *fp;
+ char buf[2048];
+ size_t bytes_read;
+ char *match;
+
+ fp = fopen("/proc/meminfo", "r");
+ if (fp == NULL) {
+ warn("Failed to open file /proc/meminfo");
+ return smprintf(UNKNOWN_STR);
+ }
+ bytes_read = fread(buf, sizeof(char), sizeof(buf), fp);
+ buf[bytes_read] = '\0';
+ fclose(fp);
+ if (bytes_read == 0 || bytes_read == sizeof(buf)) {
+ warn("Failed to read /proc/meminfo\n");
+ return smprintf(UNKNOWN_STR);
+ }
+
+ match = strstr(buf, "SwapCached");
+ sscanf(match, "SwapCached: %ld kB\n", &cached);
+
+ match = strstr(buf, "SwapTotal");
+ sscanf(match, "SwapTotal: %ld kB\n", &total);
+
+ match = strstr(buf, "SwapFree");
+ sscanf(match, "SwapFree: %ld kB\n", &free);
+
+ return smprintf("%f", (float)(total - free - cached) / 1024 / 1024);
+}
+
+static char *
temp(const char *file)
{
int temp;