github.com/afumu/libc@v0.0.6/musl/src/stat/statvfs.c (about)

     1  #include <sys/statvfs.h>
     2  #include <sys/statfs.h>
     3  #include "syscall.h"
     4  
     5  static int __statfs(const char *path, struct statfs *buf)
     6  {
     7  	*buf = (struct statfs){0};
     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  static int __fstatfs(int fd, struct statfs *buf)
    16  {
    17  	*buf = (struct statfs){0};
    18  #ifdef SYS_fstatfs64
    19  	return syscall(SYS_fstatfs64, fd, sizeof *buf, buf);
    20  #else
    21  	return syscall(SYS_fstatfs, fd, buf);
    22  #endif
    23  }
    24  
    25  weak_alias(__statfs, statfs);
    26  weak_alias(__fstatfs, fstatfs);
    27  
    28  static void fixup(struct statvfs *out, const struct statfs *in)
    29  {
    30  	*out = (struct statvfs){0};
    31  	out->f_bsize = in->f_bsize;
    32  	out->f_frsize = in->f_frsize ? in->f_frsize : in->f_bsize;
    33  	out->f_blocks = in->f_blocks;
    34  	out->f_bfree = in->f_bfree;
    35  	out->f_bavail = in->f_bavail;
    36  	out->f_files = in->f_files;
    37  	out->f_ffree = in->f_ffree;
    38  	out->f_favail = in->f_ffree;
    39  	out->f_fsid = in->f_fsid.__val[0];
    40  	out->f_flag = in->f_flags;
    41  	out->f_namemax = in->f_namelen;
    42  }
    43  
    44  int statvfs(const char *restrict path, struct statvfs *restrict buf)
    45  {
    46  	struct statfs kbuf;
    47  	if (__statfs(path, &kbuf)<0) return -1;
    48  	fixup(buf, &kbuf);
    49  	return 0;
    50  }
    51  
    52  int fstatvfs(int fd, struct statvfs *buf)
    53  {
    54  	struct statfs kbuf;
    55  	if (__fstatfs(fd, &kbuf)<0) return -1;
    56  	fixup(buf, &kbuf);
    57  	return 0;
    58  }
    59  
    60  weak_alias(statvfs, statvfs64);
    61  weak_alias(statfs, statfs64);
    62  weak_alias(fstatvfs, fstatvfs64);
    63  weak_alias(fstatfs, fstatfs64);