diff options
Diffstat (limited to 'src/detection/swap/swap_bsd.c')
| -rw-r--r-- | src/detection/swap/swap_bsd.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/detection/swap/swap_bsd.c b/src/detection/swap/swap_bsd.c new file mode 100644 index 0000000..a54cd52 --- /dev/null +++ b/src/detection/swap/swap_bsd.c @@ -0,0 +1,78 @@ +#include "swap.h" +#include "common/sysctl.h" + +#include <vm/vm_param.h> +#include <sys/stat.h> +#include <sys/param.h> + +static void addSwapEntry(FFlist* result, struct xswdev* xsw, uint32_t pageSize) { + if (xsw->xsw_nblks == 0) { // DFBSD reports some /dev/wdog devices with nblks == 0 + return; + } + + FFSwapResult* swap = FF_LIST_ADD(FFSwapResult, *result); + if (xsw->xsw_dev == NODEV) { + ffStrbufInitStatic(&swap->name, "[NFS]"); + } else { + ffStrbufInitF(&swap->name, "/dev/%s", devname(xsw->xsw_dev, S_IFCHR)); + } + swap->bytesUsed = (uint64_t) xsw->xsw_used * pageSize; + swap->bytesTotal = (uint64_t) xsw->xsw_nblks * pageSize; +} + +#if __DragonFly__ + +const char* ffDetectSwap(FFlist* result) { + struct xswdev xsws[32]; + size_t size = sizeof(xsws); + if (sysctlbyname("vm.swap_info_array", xsws, &size, NULL, 0) < 0) { + return "sysctlbyname(\"vm.swap_info_array\") failed"; + } + + uint32_t pageSize = instance.state.platform.sysinfo.pageSize; + + size_t count = size / sizeof(struct xswdev); + if (count == 0) { + return NULL; + } + + if (xsws->xsw_version != XSWDEV_VERSION) { + return "xswdev version mismatch"; + } + + for (uint32_t i = 0; i < count; ++i) { + addSwapEntry(result, &xsws[i], pageSize); + } + + return NULL; +} + +#elif __FreeBSD__ + +const char* ffDetectSwap(FFlist* result) { + int mib[16]; + size_t mibsize = ARRAY_SIZE(mib); + if (sysctlnametomib("vm.swap_info", mib, &mibsize) < 0) { + return "sysctlnametomib(\"vm.swap_info\") failed"; + } + + uint32_t pageSize = instance.state.platform.sysinfo.pageSize; + + for (int n = 0;; ++n) { + mib[mibsize] = n; + struct xswdev xsw; + size_t size = sizeof(xsw); + if (sysctl(mib, (uint32_t) (mibsize + 1), &xsw, &size, NULL, 0) < 0) { + break; + } + if (xsw.xsw_version != XSWDEV_VERSION) { + return "xswdev version mismatch"; + } + + addSwapEntry(result, &xsw, pageSize); + } + + return NULL; +} + +#endif |