Add a libc wrapper for statx(2).

Bug: http://b/127675384
Bug: http://b/146676114
Test: treehugger
Change-Id: I844edc12f62717e579870a040cf03dfe60dc280b
diff --git a/tests/sys_stat_test.cpp b/tests/sys_stat_test.cpp
index 97bf580..71591c0 100644
--- a/tests/sys_stat_test.cpp
+++ b/tests/sys_stat_test.cpp
@@ -22,6 +22,14 @@
 #include <android-base/file.h>
 #include <gtest/gtest.h>
 
+#if defined(__BIONIC__)
+#define HAVE_STATX
+#elif defined(__GLIBC_PREREQ)
+#if __GLIBC_PREREQ(2, 28)
+#define HAVE_STATX
+#endif
+#endif
+
 TEST(sys_stat, futimens) {
   FILE* fp = tmpfile();
   ASSERT_TRUE(fp != nullptr);
@@ -95,6 +103,24 @@
   close(fd);
 }
 
+TEST(sys_stat, statx) {
+#if defined(HAVE_STATX)
+  struct statx sx;
+  int rc = statx(AT_FDCWD, "/proc/version", AT_STATX_SYNC_AS_STAT, STATX_ALL, &sx);
+  if (rc == -1 && errno == ENOSYS) {
+    GTEST_SKIP() << "statx returned ENOSYS";
+    return;
+  }
+  ASSERT_EQ(0, rc);
+  struct stat64 sb;
+  ASSERT_EQ(0, stat64("/proc/version", &sb));
+  EXPECT_EQ(sb.st_ino, sx.stx_ino);
+  EXPECT_EQ(sb.st_mode, sx.stx_mode);
+#else
+  GTEST_SKIP() << "statx not available";
+#endif
+}
+
 TEST(sys_stat, fchmodat_EFAULT_file) {
   ASSERT_EQ(-1, fchmodat(AT_FDCWD, (char *) 0x1, 0751, 0));
   ASSERT_EQ(EFAULT, errno);