diff options
Diffstat (limited to 'df.c')
-rw-r--r-- | df.c | 103 |
1 files changed, 103 insertions, 0 deletions
@@ -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; +} |