From 17da9c855a49925333433b4308c1b3384c65c50a Mon Sep 17 00:00:00 2001
From: Tavian Barnes <tavianator@tavianator.com>
Date: Fri, 19 Apr 2024 14:23:16 -0400
Subject: config: Check for fdclosedir()

---
 config/fdclosedir.c | 8 ++++++++
 config/header.mk    | 1 +
 src/dir.c           | 2 +-
 src/dir.h           | 2 +-
 4 files changed, 11 insertions(+), 2 deletions(-)
 create mode 100644 config/fdclosedir.c

diff --git a/config/fdclosedir.c b/config/fdclosedir.c
new file mode 100644
index 0000000..f4ad1f5
--- /dev/null
+++ b/config/fdclosedir.c
@@ -0,0 +1,8 @@
+// Copyright © Tavian Barnes <tavianator@tavianator.com>
+// SPDX-License-Identifier: 0BSD
+
+#include <dirent.h>
+
+int main(void) {
+	return fdclosedir(opendir("."));
+}
diff --git a/config/header.mk b/config/header.mk
index 36ad98e..04fbdec 100644
--- a/config/header.mk
+++ b/config/header.mk
@@ -11,6 +11,7 @@ include config/exports.mk
 HEADERS := \
     ${GEN}/acl-is-trivial-np.h \
     ${GEN}/confstr.h \
+    ${GEN}/fdclosedir.h \
     ${GEN}/getdents.h \
     ${GEN}/getdents64.h \
     ${GEN}/getdents64-syscall.h \
diff --git a/src/dir.c b/src/dir.c
index 8b1bee0..cfbbca4 100644
--- a/src/dir.c
+++ b/src/dir.c
@@ -353,7 +353,7 @@ int bfs_closedir(struct bfs_dir *dir) {
 int bfs_unwrapdir(struct bfs_dir *dir) {
 #if BFS_USE_GETDENTS
 	int ret = dir->fd;
-#elif __FreeBSD__
+#elif BFS_HAS_FDCLOSEDIR
 	int ret = fdclosedir(dir->dir);
 #endif
 
diff --git a/src/dir.h b/src/dir.h
index 19dfa98..bc6c4ed 100644
--- a/src/dir.h
+++ b/src/dir.h
@@ -152,7 +152,7 @@ int bfs_closedir(struct bfs_dir *dir);
  * Whether the bfs_unwrapdir() function is supported.
  */
 #ifndef BFS_USE_UNWRAPDIR
-#  define BFS_USE_UNWRAPDIR (BFS_USE_GETDENTS || __FreeBSD__)
+#  define BFS_USE_UNWRAPDIR (BFS_USE_GETDENTS || BFS_HAS_FDCLOSEDIR)
 #endif
 
 #if BFS_USE_UNWRAPDIR
-- 
cgit v1.2.3