637bf82f64653fecee935c8d0df03ce5c76b217c
[musl] / src / stat / statvfs.c
1 #include <sys/statvfs.h>
2 #include <sys/statfs.h>
3 #include "syscall.h"
4 #include "libc.h"
5
6 int __statfs(const char *path, struct statfs *buf)
7 {
8 #ifdef SYS_statfs64
9         return syscall(SYS_statfs64, path, sizeof *buf, buf);
10 #else
11         return syscall(SYS_statfs, path, buf);
12 #endif
13 }
14
15 int __fstatfs(int fd, struct statfs *buf)
16 {
17 #ifdef SYS_fstatfs64
18         return syscall(SYS_fstatfs64, fd, sizeof *buf, buf);
19 #else
20         return syscall(SYS_fstatfs, fd, buf);
21 #endif
22 }
23
24 weak_alias(__statfs, statfs);
25 weak_alias(__fstatfs, fstatfs);
26
27 static void fixup(struct statvfs *out, const struct statfs *in)
28 {
29         out->f_bsize = in->f_bsize;
30         out->f_frsize = in->f_bsize;
31         out->f_blocks = in->f_blocks;
32         out->f_bfree = in->f_bfree;
33         out->f_bavail = in->f_bavail;
34         out->f_files = in->f_files;
35         out->f_ffree = in->f_ffree;
36         out->f_favail = 0;
37         out->f_fsid = in->f_fsid.__val[0];
38         out->f_flag = in->f_flags;
39         out->f_namemax = in->f_namelen;
40 }
41
42 int statvfs(const char *restrict path, struct statvfs *restrict buf)
43 {
44         struct statfs kbuf;
45         if (__statfs(path, &kbuf)<0) return -1;
46         fixup(buf, &kbuf);
47         return 0;
48 }
49
50 int fstatvfs(int fd, struct statvfs *buf)
51 {
52         struct statfs kbuf;
53         if (__fstatfs(fd, &kbuf)<0) return -1;
54         fixup(buf, &kbuf);
55         return 0;
56 }
57
58 LFS64(statvfs);
59 LFS64(statfs);
60 LFS64(fstatvfs);
61 LFS64(fstatfs);