diff --git a/CMakeLists.txt b/CMakeLists.txt index 2d502d4ce..aa5671e35 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -757,7 +757,7 @@ elseif(SunOS) src/detection/dns/dns_linux.c src/detection/physicaldisk/physicaldisk_nosupport.c src/detection/physicalmemory/physicalmemory_linux.c - src/detection/diskio/diskio_nosupport.c + src/detection/diskio/diskio_sunos.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_sunos.c b/src/detection/diskio/diskio_sunos.c new file mode 100644 index 000000000..3572e16a9 --- /dev/null +++ b/src/detection/diskio/diskio_sunos.c @@ -0,0 +1,39 @@ +#include "diskio.h" +#include "util/stringUtils.h" +#include + +static inline void kstatFreeWrap(kstat_ctl_t** pkc) +{ + assert(pkc); + if (*pkc) + kstat_close(*pkc); +} + +const char* ffDiskIOGetIoCounters(FFlist* result, FFDiskIOOptions* options) +{ + __attribute__((__cleanup__(kstatFreeWrap))) kstat_ctl_t* kc = kstat_open(); + if (!kc) + return "kstat_open() failed"; + + for (kstat_t* ks = kc->kc_chain; ks; ks = ks->ks_next) + { + if (ks->ks_type != KSTAT_TYPE_IO || !ffStrEquals(ks->ks_class, "disk")) continue; + + if (options->namePrefix.length && !ffStrStartsWith(ks->ks_name, options->namePrefix.chars)) + continue; + + kstat_io_t kio; + if (kstat_read(kc, ks, &kio) < 0) + continue; + + FFDiskIOResult* device = (FFDiskIOResult*) ffListAdd(result); + ffStrbufInitS(&device->devPath, ks->ks_name); + device->bytesRead = kio.nread; + device->readCount = kio.reads; + device->bytesWritten = kio.nwritten; + device->writeCount = kio.writes; + ffStrbufInitS(&device->name, ks->ks_name); + } + + return NULL; +}