#include "common.h"
#include "sysinfo.h"
#include "stats.h"
#include "diskdevices.h"
#include "zbxjson.h"
#define ZBX_DEV_PFX "/dev/"
#define ZBX_DEV_READ 0
#define ZBX_DEV_WRITE 1
#define ZBX_SYS_BLKDEV_PFX "/sys/dev/block/"
#if defined(KERNEL_2_4)
# define INFO_FILE_NAME "/proc/partitions"
# define PARSE(line) if (sscanf(line, ZBX_FS_UI64 ZBX_FS_UI64 " %*d %s " \
ZBX_FS_UI64 " %*d " ZBX_FS_UI64 " %*d " \
ZBX_FS_UI64 " %*d " ZBX_FS_UI64 " %*d %*d %*d %*d", \
&rdev_major, \
&rdev_minor, \
name, \
&ds[ZBX_DSTAT_R_OPER], \
&ds[ZBX_DSTAT_R_SECT], \
&ds[ZBX_DSTAT_W_OPER], \
&ds[ZBX_DSTAT_W_SECT] \
) != 7) continue
#else
# define INFO_FILE_NAME "/proc/diskstats"
# define PARSE(line) if (sscanf(line, ZBX_FS_UI64 ZBX_FS_UI64 " %s " \
ZBX_FS_UI64 " %*d " ZBX_FS_UI64 " %*d " \
ZBX_FS_UI64 " %*d " ZBX_FS_UI64 " %*d %*d %*d %*d", \
&rdev_major, \
&rdev_minor, \
name, \
&ds[ZBX_DSTAT_R_OPER], \
&ds[ZBX_DSTAT_R_SECT], \
&ds[ZBX_DSTAT_W_OPER], \
&ds[ZBX_DSTAT_W_SECT] \
) != 7 \
&& \
\
sscanf(line, ZBX_FS_UI64 ZBX_FS_UI64 " %s " \
ZBX_FS_UI64 ZBX_FS_UI64 \
ZBX_FS_UI64 ZBX_FS_UI64, \
&rdev_major, \
&rdev_minor, \
name, \
&ds[ZBX_DSTAT_R_OPER], \
&ds[ZBX_DSTAT_R_SECT], \
&ds[ZBX_DSTAT_W_OPER], \
&ds[ZBX_DSTAT_W_SECT] \
) != 7 \
) continue
#endif
int get_diskstat(const char *devname, zbx_uint64_t *dstat)
{
FILE *f;
char tmp[MAX_STRING_LEN], name[MAX_STRING_LEN], dev_path[MAX_STRING_LEN];
int i, ret = FAIL, dev_exists = FAIL;
zbx_uint64_t ds[ZBX_DSTAT_MAX], rdev_major, rdev_minor;
zbx_stat_t dev_st;
int found = 0;
for (i = 0; i < ZBX_DSTAT_MAX; i++)
dstat[i] = (zbx_uint64_t)__UINT64_C(0);
if (NULL != devname && '\0' != *devname && 0 != strcmp(devname, "all"))
{
*dev_path = '\0';
if (0 != strncmp(devname, ZBX_DEV_PFX, ZBX_CONST_STRLEN(ZBX_DEV_PFX)))
strscpy(dev_path, ZBX_DEV_PFX);
strscat(dev_path, devname);