From 1b9e50650717b64df39dc3596caab237d5d582e0 Mon Sep 17 00:00:00 2001 From: Will Sowerbutts Date: Sat, 24 Jan 2015 23:04:30 +0000 Subject: [PATCH] Applications: Make df work --- Applications/util/df.c | 173 +++++++++++++++++++++++++++-------------- 1 file changed, 116 insertions(+), 57 deletions(-) diff --git a/Applications/util/df.c b/Applications/util/df.c index f1c42b0a..5a5ad0d7 100644 --- a/Applications/util/df.c +++ b/Applications/util/df.c @@ -1,34 +1,40 @@ #include #include #include +#include #include #include +#include -char *devname(dev_t); -char *mntpoint(const char *); +const char *devname(dev_t); +const char *mntpoint(const char *); +void df_path(const char *path); +void df_dev(dev_t dev); +void df_all(void); + +int iflag=0, kflag=0, fflag=0; int main(int argc, char *argv[]) { char *p; - int i, j, Total, Used, Free, Percent, iflag = 0, kflag = 0, fflag = 0; - struct _uzifilesys fsys; + int i; for (i = 1; i < argc; ++i) { - p = argv[i]; - if (p[0] == '-') { - for (++p; *p; ++p) { - switch (*p) { - case 'i': iflag = 1; break; - case 'k': kflag = 1; break; - case 'f': fflag = 1; break; - default: - printf("usage: %s [-ikf]\n", argv[0]); - return 1; - } - } - } else { - break; - } + p = argv[i]; + if (p[0] == '-') { + for (++p; *p; ++p) { + switch (*p) { + case 'i': iflag = 1; break; + case 'k': kflag = 1; break; + case 'f': fflag = 1; break; + default: + printf("usage: %s [-ikf]\n", argv[0]); + return 1; + } + } + } else { + break; + } } printf("%-16s %6s %6s %6s %6s %s\n", @@ -40,43 +46,96 @@ int main(int argc, char *argv[]) "Mounted on"); if (i < argc) { - for (; i < argc; ++i) { - p = argv[i]; - } + for (; i < argc; ++i) { + df_path(argv[i]); + } } else { - for (j = 0; j < 8; ++j) { - if ((_getfsys(j, &fsys) == 0) && fsys.s_mounted) { - Total = iflag ? 8 * (fsys.s_isize - 2) : fsys.s_fsize; - Used = iflag ? Total - fsys.s_tinode : - Total - fsys.s_isize - fsys.s_tfree; - Free = iflag ? fsys.s_tinode : fsys.s_tfree; - - if (!iflag && kflag) { - Total /= 2; - Used /= 2; - Free /= 2; - } - if (fflag) { - if ((Percent = Total / 100) != 0) Percent = Free / Percent; - } else { - if ((Percent = Total / 100) != 0) Percent = Used / Percent; - } - p = devname(j); - printf("%-16s %6u %6u %6u %5u%% %s\n", - p, Total, Used, Free, Percent, - fsys.s_mntpt ? mntpoint(p) : "/"); - } - } + df_all(); } return 0; } +void df_path(const char *path) +{ + struct stat sbuf; + + if(stat(path, &sbuf) < 0){ + fprintf(stderr, "df: \"%s\": %s\n", path, strerror(errno)); + }else{ + df_dev(sbuf.st_dev); + } +} + +void df_dev(dev_t dev) +{ + unsigned int Total, Used, Free, Percent; + struct _uzifilesys fsys; + const char *dn; + + dn = devname(dev); + + if(_getfsys(dev, &fsys)){ + fprintf(stderr, "df: _getfsys(%d): %s\n", dev, strerror(errno)); + return; + } + + if(iflag){ + /* inodes */ + Total = 8 * (fsys.s_isize - 2); + Used = Total - fsys.s_tinode; + Free = fsys.s_tinode; + }else{ + /* blocks */ + Total = fsys.s_fsize; + Used = Total - fsys.s_isize - fsys.s_tfree; + Free = fsys.s_tfree; + } + + if (!iflag && kflag) { + Total /= 2; + Used /= 2; + Free /= 2; + } + + Percent = Total / 100; + + if (fflag) { + if(Percent) + Percent = Free / Percent; + } else { + if(Percent) + Percent = Used / Percent; + } + + printf("%-16s %6u %6u %6u %5u%% %s\n", + dn, Total, Used, Free, Percent, + fsys.s_mntpt ? mntpoint(dn) : "/"); +} + +void df_all(void) +{ + FILE *f; + static char tmp[256]; + static char dev[20], mntpt[20], fstype[20], rwflag[20]; + + f = fopen("/etc/mtab", "r"); + if (f) { + while (fgets(tmp, 256, f)) { + sscanf(tmp, "%s %s %s %s\n", dev, mntpt, fstype, rwflag); + df_path(mntpt); + } + fclose(f); + }else{ + fprintf(stderr, "df: cannot open /etc/mtab: %s\n", strerror(errno)); + } +} + /* Search /dev until an entry with the specified device number is found */ #define DEV_PATH "/dev" -char *devname(dev_t devno) +const char *devname(dev_t devno) { DIR *dp; struct dirent *entry; @@ -84,16 +143,16 @@ char *devname(dev_t devno) static char namebuf[sizeof(DEV_PATH) + MAXNAMLEN + 2]; if ((dp = opendir(DEV_PATH)) != (DIR *) NULL) { - while ((entry = readdir(dp)) != (struct dirent *) NULL) { - sprintf(namebuf, "%s/%s", DEV_PATH, entry->d_name); - if (stat(namebuf, &fstat) != 0) - continue; - if (!S_ISBLK(fstat.st_mode)) - continue; - if (fstat.st_rdev != devno) - continue; - return namebuf; - } + while ((entry = readdir(dp)) != (struct dirent *) NULL) { + sprintf(namebuf, "%s/%s", DEV_PATH, entry->d_name); + if (stat(namebuf, &fstat) != 0) + continue; + if (!S_ISBLK(fstat.st_mode)) + continue; + if (fstat.st_rdev != devno) + continue; + return namebuf; + } } sprintf(namebuf, "%d", devno); @@ -102,7 +161,7 @@ char *devname(dev_t devno) /* Find the mount point in /etc/mtab for the specified device */ -char *mntpoint(const char *devname) +const char *mntpoint(const char *devname) { FILE *f; static char tmp[256]; -- 2.34.1