• 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 
df(char * s,int always)9 static void df(char *s, int always) {
10     struct statfs st;
11 
12     if (statfs(s, &st) < 0) {
13         fprintf(stderr, "%s: %s\n", s, strerror(errno));
14         ok = EXIT_FAILURE;
15     } else {
16         if (st.f_blocks == 0 && !always)
17             return;
18 
19         printf("%s: %lldK total, %lldK used, %lldK available (block size %d)\n",
20                s,
21                ((long long)st.f_blocks * (long long)st.f_bsize) / 1024,
22                ((long long)(st.f_blocks - (long long)st.f_bfree) * st.f_bsize) / 1024,
23                ((long long)st.f_bfree * (long long)st.f_bsize) / 1024,
24                (int) st.f_bsize);
25     }
26 }
27 
df_main(int argc,char * argv[])28 int df_main(int argc, char *argv[]) {
29     if (argc == 1) {
30         char s[2000];
31         FILE *f = fopen("/proc/mounts", "r");
32 
33         while (fgets(s, 2000, f)) {
34             char *c, *e = s;
35 
36             for (c = s; *c; c++) {
37                 if (*c == ' ') {
38                     e = c + 1;
39                     break;
40                 }
41             }
42 
43             for (c = e; *c; c++) {
44                 if (*c == ' ') {
45                     *c = '\0';
46                     break;
47                 }
48             }
49 
50             df(e, 0);
51         }
52 
53         fclose(f);
54     } else {
55         int i;
56 
57         for (i = 1; i < argc; i++) {
58             df(argv[i], 1);
59         }
60     }
61 
62     exit(ok);
63 }
64