• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <errno.h>
5 #include <sys/statfs.h>
6 
7 static int ok = EXIT_SUCCESS;
8 
printsize(long long n)9 static void printsize(long long n)
10 {
11     char unit = 'K';
12     n /= 1024;
13     if (n > 1024) {
14         n /= 1024;
15         unit = 'M';
16     }
17     if (n > 1024) {
18         n /= 1024;
19         unit = 'G';
20     }
21     printf("%4lld%c", n, unit);
22 }
23 
df(char * s,int always)24 static void df(char *s, int always) {
25     struct statfs st;
26 
27     if (statfs(s, &st) < 0) {
28         fprintf(stderr, "%s: %s\n", s, strerror(errno));
29         ok = EXIT_FAILURE;
30     } else {
31         if (st.f_blocks == 0 && !always)
32             return;
33         printf("%-20s  ", s);
34         printsize((long long)st.f_blocks * (long long)st.f_bsize);
35         printf("  ");
36         printsize((long long)(st.f_blocks - (long long)st.f_bfree) * st.f_bsize);
37         printf("  ");
38         printsize((long long)st.f_bfree * (long long)st.f_bsize);
39         printf("   %d\n", (int) st.f_bsize);
40     }
41 }
42 
df_main(int argc,char * argv[])43 int df_main(int argc, char *argv[]) {
44     printf("Filesystem             Size   Used   Free   Blksize\n");
45     if (argc == 1) {
46         char s[2000];
47         FILE *f = fopen("/proc/mounts", "r");
48 
49         while (fgets(s, 2000, f)) {
50             char *c, *e = s;
51 
52             for (c = s; *c; c++) {
53                 if (*c == ' ') {
54                     e = c + 1;
55                     break;
56                 }
57             }
58 
59             for (c = e; *c; c++) {
60                 if (*c == ' ') {
61                     *c = '\0';
62                     break;
63                 }
64             }
65 
66             df(e, 0);
67         }
68 
69         fclose(f);
70     } else {
71         int i;
72 
73         for (i = 1; i < argc; i++) {
74             df(argv[i], 1);
75         }
76     }
77 
78     exit(ok);
79 }
80