Xinqi Bao's Git

Use the sioctl_open(3) OpenBSD API to access vol
[slstatus.git] / components / ram.c
index 1d5b1da..47e6fda 100644 (file)
@@ -30,7 +30,8 @@
                if (pscanf("/proc/meminfo",
                           "MemTotal: %ju kB\n"
                           "MemFree: %ju kB\n"
-                          "MemAvailable: %ju kB\nBuffers: %ju kB\n"
+                          "MemAvailable: %ju kB\n"
+                          "Buffers: %ju kB\n"
                           "Cached: %ju kB\n",
                           &total, &free, &buffers, &buffers, &cached) != 5) {
                        return NULL;
@@ -65,7 +66,8 @@
                if (pscanf("/proc/meminfo",
                           "MemTotal: %ju kB\n"
                           "MemFree: %ju kB\n"
-                          "MemAvailable: %ju kB\nBuffers: %ju kB\n"
+                          "MemAvailable: %ju kB\n"
+                          "Buffers: %ju kB\n"
                           "Cached: %ju kB\n",
                           &total, &free, &buffers, &buffers, &cached) != 5) {
                        return NULL;
@@ -80,7 +82,7 @@
        #include <sys/types.h>
        #include <unistd.h>
 
-       #define LOG1024         10
+       #define LOG1024 10
        #define pagetok(size, pageshift) (size_t)(size << (pageshift - LOG1024))
 
        inline int
 
                return NULL;
        }
+#elif defined(__FreeBSD__)
+       #include <sys/sysctl.h>
+       #include <sys/vmmeter.h>
+       #include <unistd.h>
+       #include <vm/vm_param.h>
+
+       const char *
+       ram_free(void) {
+               struct vmtotal vm_stats;
+               int mib[] = {CTL_VM, VM_TOTAL};
+               size_t len;
+
+               len = sizeof(struct vmtotal);
+               if (sysctl(mib, 2, &vm_stats, &len, NULL, 0) == -1
+                               || !len)
+                       return NULL;
+
+               return fmt_human(vm_stats.t_free * getpagesize(), 1024);
+       }
+
+       const char *
+       ram_total(void) {
+               long npages;
+               size_t len;
+
+               len = sizeof(npages);
+               if (sysctlbyname("vm.stats.vm.v_page_count", &npages, &len, NULL, 0) == -1
+                               || !len)
+                       return NULL;
+
+               return fmt_human(npages * getpagesize(), 1024);
+       }
+
+       const char *
+       ram_perc(void) {
+               long npages;
+               long active;
+               size_t len;
+
+               len = sizeof(npages);
+               if (sysctlbyname("vm.stats.vm.v_page_count", &npages, &len, NULL, 0) == -1
+                               || !len)
+                       return NULL;
+
+               if (sysctlbyname("vm.stats.vm.v_active_count", &active, &len, NULL, 0) == -1
+                               || !len)
+                       return NULL;
+
+               return bprintf("%d", active * 100 / npages);
+       }
+
+       const char *
+       ram_used(void) {
+               long active;
+               size_t len;
+
+               len = sizeof(active);
+               if (sysctlbyname("vm.stats.vm.v_active_count", &active, &len, NULL, 0) == -1
+                               || !len)
+                       return NULL;
+
+               return fmt_human(active * getpagesize(), 1024);
+       }
 #endif