1f90dcd0c0
'df' command used to display filesystem usage statistics as integer values, in most cases rounding the actual value down. Because of that 'df' tended to display faulty size values. This fix to 'df' utility calculates the fractional part of the size, then it rounds it when needed to the nearest one-digit integer value and displays after decimal dot. Change-Id: I9bc52635d45d3e55ce61b3b1c6b80d1267516e75
85 lines
1.8 KiB
C
85 lines
1.8 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <errno.h>
|
|
#include <sys/statfs.h>
|
|
|
|
static int ok = EXIT_SUCCESS;
|
|
|
|
static void printsize(long long n)
|
|
{
|
|
char unit = 'K';
|
|
long long t;
|
|
|
|
n *= 10;
|
|
|
|
if (n > 1024*1024*10) {
|
|
n /= 1024;
|
|
unit = 'M';
|
|
}
|
|
|
|
if (n > 1024*1024*10) {
|
|
n /= 1024;
|
|
unit = 'G';
|
|
}
|
|
|
|
t = (n + 512) / 1024;
|
|
printf("%4lld.%1lld%c", t/10, t%10, unit);
|
|
}
|
|
|
|
static void df(char *s, int always) {
|
|
struct statfs st;
|
|
|
|
if (statfs(s, &st) < 0) {
|
|
fprintf(stderr, "%s: %s\n", s, strerror(errno));
|
|
ok = EXIT_FAILURE;
|
|
} else {
|
|
if (st.f_blocks == 0 && !always)
|
|
return;
|
|
printf("%-20s ", s);
|
|
printsize((long long)st.f_blocks * (long long)st.f_bsize);
|
|
printf(" ");
|
|
printsize((long long)(st.f_blocks - (long long)st.f_bfree) * st.f_bsize);
|
|
printf(" ");
|
|
printsize((long long)st.f_bfree * (long long)st.f_bsize);
|
|
printf(" %d\n", (int) st.f_bsize);
|
|
}
|
|
}
|
|
|
|
int df_main(int argc, char *argv[]) {
|
|
printf("Filesystem Size Used Free Blksize\n");
|
|
if (argc == 1) {
|
|
char s[2000];
|
|
FILE *f = fopen("/proc/mounts", "r");
|
|
|
|
while (fgets(s, 2000, f)) {
|
|
char *c, *e = s;
|
|
|
|
for (c = s; *c; c++) {
|
|
if (*c == ' ') {
|
|
e = c + 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
for (c = e; *c; c++) {
|
|
if (*c == ' ') {
|
|
*c = '\0';
|
|
break;
|
|
}
|
|
}
|
|
|
|
df(e, 0);
|
|
}
|
|
|
|
fclose(f);
|
|
} else {
|
|
int i;
|
|
|
|
for (i = 1; i < argc; i++) {
|
|
df(argv[i], 1);
|
|
}
|
|
}
|
|
|
|
exit(ok);
|
|
}
|