diff options
-rw-r--r-- | toys/posix/df.c | 32 |
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); |