diff options
| author | Franklin Wei <frankhwei536@gmail.com> | 2015-03-02 21:37:44 -0500 |
|---|---|---|
| committer | Franklin Wei <frankhwei536@gmail.com> | 2015-03-02 21:37:44 -0500 |
| commit | a0721b4caa79b81e021678089fde0b8467daa1cd (patch) | |
| tree | 56af15c29704cc4c6738345ccd6c9db3782fd8d1 /kernel/vfs.c | |
| parent | 46e94578765d3d2f03b83421d752e5dfc3e56d34 (diff) | |
| download | kappa-master.zip kappa-master.tar.gz kappa-master.tar.bz2 kappa-master.tar.xz | |
Diffstat (limited to 'kernel/vfs.c')
| -rw-r--r-- | kernel/vfs.c | 91 |
1 files changed, 91 insertions, 0 deletions
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 <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#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 * +} |