--- Makefile | 1 + df.c | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 df.c diff --git a/Makefile b/Makefile index 2e31f33..bb981ce 100644 --- a/Makefile +++ b/Makefile _AT_@ -38,6 +38,7 @@ SRC = \ comm.c \ cp.c \ date.c \ + df.c \ dirname.c \ echo.c \ env.c \ diff --git a/df.c b/df.c new file mode 100644 index 0000000..86c58f3 --- /dev/null +++ b/df.c _AT_@ -0,0 +1,120 @@ +#include <sys/stat.h> +#include <sys/statvfs.h> +#include <unistd.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <mntent.h> +#include "util.h" + +struct mnt_entry { + char *fsname; + char *dir; + char *type; + struct stat stat; + struct statvfs statvfs; +}; + +struct mnt_tbl { + struct mnt_entry *entry; + size_t siz; +}; + +static void mnt_show(struct mnt_entry *entry); + +enum { + BLKSIZ = 1024 +}; + +struct mnt_tbl * +init_mnt_tbl(void) +{ + struct mnt_tbl *mnt_tbl; + struct mnt_entry *entry; + FILE *fp; + struct mntent *me; + size_t siz = 0; + + fp = setmntent("/proc/mounts", "r"); + if (!fp) + eprintf("fopen /proc/mounts:"); + + mnt_tbl = malloc(sizeof(*mnt_tbl)); + if (!mnt_tbl) + eprintf("malloc:"); + mnt_tbl->entry = NULL; + mnt_tbl->siz = 0; + + while ((me = getmntent(fp))) { + mnt_tbl->entry = realloc(mnt_tbl->entry, + sizeof(*entry) * (siz + 1)); + if (!mnt_tbl->entry) + eprintf("realloc"); + entry = &mnt_tbl->entry[siz]; + entry->fsname = strdup(me->mnt_fsname); + entry->dir = strdup(me->mnt_dir); + entry->type = strdup(me->mnt_type); + stat(me->mnt_dir, &entry->stat); + statvfs(me->mnt_dir, &entry->statvfs); + siz++; + } + mnt_tbl->siz = siz; + + endmntent(fp); + return mnt_tbl; +} + +int +main(void) +{ + struct mnt_entry *entry; + struct mnt_tbl *mnt_tbl; + size_t i; + + mnt_tbl = init_mnt_tbl(); + printf("%-20s %-14s %s %s %s %s\n", "Filesystem", "1K-blocks", + "Used", "Available", "Use%", "Mounted on"); + for (i = 0; i < mnt_tbl->siz; i++) { + entry = &mnt_tbl->entry[i]; + if (!entry->stat.st_dev) + continue; + mnt_show(entry); + } + return 0; +} + +static void +mnt_show(struct mnt_entry *entry) +{ + long long size, used, avail; + long long percent = 0, fsbsize; + + if (!entry->statvfs.f_blocks) + return; + + if (entry->statvfs.f_bsize) + fsbsize = entry->statvfs.f_bsize; + else + fsbsize = 1; + + size = (fsbsize * entry->statvfs.f_blocks) / BLKSIZ; + used = (fsbsize * (entry->statvfs.f_blocks - entry->statvfs.f_bfree)); + used /= BLKSIZ; + avail = fsbsize; + if (getuid()) + avail *= entry->statvfs.f_bavail; + else + avail *= entry->statvfs.f_bfree; + avail /= BLKSIZ; + + if (used + avail) { + percent = (used * 100) / (used + avail); + if (used * 100 != percent * (used + avail)) + percent++; + } + + printf("%-20s %9lld ", entry->fsname, size); + printf("%9lld ", used); + printf("%9lld %3lld%% %s\n", + avail, percent, entry->dir); +} -- 1.8.3.3 --bg08WKrSYDhXBjb5--Received on Mon Sep 17 2001 - 00:00:00 CEST
This archive was generated by hypermail 2.3.0 : Mon Jul 22 2013 - 14:48:03 CEST