diff --git a/CMakeLists.txt b/CMakeLists.txt index b678c9cad..29338ec9d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -691,7 +691,7 @@ elseif(NetBSD) src/detection/dns/dns_linux.c src/detection/physicaldisk/physicaldisk_nosupport.c src/detection/physicalmemory/physicalmemory_nosupport.c - src/detection/diskio/diskio_nosupport.c + src/detection/diskio/diskio_nbsd.c src/detection/displayserver/linux/displayserver_linux.c src/detection/displayserver/linux/drm.c src/detection/displayserver/linux/wayland/wayland.c diff --git a/src/detection/diskio/diskio_nbsd.c b/src/detection/diskio/diskio_nbsd.c new file mode 100644 index 000000000..8d537045a --- /dev/null +++ b/src/detection/diskio/diskio_nbsd.c @@ -0,0 +1,38 @@ +#include "diskio.h" +#include "util/stringUtils.h" +#include "util/mallocHelper.h" + +#include +#include + +const char* ffDiskIOGetIoCounters(FFlist* result, FFDiskIOOptions* options) +{ + int mib[] = {CTL_HW, HW_IOSTATS, sizeof(struct io_sysctl)}; + size_t len; + if (sysctl(mib, ARRAY_SIZE(mib), NULL, &len, NULL, 0) < 0) + return "sysctl({HW_IOSTATS}, NULL) failed"; + uint32_t nDrive = (uint32_t) (len / sizeof(struct io_sysctl)); + + struct io_sysctl* stats = malloc(len); + + if (sysctl(mib, ARRAY_SIZE(mib), stats, &len, NULL, 0) < 0) + return "sysctl({HW_IOSTATS}, stats) failed"; + + for (uint32_t i = 0; i < nDrive; ++i) + { + struct io_sysctl* st = &stats[i]; + + if (options->namePrefix.length && strncmp(st->name, options->namePrefix.chars, options->namePrefix.length) != 0) + continue; + + FFDiskIOResult* device = (FFDiskIOResult*) ffListAdd(result); + ffStrbufInitF(&device->devPath, "/dev/%s", st->name); + ffStrbufInitS(&device->name, st->name); + device->bytesRead = st->rbytes; + device->readCount = st->rxfer; + device->bytesWritten = st->wbytes; + device->writeCount = st->wxfer; + } + + return NULL; +}