• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "llvm-libc-macros/linux/fcntl-macros.h"
2 #include "src/fcntl/open.h"
3 #include "src/sys/statvfs/fstatvfs.h"
4 #include "src/sys/statvfs/linux/statfs_utils.h"
5 #include "src/unistd/close.h"
6 #include "test/UnitTest/ErrnoSetterMatcher.h"
7 #include "test/UnitTest/LibcTest.h"
8 #include <linux/magic.h>
9 using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;
10 
11 namespace LIBC_NAMESPACE {
fstatfs(int fd,struct statfs * buf)12 static int fstatfs(int fd, struct statfs *buf) {
13   using namespace statfs_utils;
14   if (cpp::optional<LinuxStatFs> result = linux_fstatfs(fd)) {
15     *buf = *result;
16     return 0;
17   }
18   return -1;
19 }
20 } // namespace LIBC_NAMESPACE
21 
22 struct PathFD {
23   int fd;
PathFDPathFD24   explicit PathFD(const char *path)
25       : fd(LIBC_NAMESPACE::open(path, O_CLOEXEC | O_PATH)) {}
~PathFDPathFD26   ~PathFD() { LIBC_NAMESPACE::close(fd); }
operator intPathFD27   operator int() const { return fd; }
28 };
29 
TEST(LlvmLibcSysStatvfsTest,FstatfsBasic)30 TEST(LlvmLibcSysStatvfsTest, FstatfsBasic) {
31   struct statfs buf;
32   ASSERT_THAT(LIBC_NAMESPACE::fstatfs(PathFD("/"), &buf), Succeeds());
33   ASSERT_THAT(LIBC_NAMESPACE::fstatfs(PathFD("/proc"), &buf), Succeeds());
34   ASSERT_EQ(buf.f_type, static_cast<decltype(buf.f_type)>(PROC_SUPER_MAGIC));
35   ASSERT_THAT(LIBC_NAMESPACE::fstatfs(PathFD("/sys"), &buf), Succeeds());
36   ASSERT_EQ(buf.f_type, static_cast<decltype(buf.f_type)>(SYSFS_MAGIC));
37 }
38 
TEST(LlvmLibcSysStatvfsTest,FstatvfsInvalidFD)39 TEST(LlvmLibcSysStatvfsTest, FstatvfsInvalidFD) {
40   struct statvfs buf;
41   ASSERT_THAT(LIBC_NAMESPACE::fstatvfs(-1, &buf), Fails(EBADF));
42 }
43