Add ram and swap components on FreeBSD
authorMichael Buch <michaelbuch12@gmail.com>
Sat, 16 Feb 2019 01:26:44 +0000 (01:26 +0000)
committerAaron Marcher <me@drkhsh.at>
Sat, 16 Feb 2019 15:58:34 +0000 (16:58 +0100)
components/ram.c
components/swap.c

index 48144e44438315e004dc699424e7ccd444a78eed..47e6fdac9b637e885a1fe1c3e7c9107d3f2b64d8 100644 (file)
 
                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
index 97428de4c4e05b8f155c27acc14572f332e2d580..2509db1260cdfb1e424bebd0908505acd21abac2 100644 (file)
 
                return fmt_human(used * 1024, 1024);
        }
+#elif defined(__FreeBSD__)
+       #include <stdlib.h>
+       #include <sys/types.h>
+       #include <fcntl.h>
+       #include <unistd.h>
+       #include <kvm.h>
+
+       static int getswapinfo(struct kvm_swap *swap_info, size_t size)
+       {
+               kvm_t *kd;
+
+               kd = kvm_openfiles(NULL, "/dev/null", NULL, 0, NULL);
+               if(kd == NULL) {
+                       warn("kvm_openfiles '/dev/null':");
+                       return 0;
+               }
+
+               if(kvm_getswapinfo(kd, swap_info, size, 0 /* Unused flags */) == -1) {
+                       warn("kvm_getswapinfo:");
+                       kvm_close(kd);
+                       return 0;
+               }
+
+               kvm_close(kd);
+               return 1;
+       }
+
+       const char *
+       swap_free(void)
+       {
+               struct kvm_swap swap_info[1];
+               long used, total;
+
+               if(!getswapinfo(swap_info, 1))
+                       return NULL;
+
+               total = swap_info[0].ksw_total;
+               used = swap_info[0].ksw_used;
+
+               return fmt_human((total - used) * getpagesize(), 1024);
+       }
+
+       const char *
+       swap_perc(void)
+       {
+               struct kvm_swap swap_info[1];
+               long used, total;
+
+               if(!getswapinfo(swap_info, 1))
+                       return NULL;
+
+               total = swap_info[0].ksw_total;
+               used = swap_info[0].ksw_used;
+
+               return bprintf("%d", used * 100 / total);
+       }
+
+       const char *
+       swap_total(void)
+       {
+               struct kvm_swap swap_info[1];
+               long total;
+
+               if(!getswapinfo(swap_info, 1))
+                       return NULL;
+
+               total = swap_info[0].ksw_total;
+
+               return fmt_human(total * getpagesize(), 1024);
+       }
+
+       const char *
+       swap_used(void)
+       {
+               struct kvm_swap swap_info[1];
+               long used;
+
+               if(!getswapinfo(swap_info, 1))
+                       return NULL;
+
+               used = swap_info[0].ksw_used;
+
+               return fmt_human(used * getpagesize(), 1024);
+       }
 #endif