static int get_fs_size_stat(const char *fs, zbx_uint64_t *total, zbx_uint64_t *free, zbx_uint64_t *used, double *pfree, double *pused, char **error) { #ifdef HAVE_SYS_STATVFS_H # ifdef HAVE_SYS_STATVFS64 # define ZBX_STATFS statvfs64 # else # define ZBX_STATFS statvfs # endif # define ZBX_BSIZE f_frsize #else # ifdef HAVE_SYS_STATFS64 # define ZBX_STATFS statfs64 # else # define ZBX_STATFS statfs # endif # define ZBX_BSIZE f_bsize #endif struct ZBX_STATFS s; if (0 != ZBX_STATFS(fs, &s)) { *error = zbx_dsprintf(NULL, "Cannot obtain filesystem information: %s", zbx_strerror(errno)); return SYSINFO_RET_FAIL; } if (NULL != total) *total = (zbx_uint64_t)s.f_blocks * s.ZBX_BSIZE; if (NULL != free) *free = (zbx_uint64_t)s.f_bavail * s.ZBX_BSIZE; if (NULL != used) *used = (zbx_uint64_t)(s.f_blocks - s.f_bfree) * s.ZBX_BSIZE; if (NULL != pfree) { if (0 != s.f_blocks - s.f_bfree + s.f_bavail) *pfree = (double)(100.0 * s.f_bavail) / (s.f_blocks - s.f_bfree + s.f_bavail); else *pfree = 0; } if (NULL != pused) { if (0 != s.f_blocks - s.f_bfree + s.f_bavail) *pused = 100.0 - (double)(100.0 * s.f_bavail) / (s.f_blocks - s.f_bfree + s.f_bavail); else *pused = 0; } return SYSINFO_RET_OK; }
int VFS_FS_INODE(AGENT_REQUEST *request, AGENT_RESULT *result) { #ifdef HAVE_SYS_STATVFS_H # define ZBX_STATFS statvfs # define ZBX_FFREE f_favail #else # define ZBX_STATFS statfs # define ZBX_FFREE f_ffree #endif char *fsname, *mode; zbx_uint64_t total; struct ZBX_STATFS s; if (2 < request->nparam) return SYSINFO_RET_FAIL; fsname = get_rparam(request, 0); mode = get_rparam(request, 1); if (NULL == fsname || '\0' == *fsname || 0 != ZBX_STATFS(fsname, &s)) return SYSINFO_RET_FAIL; if (NULL == mode || '\0' == *mode || 0 == strcmp(mode, "total")) /* default parameter */ SET_UI64_RESULT(result, s.f_files); else if (0 == strcmp(mode, "free")) SET_UI64_RESULT(result, s.ZBX_FFREE); else if (0 == strcmp(mode, "used")) SET_UI64_RESULT(result, s.f_files - s.f_ffree); else if (0 == strcmp(mode, "pfree")) { total = s.f_files; #ifdef HAVE_SYS_STATVFS_H total -= s.f_ffree - s.f_favail; #endif if (0 != total) SET_DBL_RESULT(result, (double)(100.0 * s.ZBX_FFREE) / total); else return SYSINFO_RET_FAIL; } else if (0 == strcmp(mode, "pused")) { total = s.f_files; #ifdef HAVE_SYS_STATVFS_H total -= s.f_ffree - s.f_favail; #endif if (0 != total) SET_DBL_RESULT(result, 100.0 - (double)(100.0 * s.ZBX_FFREE) / total); else return SYSINFO_RET_FAIL; } else return SYSINFO_RET_FAIL; return SYSINFO_RET_OK; }
static int get_fs_size_stat(const char *fs, zbx_uint64_t *total, zbx_uint64_t *free, zbx_uint64_t *used, double *pfree, double *pused) { #ifdef HAVE_SYS_STATVFS_H # ifdef HAVE_SYS_STATVFS64 # define ZBX_STATFS statvfs64 # else # define ZBX_STATFS statvfs # endif # define ZBX_BSIZE f_frsize #else # define ZBX_STATFS statfs # define ZBX_BSIZE f_bsize #endif struct ZBX_STATFS s; assert(fs); if (0 != ZBX_STATFS(fs, &s)) return SYSINFO_RET_FAIL; if (total) *total = (zbx_uint64_t)s.f_blocks * s.ZBX_BSIZE; if (free) *free = (zbx_uint64_t)s.f_bavail * s.ZBX_BSIZE; if (used) *used = (zbx_uint64_t)(s.f_blocks - s.f_bfree) * s.ZBX_BSIZE; if (pfree) { if (0 != s.f_blocks - s.f_bfree + s.f_bavail) *pfree = (double)(100.0 * s.f_bavail) / (s.f_blocks - s.f_bfree + s.f_bavail); else *pfree = 0; } if (pused) { if (0 != s.f_blocks - s.f_bfree + s.f_bavail) *pused = 100.0 - (double)(100.0 * s.f_bavail) / (s.f_blocks - s.f_bfree + s.f_bavail); else *pused = 0; } return SYSINFO_RET_OK; }
int VFS_FS_INODE(AGENT_REQUEST *request, AGENT_RESULT *result) { #ifdef HAVE_SYS_STATVFS_H # define ZBX_STATFS statvfs # define ZBX_FFREE f_favail #else # define ZBX_STATFS statfs # define ZBX_FFREE f_ffree #endif char *fsname, *mode; zbx_uint64_t total; struct ZBX_STATFS s; if (2 < request->nparam) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); return SYSINFO_RET_FAIL; } fsname = get_rparam(request, 0); mode = get_rparam(request, 1); if (NULL == fsname || '\0' == *fsname) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid first parameter.")); return SYSINFO_RET_FAIL; } if (0 != ZBX_STATFS(fsname, &s)) { SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot obtain filesystem information: %s", zbx_strerror(errno))); return SYSINFO_RET_FAIL; } if (NULL == mode || '\0' == *mode || 0 == strcmp(mode, "total")) /* default parameter */ { SET_UI64_RESULT(result, s.f_files); } else if (0 == strcmp(mode, "free")) { SET_UI64_RESULT(result, s.ZBX_FFREE); } else if (0 == strcmp(mode, "used")) { SET_UI64_RESULT(result, s.f_files - s.f_ffree); } else if (0 == strcmp(mode, "pfree")) { total = s.f_files; #ifdef HAVE_SYS_STATVFS_H total -= s.f_ffree - s.f_favail; #endif if (0 != total) SET_DBL_RESULT(result, (double)(100.0 * s.ZBX_FFREE) / total); else { SET_MSG_RESULT(result, zbx_strdup(NULL, "Cannot calculate percentage because total is zero.")); return SYSINFO_RET_FAIL; } } else if (0 == strcmp(mode, "pused")) { total = s.f_files; #ifdef HAVE_SYS_STATVFS_H total -= s.f_ffree - s.f_favail; #endif if (0 != total) { SET_DBL_RESULT(result, 100.0 - (double)(100.0 * s.ZBX_FFREE) / total); } else { SET_MSG_RESULT(result, zbx_strdup(NULL, "Cannot calculate percentage because total is zero.")); return SYSINFO_RET_FAIL; } } else { SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid second parameter.")); return SYSINFO_RET_FAIL; } return SYSINFO_RET_OK; }