diff options
author | Jim Meyering <jim@meyering.net> | 1998-01-05 17:43:00 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 1998-01-05 17:43:00 +0000 |
commit | 6cc3cf776c3a24d679bf7c460e41981afb7c33e2 (patch) | |
tree | 703016c97d89527eb87b18295b978f6a877173ad /src/df.c | |
parent | e162abfc5b7c603af2392c7490722569fc61a212 (diff) | |
download | coreutils-6cc3cf776c3a24d679bf7c460e41981afb7c33e2.tar.xz |
(df_readable): New function.
(show_dev): If a value consists entirely of 1 bits, or is derived
from some other value that consists entirely of 1 bits, report "-".
Check inode and block counts more carefully for plausibility,
to avoid arithmetic overflow when computing percentages.
Diffstat (limited to 'src/df.c')
-rw-r--r-- | src/df.c | 62 |
1 files changed, 39 insertions, 23 deletions
@@ -185,6 +185,13 @@ excluded_fstype (const char *fstype) return 0; } +/* Like human_readable, except return "-" if the argument is -1. */ +static char * +df_readable (uintmax_t n, char *buf, int from_units, int to_units, int base) +{ + return n == -1 ? "-" : human_readable (n, buf, from_units, to_units, base); +} + /* Display a space listing for the disk device with absolute path DISK. If MOUNT_POINT is non-NULL, it is the path of the root of the filesystem on DISK. @@ -235,23 +242,28 @@ show_dev (const char *disk, const char *mount_point, const char *fstype) double inodes_percent_used; uintmax_t inodes_used; - if (fsu.fsu_files == 0) + if (fsu.fsu_files == -1 || fsu.fsu_files < fsu.fsu_ffree) { - inodes_used = 0; - fsu.fsu_ffree = 0; - inodes_percent_used = 0; + inodes_used = -1; + inodes_percent_used = -1; } else { inodes_used = fsu.fsu_files - fsu.fsu_ffree; - inodes_percent_used = inodes_used * 100.0 / fsu.fsu_files; + inodes_percent_used = + (fsu.fsu_files == 0 ? 0 + : inodes_used * 100.0 / fsu.fsu_files); } - printf (" %7s %7s %7s %5.0f%%", - human_readable (fsu.fsu_files, buf[0], 1, 1, human_readable_base), - human_readable (inodes_used, buf[1], 1, 1, human_readable_base), - human_readable (fsu.fsu_ffree, buf[2], 1, 1, human_readable_base), - inodes_percent_used); + printf (" %7s %7s %7s ", + df_readable (fsu.fsu_files, buf[0], 1, 1, human_readable_base), + df_readable (inodes_used, buf[1], 1, 1, human_readable_base), + df_readable (fsu.fsu_ffree, buf[2], 1, 1, human_readable_base)); + + if (inodes_percent_used < 0) + printf (" - "); + else + printf (" %5.0f%%", inodes_percent_used); } else { @@ -260,27 +272,31 @@ show_dev (const char *disk, const char *mount_point, const char *fstype) double blocks_percent_used; uintmax_t blocks_used; - if (fsu.fsu_blocks == 0 || fsu.fsu_bavail == (unsigned long) -1) + if (fsu.fsu_blocks == -1 || fsu.fsu_blocks < fsu.fsu_bfree) { - blocks_used = 0; - fsu.fsu_bavail = 0; - blocks_percent_used = 0; + blocks_used = -1; + blocks_percent_used = -1; } else { blocks_used = fsu.fsu_blocks - fsu.fsu_bfree; blocks_percent_used = - blocks_used * 100.0 / (blocks_used + fsu.fsu_bavail); + (fsu.fsu_bfree < fsu.fsu_bavail ? -1 + : (blocks_used + fsu.fsu_bavail) == 0 ? 0 + : blocks_used * 100.0 / (blocks_used + fsu.fsu_bavail)); } - printf (" %*s %*s %*s %5.0f%% ", - w, human_readable (fsu.fsu_blocks, buf[0], fsu.fsu_blocksize, - output_units, human_readable_base), - w, human_readable (blocks_used, buf[1], fsu.fsu_blocksize, - output_units, human_readable_base), - w, human_readable (fsu.fsu_bavail, buf[2], fsu.fsu_blocksize, - output_units, human_readable_base), - blocks_percent_used); + printf (" %*s %*s %*s ", + w, df_readable (fsu.fsu_blocks, buf[0], fsu.fsu_blocksize, + output_units, human_readable_base), + w, df_readable (blocks_used, buf[1], fsu.fsu_blocksize, + output_units, human_readable_base), + w, df_readable (fsu.fsu_bavail, buf[2], fsu.fsu_blocksize, + output_units, human_readable_base)); + if (blocks_percent_used < 0) + printf (" - "); + else + printf (" %5.0f%% ", blocks_percent_used); } if (mount_point) |