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