diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-10-03 03:14:15 +0400 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-10-03 03:14:15 +0400 |
commit | 87c150c7cc6ac12ce3ce14f55148c65830a746fd (patch) | |
tree | a11c6b3f2653aaca0263a26b872b7647b8ceec0b /coreutils/ls.c | |
parent | 26ff18b424c84a8948e0dcd1322a4bda0cb12fe4 (diff) |
ls: add "total NNNN" header if DESKTOP. By Johannes Stezenbach (js AT sig21.net)
function old new delta
showdirs 492 564 +72
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'coreutils/ls.c')
-rw-r--r-- | coreutils/ls.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/coreutils/ls.c b/coreutils/ls.c index 19d38049c..bb6165b39 100644 --- a/coreutils/ls.c +++ b/coreutils/ls.c @@ -17,8 +17,7 @@ * it more portable. * * KNOWN BUGS: - * 1. ls -l of a directory doesn't give "total <blocks>" header - * 2. hidden files can make column width too large + * 1. hidden files can make column width too large * * NON-OPTIMAL BEHAVIOUR: * 1. autowidth reads directories twice @@ -598,6 +597,24 @@ static void showfiles(struct dnode **dn, int nfiles) } +#if ENABLE_DESKTOP +static off_t calculate_blocks(struct dnode **dn, int nfiles) +{ + uoff_t blocks = 1; + while (nfiles) { + blocks += (*dn)->dstat.st_blocks; /* in 512 byte blocks */ + dn++; + nfiles--; + } + + /* Even though POSIX says use 512 byte blocks, coreutils use 1k */ + /* Actually, we round up by calculating (blocks + 1) / 2, + * "+ 1" was done when we initialized blocks to 1 */ + return blocks >> 1; +} +#endif + + static void showdirs(struct dnode **dn, int ndirs, int first) { int i, nfiles; @@ -617,6 +634,10 @@ static void showdirs(struct dnode **dn, int ndirs, int first) } subdnp = list_dir(dn[i]->fullname); nfiles = countfiles(subdnp); +#if ENABLE_DESKTOP + if (all_fmt & STYLE_LONG) + printf("total %"OFF_FMT"u\n", calculate_blocks(subdnp, nfiles)); +#endif if (nfiles > 0) { /* list all files at this level */ dnsort(subdnp, nfiles); |