posix: options: fs: separate file_system_r to its own file
Move the functionality of POSIX_FILE_SYSTEM_R to its own
compilation unit and remove the unnecessary dependency on
POSIX_FILE_SYSTEM.
Signed-off-by: Chris Friedt <cfriedt@tenstorrent.com>
diff --git a/lib/posix/options/file_system_r.c b/lib/posix/options/file_system_r.c
new file mode 100644
index 0000000..1e96776
--- /dev/null
+++ b/lib/posix/options/file_system_r.c
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2024 Tenstorrent AI ULC
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#undef _POSIX_C_SOURCE
+#define _POSIX_C_SOURCE 200809L
+
+#include "fs_priv.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <string.h>
+
+#include <zephyr/fs/fs.h>
+#include <zephyr/posix/posix_features.h>
+#include <zephyr/posix/dirent.h>
+
+int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result)
+{
+ int rc;
+ struct fs_dirent de;
+ struct posix_fs_desc *const ptr = dirp;
+
+ if (result == NULL) {
+ return EINVAL;
+ }
+
+ if (entry == NULL) {
+ *result = NULL;
+ return EINVAL;
+ }
+
+ if (dirp == NULL) {
+ *result = NULL;
+ return EBADF;
+ }
+
+ rc = fs_readdir(&ptr->dir, &de);
+ if (rc < 0) {
+ *result = NULL;
+ return -rc;
+ }
+
+ strncpy(entry->d_name, de.name, MIN(sizeof(entry->d_name), sizeof(de.name)));
+ entry->d_name[sizeof(entry->d_name) - 1] = '\0';
+
+ if (entry->d_name[0] == '\0') {
+ *result = NULL;
+ return 0;
+ }
+
+ *result = entry;
+ return 0;
+}