summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko2009-10-03 01:14:15 +0200
committerDenys Vlasenko2009-10-03 01:14:15 +0200
commit87c150c7cc6ac12ce3ce14f55148c65830a746fd (patch)
treea11c6b3f2653aaca0263a26b872b7647b8ceec0b
parent26ff18b424c84a8948e0dcd1322a4bda0cb12fe4 (diff)
downloadbusybox-87c150c7cc6ac12ce3ce14f55148c65830a746fd.zip
busybox-87c150c7cc6ac12ce3ce14f55148c65830a746fd.tar.gz
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>
-rw-r--r--coreutils/ls.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/coreutils/ls.c b/coreutils/ls.c
index 19d3804..bb6165b 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);