SET_MSG_RESULT(result, zbx_strdup(NULL, "This item is available only in daemon mode when collectors are"
#include "../common/stats.h"
#include "../common/diskdevices.h"
#define ZBX_DEV_PFX "/dev/"
static struct statinfo *si = NULL;
int zbx_get_diskstat(const char *devname, zbx_uint64_t *dstat)
struct devstat *ds = NULL;
char dev[DEVSTAT_NAME_LEN + 10];
for (int i = 0; i < ZBX_DSTAT_MAX; i++)
dstat[i] = (zbx_uint64_t)__UINT64_C(0);
si = (struct statinfo *)zbx_malloc(si, sizeof(struct statinfo));
si->dinfo = (struct devinfo *)zbx_malloc(NULL, sizeof(struct devinfo));
memset(si->dinfo, 0, sizeof(struct devinfo));
if ('\0' != *devname && 0 == strncmp(pd, ZBX_DEV_PFX, ZBX_CONST_STRLEN(ZBX_DEV_PFX)))
pd += ZBX_CONST_STRLEN(ZBX_DEV_PFX);
#if DEVSTAT_USER_API_VER >= 5
if (-1 == devstat_getdevs(NULL, si))
for (int i = 0; i < si->dinfo->numdevs; i++)
ds = &si->dinfo->devices[i];
zbx_snprintf(dev, sizeof(dev), "%s%d", ds->device_name, ds->unit_number);
if (0 != strcmp(dev, pd))
#if DEVSTAT_USER_API_VER >= 5
dstat[ZBX_DSTAT_R_OPER] += (zbx_uint64_t)ds->operations[DEVSTAT_READ];
dstat[ZBX_DSTAT_W_OPER] += (zbx_uint64_t)ds->operations[DEVSTAT_WRITE];
dstat[ZBX_DSTAT_R_BYTE] += (zbx_uint64_t)ds->bytes[DEVSTAT_READ];
dstat[ZBX_DSTAT_W_BYTE] += (zbx_uint64_t)ds->bytes[DEVSTAT_WRITE];
dstat[ZBX_DSTAT_R_OPER] += (zbx_uint64_t)ds->num_reads;
dstat[ZBX_DSTAT_W_OPER] += (zbx_uint64_t)ds->num_writes;
dstat[ZBX_DSTAT_R_BYTE] += (zbx_uint64_t)ds->bytes_read;
dstat[ZBX_DSTAT_W_BYTE] += (zbx_uint64_t)ds->bytes_written;