aboutsummaryrefslogtreecommitdiff
path: root/toys/posix/df.c
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2015-09-05 05:00:49 -0500
committerRob Landley <rob@landley.net>2015-09-05 05:00:49 -0500
commitc82343fe0bb293d3ed60b9122426f0bbcb0e58b0 (patch)
tree0075b4e4e700d5c3545a33962f530e589f701398 /toys/posix/df.c
parent7309d96822fe5891651b85d22cb8e79285e2d6ba (diff)
downloadtoybox-c82343fe0bb293d3ed60b9122426f0bbcb0e58b0.tar.gz
df -h and -H.
This doesn't address the lack of support for a variable-width "Filesystems" column, but it doesn't make the current situation any worse either. This is the last of the missing -h options. The other commands with -h also have --si, but only for df did it get a corresponding short option (and I've never personally used --si on du or ls, so let's wait until someone actually cares).
Diffstat (limited to 'toys/posix/df.c')
-rw-r--r--toys/posix/df.c32
1 files changed, 25 insertions, 7 deletions
diff --git a/toys/posix/df.c b/toys/posix/df.c
index 0bec17fb..8fc26eca 100644
--- a/toys/posix/df.c
+++ b/toys/posix/df.c
@@ -4,13 +4,13 @@
*
* See http://opengroup.org/onlinepubs/9699919799/utilities/df.html
-USE_DF(NEWTOY(df, "Pkt*a[-Pk]", TOYFLAG_SBIN))
+USE_DF(NEWTOY(df, "HPkht*a[-HPkh]", TOYFLAG_SBIN))
config DF
bool "df"
default y
help
- usage: df [-t type] [FILESYSTEM ...]
+ usage: df [-HPkh] [-t type] [FILESYSTEM ...]
The "disk free" command shows total/used/available disk space for
each filesystem listed on the command line, or all currently mounted
@@ -18,6 +18,8 @@ config DF
-P The SUSv3 "Pedantic" option
-k Sets units back to 1024 bytes (the default without -P)
+ -h Human readable output (K=1024)
+ -H Human readable output (k=1000)
-t type Display only filesystems of this type.
Pedantic provides a slightly less useful output format dictated by Posix,
@@ -73,7 +75,16 @@ static void show_mt(struct mtab_list *mt)
// Figure out appropriate spacing
len = 25 - strlen(device);
if (len < 1) len = 1;
- xprintf("%s% *lld % 10lld % 10lld % *lld%% %s\n", device, len,
+ if (toys.optflags & (FLAG_H|FLAG_h)) {
+ char *size_str = toybuf, *used_str = toybuf+64, *avail_str = toybuf+128;
+ int hr_flags = (toys.optflags & FLAG_H) ? HR_SI : 0;
+
+ human_readable(size_str, size, hr_flags);
+ human_readable(used_str, used, hr_flags);
+ human_readable(avail_str, avail, hr_flags);
+ xprintf("%-16s%4s %4s %4s % 3lld%% %s\n", device,
+ size_str, used_str, avail_str, percent, mt->dir);
+ } else xprintf("%s% *lld % 10lld % 10lld % *lld%% %s\n", device, len,
size, used, avail, (toys.optflags & FLAG_P) ? 7 : 3, percent, mt->dir);
if (device != mt->device) free(device);
@@ -84,10 +95,17 @@ void df_main(void)
struct mtab_list *mt, *mtstart, *mtend;
int p = toys.optflags & FLAG_P;
- // Units are 512 bytes if you select "pedantic" without "kilobytes".
- TT.units = p ? 512 : 1024;
- xprintf("Filesystem%8s-blocks\tUsed Available %s Mounted on\n",
- p ? "512" : "1K", p ? "Capacity" : "Use%");
+ // TODO: we don't actually know how wide the "Filesystem" column should be
+ // until we've looked at all the filesystems.
+ if (toys.optflags & (FLAG_H|FLAG_h)) {
+ TT.units = 1;
+ xprintf("Filesystem Size Used Avail Use% Mounted on\n");
+ } else {
+ // Units are 512 bytes if you select "pedantic" without "kilobytes".
+ TT.units = p ? 512 : 1024;
+ xprintf("Filesystem%8s-blocks\tUsed Available %s Mounted on\n",
+ p ? "512" : "1K", p ? "Capacity" : "Use%");
+ }
if (!(mtstart = xgetmountlist(0))) return;
mtend = dlist_terminate(mtstart);