aboutsummaryrefslogtreecommitdiff
path: root/core/fs/readdir.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/fs/readdir.c')
-rw-r--r--core/fs/readdir.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/core/fs/readdir.c b/core/fs/readdir.c
new file mode 100644
index 0000000..546a704
--- /dev/null
+++ b/core/fs/readdir.c
@@ -0,0 +1,58 @@
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/dirent.h>
+#include "fs.h"
+#include "core.h"
+
+/*
+ * Open a directory
+ */
+__export DIR *opendir(const char *path)
+{
+ int rv;
+ struct file *file;
+
+ rv = searchdir(path, O_RDONLY|O_DIRECTORY);
+ if (rv < 0)
+ return NULL;
+
+ file = handle_to_file(rv);
+
+ if (file->inode->mode != DT_DIR) {
+ _close_file(file);
+ return NULL;
+ }
+
+ return (DIR *)file;
+}
+
+/*
+ * Read one directory entry at one time.
+ */
+__export struct dirent *readdir(DIR *dir)
+{
+ static struct dirent buf;
+ struct file *dd_dir = (struct file *)dir;
+ int rv = -1;
+
+ if (dd_dir) {
+ if (dd_dir->fs->fs_ops->readdir) {
+ rv = dd_dir->fs->fs_ops->readdir(dd_dir, &buf);
+ }
+ }
+
+ return rv < 0 ? NULL : &buf;
+}
+
+/*
+ * Close a directory
+ */
+__export int closedir(DIR *dir)
+{
+ struct file *dd_dir = (struct file *)dir;
+ _close_file(dd_dir);
+ return 0;
+}
+
+