changeset 687:598263aee2b9

Change df percentage calculation to match posix, spotted by Roy Tam.
author Rob Landley <rob@landley.net>
date Thu, 08 Nov 2012 15:03:03 -0600
parents 9414be56b1db
children 9791e462855a
files toys/posix/df.c
diffstat 1 files changed, 10 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/toys/posix/df.c	Thu Nov 08 11:19:07 2012 -0600
+++ b/toys/posix/df.c	Thu Nov 08 15:03:03 2012 -0600
@@ -49,8 +49,7 @@
 static void show_mt(struct mtab_list *mt)
 {
 	int len;
-	long size, used, avail, percent;
-	uint64_t block;
+	uint64_t size, used, avail, percent, block;
 	char *device;
 
 	// Return if it wasn't found (should never happen, but with /etc/mtab...)
@@ -72,13 +71,15 @@
 	// Figure out how much total/used/free space this filesystem has,
 	// forcing 64-bit math because filesystems are big now.
 	block = mt->statvfs.f_bsize ? mt->statvfs.f_bsize : 1;
-	size = (long)((block * mt->statvfs.f_blocks) / TT.units);
-	used = (long)((block * (mt->statvfs.f_blocks-mt->statvfs.f_bfree))
-			/ TT.units);
-	avail = (long)((block
-				* (getuid() ? mt->statvfs.f_bavail : mt->statvfs.f_bfree))
-			/ TT.units);
-	percent = size ? 100-(long)((100*(uint64_t)avail)/size) : 0;
+	size = (block * mt->statvfs.f_blocks) / TT.units;
+	used = (block * (mt->statvfs.f_blocks-mt->statvfs.f_bfree)) / TT.units;
+	avail = (block * (getuid() ? mt->statvfs.f_bavail : mt->statvfs.f_bfree))
+			/ TT.units;
+	if (!(used+avail)) percent = 0;
+	else {
+		percent = (used*100)/(used+avail);
+		if (used*100 != percent*(used+avail)) percent++;
+	}
 
 	device = *mt->device == '/' ? realpath(mt->device, NULL) : NULL;
 	if (!device) device = mt->device;