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;
+}