# include <sys/statvfs.h>
# endif
# define STATANYFS statvfs
+# define STATANYFS_STR "statvfs"
# define BLOCKSIZE(s) ((s).f_frsize ? (s).f_frsize : (s).f_bsize)
#elif HAVE_STATFS
# if HAVE_SYS_STATFS_H
# include <sys/statfs.h>
# endif
# define STATANYFS statfs
+# define STATANYFS_STR "statfs"
# define BLOCKSIZE(s) (s).f_bsize
#else
# error "No applicable input method."
static ignorelist_t *il_mountpoint = NULL;
static ignorelist_t *il_fstype = NULL;
-static _Bool by_device = false;
-static _Bool report_inodes = false;
+static _Bool by_device = 0;
+static _Bool report_inodes = 0;
static int df_init (void)
{
else if (strcasecmp (key, "ReportByDevice") == 0)
{
if (IS_TRUE (value))
- by_device = true;
+ by_device = 1;
return (0);
}
- else if (strcasecmp (key, "ReportReserved") == 0)
- {
- /* Nop for backwards compatibility. */
- return (0);
- }
else if (strcasecmp (key, "ReportInodes") == 0)
{
if (IS_TRUE (value))
- report_inodes = true;
+ report_inodes = 1;
else
- report_inodes = false;
+ report_inodes = 0;
return (0);
}
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)
{
if (STATANYFS (mnt_ptr->dir, &statbuf) < 0)
{
char errbuf[1024];
- ERROR ("statv?fs failed: %s",
+ ERROR (STATANYFS_STR"(%s) failed: %s",
+ mnt_ptr->dir,
sstrerror (errno, errbuf,
sizeof (errbuf)));
continue;
{
if (strcmp (mnt_ptr->dir, "/") == 0)
{
+ if (strcmp (mnt_ptr->type, "rootfs") == 0)
+ continue;
sstrncpy (disk_name, "root", sizeof (disk_name));
}
else
blocksize = BLOCKSIZE(statbuf);
- /* Sanity-check for the values in the struct */
+ /*
+ * Sanity-check for the values in the struct
+ */
+ /* Check for negative "available" byes. For example UFS can
+ * report negative free space for user. Notice. blk_reserved
+ * will start to diminish after this. */
+#if HAVE_STATVFS
+ /* Cast and temporary variable are needed to avoid
+ * compiler warnings.
+ * ((struct statvfs).f_bavail is unsigned (POSIX)) */
+ int64_t signed_bavail = (int64_t) statbuf.f_bavail;
+ if (signed_bavail < 0)
+ statbuf.f_bavail = 0;
+#elif HAVE_STATFS
+ if (statbuf.f_bavail < 0)
+ statbuf.f_bavail = 0;
+#endif
+ /* 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)