[libc-commits] [libc] [libc] Implement fstatat in sys/stat (PR #224334)

Aman Maurya via libc-commits libc-commits at lists.llvm.org
Thu Sep 17 23:50:22 PDT 2026


================
@@ -0,0 +1,92 @@
+//===-- Unittests for fstatat ---------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "hdr/fcntl_macros.h"
+#include "hdr/sys_stat_macros.h"
+#include "hdr/types/struct_stat.h"
+#include "src/fcntl/open.h"
+#include "src/sys/stat/fstatat.h"
+#include "src/unistd/close.h"
+#include "src/unistd/unlink.h"
+#include "test/UnitTest/ErrnoCheckingTest.h"
+#include "test/UnitTest/ErrnoSetterMatcher.h"
+#include "test/UnitTest/Test.h"
+
+using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;
+using LlvmLibcFstatatTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;
+
+TEST_F(LlvmLibcFstatatTest, StatWithAtFdcwd) {
+  constexpr const char *TEST_FILE = "testdata/fstatat.test";
+
+  int fd = LIBC_NAMESPACE::open(TEST_FILE, O_CREAT | O_WRONLY, S_IRWXU);
+  ASSERT_GT(fd, 0);
+  ASSERT_ERRNO_SUCCESS();
+  ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds(0));
+
+  struct stat statbuf;
+  ASSERT_THAT(LIBC_NAMESPACE::fstatat(AT_FDCWD, TEST_FILE, &statbuf, 0),
+              Succeeds(0));
+
+  ASSERT_EQ(int(statbuf.st_mode), int(S_IRWXU | S_IFREG));
+
+  ASSERT_THAT(LIBC_NAMESPACE::unlink(TEST_FILE), Succeeds(0));
+}
+
+TEST_F(LlvmLibcFstatatTest, StatWithDirFd) {
+  constexpr const char *TEST_DIR = "testdata";
+  constexpr const char *TEST_FILE = "testdata/fstatat_dir.test";
+  constexpr const char *TEST_FILE_BASENAME = "fstatat_dir.test";
+
+  int fd = LIBC_NAMESPACE::open(TEST_FILE, O_CREAT | O_WRONLY, S_IRWXU);
+  ASSERT_GT(fd, 0);
+  ASSERT_ERRNO_SUCCESS();
+  ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds(0));
+
+  int dirfd = LIBC_NAMESPACE::open(TEST_DIR, O_DIRECTORY);
+  ASSERT_GT(dirfd, 0);
+  ASSERT_ERRNO_SUCCESS();
+
+  struct stat statbuf;
+  ASSERT_THAT(LIBC_NAMESPACE::fstatat(dirfd, TEST_FILE_BASENAME, &statbuf, 0),
+              Succeeds(0));
+
+  ASSERT_EQ(int(statbuf.st_mode), int(S_IRWXU | S_IFREG));
+
+  ASSERT_THAT(LIBC_NAMESPACE::close(dirfd), Succeeds(0));
+  ASSERT_THAT(LIBC_NAMESPACE::unlink(TEST_FILE), Succeeds(0));
----------------
amanmaurya92 wrote:

ohh, got it.

https://github.com/llvm/llvm-project/pull/224334


More information about the libc-commits mailing list