diff --git a/src/detection/swap/swap_bsd.c b/src/detection/swap/swap_bsd.c index d1f04adb4..c3e40b3df 100644 --- a/src/detection/swap/swap_bsd.c +++ b/src/detection/swap/swap_bsd.c @@ -3,6 +3,47 @@ #include #include +#include + +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 = ffListAdd(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) { @@ -12,7 +53,7 @@ const char* ffDetectSwap(FFlist* result) return "sysctlnametomib(\"vm.swap_info\") failed"; uint32_t pageSize = instance.state.platform.sysinfo.pageSize; - + for (int n = 0; ; ++n) { mib[mibsize] = n; @@ -22,12 +63,11 @@ const char* ffDetectSwap(FFlist* result) break; if (xsw.xsw_version != XSWDEV_VERSION) return "xswdev version mismatch"; - - FFSwapResult* swap = ffListAdd(result); - 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; + + addSwapEntry(result, &xsw, pageSize); } return NULL; } + +#endif