From a0721b4caa79b81e021678089fde0b8467daa1cd Mon Sep 17 00:00:00 2001 From: Franklin Wei Date: Mon, 2 Mar 2015 21:37:44 -0500 Subject: Virtual filesystem WIP! --- kernel/vfs.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 kernel/vfs.c (limited to 'kernel/vfs.c') diff --git a/kernel/vfs.c b/kernel/vfs.c new file mode 100644 index 0000000..cc6152f --- /dev/null +++ b/kernel/vfs.c @@ -0,0 +1,91 @@ +#include +#include +#include +#include +#include "heap.h" +#include "vfs.h" + +`static struct vfs_node *new_node(void) +{ + struct vfs_node *ret = kmalloc(sizeof(struct vfs_node)); + memset(ret, 0, sizeof(struct vfs_node)); + return ret; +} + +struct vfs_node *vfs_init(void) +{ + struct vfs_node *root = new_node(); + root->flags = VFS_DIR; + root->name = malloc(1); + root->name[0] = '\0'; + + return root; +} + +int vfs_mkdir(struct vfs_node *node, const char *name) +{ + if(!node) + return 0; + if((node->flags & VFS_TYPEMASK) != VFS_DIR) + return 0; + /* insert a new element at the beginning of the linked list of the directory's children */ + struct vfs_node *newdir = new_node(); + newdir->flags = VFS_DIR; + newdir->name = strdup(name); + newdir->parent = node; + newdir->next = node->child; + + node->child = newdir; + return 1; +} + +int vfs_creat(struct vfs_node *node, const char *name) +{ + if(!node) + return 0; + if((node->flags & VFS_TYPEMASK) != VFS_DIR) + return 0; + struct vfs_node *newfile = new_node(); + newfile->flags = VFS_REG; + newfile->name = strdup(name); + newfile->parent = node; + newfile->next = node->child; + + node->child = newfile; + return 1; +} + +DIR *vfs_opendir(struct vfs_node *node) +{ + DIR *dirp = malloc(sizeof(DIR)); + dirp->node = node->child; + return dirp; +} + +struct dirent *vfs_readdir(DIR *dirp) +{ + if(!dirp->node) + return NULL; + static struct dirent ret; + memcpy(ret.d_name, dirp->node->name, MIN(strlen(dirp->node->name)+1, sizeof(ret.d_name))); + switch(dirp->node->flags & VFS_TYPEMASK) + { + case VFS_DIR: + ret.d_type = DT_DIR; + break; + case VFS_REG: + ret.d_type = DT_REG; + break; + /* fall through */ + case VFS_SPEC: + default: + ret.d_type = DT_UNKNOWN; + } + dirp->node = dirp->node->next; + return &ret; +} + +char *vfs_path(struct vfs_node *node) +{ + struct vfs_node * +} -- cgit v1.1