changeset 681:44904c7212e7

Follow symlinks to get actual device name, getmountlist() reverses order for us now, detect stdout to full device.
author Rob Landley <rob@landley.net>
date Fri, 26 Oct 2012 21:15:31 -0500
parents ff2cf02d9703
children 7894d4afc39c
files toys/posix/df.c
diffstat 1 files changed, 15 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/toys/posix/df.c	Tue Oct 23 16:28:14 2012 -0500
+++ b/toys/posix/df.c	Fri Oct 26 21:15:31 2012 -0500
@@ -51,6 +51,7 @@
 	int len;
 	long size, used, avail, percent;
 	uint64_t block;
+	char *device;
 
 	// Return if it wasn't found (should never happen, but with /etc/mtab...)
 	if (!mt) return;
@@ -79,16 +80,21 @@
 			/ TT.units);
 	percent = size ? 100-(long)((100*(uint64_t)avail)/size) : 0;
 
+	device = *mt->device == '/' ? realpath(mt->device, NULL) : NULL;
+	if (!device) device = mt->device;
+
 	// Figure out appropriate spacing
-	len = 25 - strlen(mt->device);
+	len = 25 - strlen(device);
 	if (len < 1) len = 1;
 	if (CFG_DF_PEDANTIC && (toys.optflags & FLAG_P)) {
-		printf("%s %ld %ld %ld %ld%% %s\n", mt->device, size, used, avail,
+		xprintf("%s %ld %ld %ld %ld%% %s\n", device, size, used, avail,
 				percent, mt->dir);
 	} else {
-		printf("%s% *ld % 10ld % 9ld % 3ld%% %s\n",mt->device, len,
+		xprintf("%s% *ld % 10ld % 9ld % 3ld%% %s\n", device, len,
 			size, used, avail, percent, mt->dir);
 	}
+
+	if (device != mt->device) free(device);
 }
 
 void df_main(void)
@@ -123,8 +129,12 @@
 			// Find and display this filesystem.  Use _last_ hit in case of
 			// -- bind mounts.
 			mt2 = NULL;
-			for (mt = mtlist; mt; mt = mt->next)
-				if (st.st_dev == mt->stat.st_dev) mt2 = mt;
+			for (mt = mtlist; mt; mt = mt->next) {
+				if (st.st_dev == mt->stat.st_dev) {
+					mt2 = mt;
+					break;
+				}
+			}
 			show_mt(mt2);
 		}
 	} else {