summaryrefslogtreecommitdiff
path: root/core/dir.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/dir.c')
-rw-r--r--core/dir.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/core/dir.c b/core/dir.c
new file mode 100644
index 00000000..4013280a
--- /dev/null
+++ b/core/dir.c
@@ -0,0 +1,45 @@
+#include <stdio.h>
+#include <string.h>
+#include <sys/dirent.h>
+#include "fs.h"
+#include "core.h"
+
+/*
+ * open dir, return the file structure pointer in _eax_, or NULL if failed
+ */
+void opendir(com32sys_t *regs)
+{
+ char *src = MK_PTR(regs->es, regs->esi.w[0]);
+ char *dst = MK_PTR(regs->ds, regs->edi.w[0]);
+ strcpy(dst, src);
+ searchdir(regs);
+ regs->eax.l = (uint32_t)handle_to_file(regs->esi.w[0]);
+}
+
+/*
+ * Read one dirent at one time.
+ *
+ * @input: _esi_ register stores the address of DIR structure
+ * @output: _eax_ register stores the address of newly read dirent structure
+ */
+void readdir(com32sys_t *regs)
+{
+ DIR *dir = (DIR *)regs->esi.l;
+ struct dirent *de = NULL;
+
+ if (dir->dd_dir)
+ de = this_fs->fs_ops->readdir(dir->dd_dir);
+ else
+ de = NULL;
+
+ /* Return the newly read de in _eax_ register */
+ regs->eax.l = (uint32_t)de;
+}
+
+void closedir(com32sys_t *regs)
+{
+ DIR *dir = (DIR *)regs->esi.l;
+ _close_file(dir->dd_dir);
+}
+
+