Quoth POSIX Issue 7: <percentage used> The percentage of the normally available space that is currently allocated to all files on the file system. This shall be calculated using the fraction: <space used>/( <space used>+ <space free>) expressed as a percentage. This percentage may be greater than 100 if <space free> is less than zero. The percentage value shall be expressed as a positive integer, with any fractional result causing it to be rounded to the next highest integer.
Nominally this only applies to -P and -Pk behaviour (the last hunk), but for consistency it may be best to apply that everywhere --- bin/df/Makefile | 4 ++-- bin/df/df.c | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/bin/df/Makefile b/bin/df/Makefile index 0a79ba29be6..099a4f0333b 100644 --- a/bin/df/Makefile +++ b/bin/df/Makefile @@ -2,7 +2,7 @@ PROG= df SRCS= df.c ffs_df.c ext2fs_df.c -LDADD= -lutil -DPADD= ${LIBUTIL} +LDADD= -lutil -lm +DPADD= ${LIBUTIL} ${LIBM} .include <bsd.prog.mk> diff --git a/bin/df/df.c b/bin/df/df.c index fd51f906f89..d13f1d2d54a 100644 --- a/bin/df/df.c +++ b/bin/df/df.c @@ -41,6 +41,7 @@ #include <err.h> #include <errno.h> #include <fcntl.h> +#include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -324,12 +325,12 @@ prtstat(struct statfs *sfsp, int maxwidth, int headerlen, int blocksize) fsbtoblk(used, sfsp->f_bsize, blocksize), fsbtoblk(sfsp->f_bavail, sfsp->f_bsize, blocksize)); (void)printf(" %5.0f%%", - availblks == 0 ? 100.0 : (double)used / (double)availblks * 100.0); + availblks == 0 ? 100.0 : ceil((double)used / (double)availblks * 100.0)); if (iflag) { inodes = sfsp->f_files; used = inodes - sfsp->f_ffree; (void)printf(" %7llu %7llu %5.0f%% ", used, sfsp->f_ffree, - inodes == 0 ? 100.0 : (double)used / (double)inodes * 100.0); + inodes == 0 ? 100.0 : ceil((double)used / (double)inodes * 100.0)); } else (void)printf(" "); (void)printf(" %s\n", sfsp->f_mntonname); @@ -404,7 +405,7 @@ posixprint(struct statfs *mntbuf, long mntsize, int maxwidth) if (avail == 0) percentused = 100.0; else - percentused = (double)used / (double)avail * 100.0; + percentused = ceil((double)used / (double)avail * 100.0); (void) printf ("%-*.*s %*lld %10lld %11lld %5.0f%% %s\n", maxwidth, maxwidth, sfsp->f_mntfromname, -- 2.30.2
signature.asc
Description: PGP signature