- /* struct STATANYFS statbuf; */
- cu_mount_t *mnt_list;
- cu_mount_t *mnt_ptr;
-
- mnt_list = NULL;
- if (cu_mount_getlist (&mnt_list) == NULL)
- {
- ERROR ("df plugin: cu_mount_getlist failed.");
- return (-1);
- }
-
- for (mnt_ptr = mnt_list; mnt_ptr != NULL; mnt_ptr = mnt_ptr->next)
- {
- unsigned long long blocksize;
- char disk_name[256];
- uint64_t blk_free;
- uint64_t blk_reserved;
- uint64_t blk_used;
-
- if (ignorelist_match (il_device,
- (mnt_ptr->spec_device != NULL)
- ? mnt_ptr->spec_device
- : mnt_ptr->device))
- continue;
- if (ignorelist_match (il_mountpoint, mnt_ptr->dir))
- continue;
- if (ignorelist_match (il_fstype, mnt_ptr->type))
- continue;
-
- if (STATANYFS (mnt_ptr->dir, &statbuf) < 0)
- {
- char errbuf[1024];
- ERROR ("statv?fs failed: %s",
- sstrerror (errno, errbuf,
- sizeof (errbuf)));
- continue;
- }
-
- if (!statbuf.f_blocks)
- continue;
-
- if (by_device)
- {
- /* eg, /dev/hda1 -- strip off the "/dev/" */
- if (strncmp (mnt_ptr->spec_device, "/dev/", strlen ("/dev/")) == 0)
- sstrncpy (disk_name, mnt_ptr->spec_device + strlen ("/dev/"), sizeof (disk_name));
- else
- sstrncpy (disk_name, mnt_ptr->spec_device, sizeof (disk_name));
-
- if (strlen(disk_name) < 1)
- {
- DEBUG("df: no device name name for mountpoint %s, skipping", mnt_ptr->dir);
- continue;
- }
- }
- else
- {
- if (strcmp (mnt_ptr->dir, "/") == 0)
- {
- sstrncpy (disk_name, "root", sizeof (disk_name));
- }
- else
- {
- int i, len;
-
- sstrncpy (disk_name, mnt_ptr->dir + 1, sizeof (disk_name));
- len = strlen (disk_name);
-
- for (i = 0; i < len; i++)
- if (disk_name[i] == '/')
- disk_name[i] = '-';
- }
- }
-
- blocksize = BLOCKSIZE(statbuf);
-
- /* Sanity-check for the values in the struct */
- if (statbuf.f_bfree < statbuf.f_bavail)
- statbuf.f_bfree = statbuf.f_bavail;
- if (statbuf.f_blocks < statbuf.f_bfree)
- statbuf.f_blocks = statbuf.f_bfree;
-
- blk_free = (uint64_t) statbuf.f_bavail;
- blk_reserved = (uint64_t) (statbuf.f_bfree - statbuf.f_bavail);
- blk_used = (uint64_t) (statbuf.f_blocks - statbuf.f_bfree);
-
- df_submit_one (disk_name, "df_complex", "free",
- (gauge_t) (blk_free * blocksize));
- df_submit_one (disk_name, "df_complex", "reserved",
- (gauge_t) (blk_reserved * blocksize));
- df_submit_one (disk_name, "df_complex", "used",
- (gauge_t) (blk_used * blocksize));
-
- /* inode handling */
- if (report_inodes)
- {
- uint64_t inode_free;
- uint64_t inode_reserved;
- uint64_t inode_used;
-
- /* Sanity-check for the values in the struct */
- if (statbuf.f_ffree < statbuf.f_favail)
- statbuf.f_ffree = statbuf.f_favail;
- if (statbuf.f_files < statbuf.f_ffree)
- statbuf.f_files = statbuf.f_ffree;
-
- inode_free = (uint64_t) statbuf.f_favail;
- inode_reserved = (uint64_t) (statbuf.f_ffree - statbuf.f_favail);
- inode_used = (uint64_t) (statbuf.f_files - statbuf.f_ffree);
-
- df_submit_one (disk_name, "df_inodes", "free",
- (gauge_t) inode_free);
- df_submit_one (disk_name, "df_inodes", "reserved",
- (gauge_t) inode_reserved);
- df_submit_one (disk_name, "df_inodes", "used",
- (gauge_t) inode_used);
- }
- }
-
- cu_mount_freelist (mnt_list);
-
- return (0);
+ /* Make sure that f_blocks >= f_bfree >= f_bavail */
+ if (statbuf.f_bfree < statbuf.f_bavail)
+ statbuf.f_bfree = statbuf.f_bavail;
+ if (statbuf.f_blocks < statbuf.f_bfree)
+ statbuf.f_blocks = statbuf.f_bfree;
+
+ blk_free = (uint64_t)statbuf.f_bavail;
+ blk_reserved = (uint64_t)(statbuf.f_bfree - statbuf.f_bavail);
+ blk_used = (uint64_t)(statbuf.f_blocks - statbuf.f_bfree);
+
+ if (values_absolute) {
+ df_submit_one(disk_name, "df_complex", "free",
+ (gauge_t)(blk_free * blocksize));
+ df_submit_one(disk_name, "df_complex", "reserved",
+ (gauge_t)(blk_reserved * blocksize));
+ df_submit_one(disk_name, "df_complex", "used",
+ (gauge_t)(blk_used * blocksize));
+ }
+
+ if (values_percentage) {
+ if (statbuf.f_blocks > 0) {
+ df_submit_one(disk_name, "percent_bytes", "free",
+ (gauge_t)((float_t)(blk_free) / statbuf.f_blocks * 100));
+ df_submit_one(
+ disk_name, "percent_bytes", "reserved",
+ (gauge_t)((float_t)(blk_reserved) / statbuf.f_blocks * 100));
+ df_submit_one(disk_name, "percent_bytes", "used",
+ (gauge_t)((float_t)(blk_used) / statbuf.f_blocks * 100));
+ } else {
+ retval = -1;
+ break;
+ }
+ }
+
+ /* inode handling */
+ if (report_inodes && statbuf.f_files != 0 && statbuf.f_ffree != 0) {
+ uint64_t inode_free;
+ uint64_t inode_reserved;
+ uint64_t inode_used;
+
+ /* Sanity-check for the values in the struct */
+ if (statbuf.f_ffree < statbuf.f_favail)
+ statbuf.f_ffree = statbuf.f_favail;
+ if (statbuf.f_files < statbuf.f_ffree)
+ statbuf.f_files = statbuf.f_ffree;
+
+ inode_free = (uint64_t)statbuf.f_favail;
+ inode_reserved = (uint64_t)(statbuf.f_ffree - statbuf.f_favail);
+ inode_used = (uint64_t)(statbuf.f_files - statbuf.f_ffree);
+
+ if (values_percentage) {
+ if (statbuf.f_files > 0) {
+ df_submit_one(
+ disk_name, "percent_inodes", "free",
+ (gauge_t)((float_t)(inode_free) / statbuf.f_files * 100));
+ df_submit_one(
+ disk_name, "percent_inodes", "reserved",
+ (gauge_t)((float_t)(inode_reserved) / statbuf.f_files * 100));
+ df_submit_one(
+ disk_name, "percent_inodes", "used",
+ (gauge_t)((float_t)(inode_used) / statbuf.f_files * 100));
+ } else {
+ retval = -1;
+ break;
+ }
+ }
+ if (values_absolute) {
+ df_submit_one(disk_name, "df_inodes", "free", (gauge_t)inode_free);
+ df_submit_one(disk_name, "df_inodes", "reserved",
+ (gauge_t)inode_reserved);
+ df_submit_one(disk_name, "df_inodes", "used", (gauge_t)inode_used);
+ }
+ }
+ }
+
+ cu_mount_freelist(mnt_list);
+
+ return retval;