Initial revision
diff --git a/df.c b/df.c
new file mode 100644
index 0000000..a0692af
--- /dev/null
+++ b/df.c
@@ -0,0 +1,103 @@
+#include "internal.h"
+#include <stdio.h>
+#include <mntent.h>
+#include <sys/stat.h>
+#include <sys/vfs.h>
+
+const char	df_usage[] = "df [filesystem ...]\n"
+"\n"
+"\tPrint the filesystem space used and space available.\n";
+
+
+static int
+df(const char * device, const char * mountPoint)
+{
+	struct statfs	s;
+	long		blocks_used;
+	long		blocks_percent_used;
+
+	if ( statfs(mountPoint, &s) != 0 ) {
+		name_and_error(mountPoint);
+		return 1;
+	}
+	
+	if ( s.f_blocks > 0 ) {
+		blocks_used = s.f_blocks - s.f_bfree;
+		blocks_percent_used = (long)
+		 (blocks_used * 100.0 / (blocks_used + s.f_bavail) + 0.5);
+
+/*
+		printf(
+		 "%-20s %7ld %7ld  %7ld  %5ld%%   %s\n"
+		,device
+		,s.f_blocks
+		,s.f_blocks - s.f_bfree
+		,s.f_bavail
+		,blocks_percent_used
+		,mountPoint);
+*/
+
+		printf(
+		       "%-20s %7.0f %7.0f  %7.0f  %5ld%%   %s\n"
+		       ,device
+		       ,s.f_blocks * (s.f_bsize / 1024.0)
+		       ,(s.f_blocks - s.f_bfree)  * (s.f_bsize / 1024.0)
+		       ,s.f_bavail * (s.f_bsize / 1024.0)
+		       ,blocks_percent_used
+		       ,mountPoint);
+
+	}
+
+	return 0;
+}
+
+extern int
+df_main(struct FileInfo * i, int argc, char * * argv)
+{
+	static const char header[] =
+	 "Filesystem         1024-blocks  Used Available Capacity Mounted on\n";
+	printf(header);
+
+	if ( argc > 1 ) {
+		struct mntent *	mountEntry;
+		int				status;
+
+		while ( argc > 1 ) {
+			if ( (mountEntry = findMountPoint(argv[1], "/etc/mtab")) == 0
+			 && (mountEntry = findMountPoint(argv[1], "/proc/mounts")) == 0 )
+			{
+				fprintf(stderr, "%s: can't find mount point.\n"
+				,argv[1]);
+				return 1;
+			}
+			status = df(mountEntry->mnt_fsname, mountEntry->mnt_dir);
+			if ( status != 0 )
+				return status;
+			argc--;
+			argv++;
+		}
+		return 0;
+	}
+	else {
+		FILE *		mountTable;
+		struct mntent *	mountEntry;
+
+		if ( (mountTable = setmntent("/etc/mtab", "r")) == 0
+		 && (mountTable = setmntent("/proc/mounts", "r")) == 0
+		) {
+			name_and_error("/etc/mtab");
+			return 1;
+		}
+
+		while ( (mountEntry = getmntent(mountTable)) != 0 ) {
+			int status = df(
+			 mountEntry->mnt_fsname
+			,mountEntry->mnt_dir);
+			if ( status != 0 )
+				return status;
+		}
+		endmntent(mountTable);
+	}
+	
+	return 0;
+}