df.c revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <errno.h>
5#include <sys/statfs.h>
6
7static int ok = EXIT_SUCCESS;
8
9static 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
28int 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