summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config/header.mk4
-rw-r--r--config/statx-syscall.c13
-rw-r--r--config/statx.c11
-rw-r--r--src/stat.c4
-rw-r--r--src/stat.h8
5 files changed, 31 insertions, 9 deletions
diff --git a/config/header.mk b/config/header.mk
index 20cb7ae..ec53dfa 100644
--- a/config/header.mk
+++ b/config/header.mk
@@ -17,7 +17,9 @@ HEADERS := \
${GEN}/getprogname.h \
${GEN}/getprogname-gnu.h \
${GEN}/posix-spawn-addfchdir.h \
- ${GEN}/posix-spawn-addfchdir-np.h
+ ${GEN}/posix-spawn-addfchdir-np.h \
+ ${GEN}/statx.h \
+ ${GEN}/statx-syscall.h
${GEN}/config.h: ${HEADERS}
${MSG} "[ GEN] ${TGT}"
diff --git a/config/statx-syscall.c b/config/statx-syscall.c
new file mode 100644
index 0000000..87ec869
--- /dev/null
+++ b/config/statx-syscall.c
@@ -0,0 +1,13 @@
+// Copyright © Tavian Barnes <tavianator@tavianator.com>
+// SPDX-License-Identifier: 0BSD
+
+#include <fcntl.h>
+#include <linux/stat.h>
+#include <sys/syscall.h>
+#include <unistd.h>
+
+int main(void) {
+ struct statx sb;
+ syscall(SYS_statx, AT_FDCWD, ".", 0, STATX_BASIC_STATS, &sb);
+ return 0;
+}
diff --git a/config/statx.c b/config/statx.c
new file mode 100644
index 0000000..65f1674
--- /dev/null
+++ b/config/statx.c
@@ -0,0 +1,11 @@
+// Copyright © Tavian Barnes <tavianator@tavianator.com>
+// SPDX-License-Identifier: 0BSD
+
+#include <fcntl.h>
+#include <sys/stat.h>
+
+int main(void) {
+ struct statx sb;
+ statx(AT_FDCWD, ".", 0, STATX_BASIC_STATS, &sb);
+ return 0;
+}
diff --git a/src/stat.c b/src/stat.c
index eca5bab..e525f24 100644
--- a/src/stat.c
+++ b/src/stat.c
@@ -13,7 +13,7 @@
#include <sys/stat.h>
#include <sys/types.h>
-#if BFS_USE_STATX && !BFS_HAS_LIBC_STATX
+#if BFS_USE_STATX && !BFS_HAS_STATX
# include <linux/stat.h>
# include <sys/syscall.h>
# include <unistd.h>
@@ -137,7 +137,7 @@ static int bfs_stat_impl(int at_fd, const char *at_path, int at_flags, struct bf
* Wrapper for the statx() system call, which had no glibc wrapper prior to 2.28.
*/
static int bfs_statx(int at_fd, const char *at_path, int at_flags, unsigned int mask, struct statx *buf) {
-#if BFS_HAS_LIBC_STATX
+#if BFS_HAS_STATX
int ret = statx(at_fd, at_path, at_flags, mask, buf);
#else
int ret = syscall(SYS_statx, at_fd, at_path, at_flags, mask, buf);
diff --git a/src/stat.h b/src/stat.h
index 1fdd263..8d7144d 100644
--- a/src/stat.h
+++ b/src/stat.h
@@ -17,16 +17,12 @@
#include <sys/types.h>
#include <time.h>
-#if defined(STATX_BASIC_STATS) && (!__ANDROID__ || __ANDROID_API__ >= 30)
-# define BFS_HAS_LIBC_STATX true
-#elif __linux__
+#if !BFS_HAS_STATX && BFS_HAS_STATX_SYSCALL
# include <linux/stat.h>
#endif
#ifndef BFS_USE_STATX
-# ifdef STATX_BASIC_STATS
-# define BFS_USE_STATX true
-# endif
+# define BFS_USE_STATX (BFS_HAS_STATX || BFS_HAS_STATX_SYSCALL)
#endif
#if BFS_USE_SYS_PARAM_H