diff --git a/src/kernel/system/ramfs.h b/src/kernel/system/ramfs.h index 7356e07..46b7274 100644 --- a/src/kernel/system/ramfs.h +++ b/src/kernel/system/ramfs.h @@ -3,4 +3,5 @@ void ramfs_init(); vfile_t *ramfs_create(char *path, FS_FILE_FLAGS flags); +//Will never create a new reference vfile_t *get_root_dir(); \ No newline at end of file diff --git a/src/kernel/system/vfs.c b/src/kernel/system/vfs.c index 9db9de3..1d903aa 100644 --- a/src/kernel/system/vfs.c +++ b/src/kernel/system/vfs.c @@ -42,31 +42,45 @@ vfile_t *vfcreate(vfile_t *parent_dir, char *relpath, FS_FILE_FLAGS flags){ new_file = parent_dir->fileops->create(name, flags); } else{ - vfile_t *new_parent = lookup(name, parent_dir); + vfile_t *new_parent = rfopen(name, parent_dir); if(!new_parent){ kfree(name); return 0; } new_file = vfcreate(new_parent, name+name_index+1, flags); + fclose(new_parent); } kfree(name); return new_file; } int fdelete(vfile_t *file_entry){ - return 0; + if(!file_entry || !file_entry->fileops || !file_entry->fileops->delete){ + return 0; + } + return file_entry->fileops->delete(file_entry); } int fwrite(vfile_t *file_entry, void *byte_array, uint32_t offset, uint32_t count){ - return 0; + if(!file_entry || !file_entry->fileops || !file_entry->fileops->write ||!byte_array || count == 0){ + return 0; + } + return file_entry->fileops->write(file_entry, byte_array, offset, count); } int fread(vfile_t *file_entry, void *byte_array, uint32_t offset, uint32_t count){ - return 0; + if(!file_entry || !file_entry->fileops || !file_entry->fileops->read || !byte_array || count == 0){ + return 0; + } + return file_entry->fileops->read(file_entry, byte_array, offset, count); } -vfile_t *lookup(char *name, vfile_t *dir){ - return 0; +//fopen but relative to *dir +vfile_t *rfopen(char *name, vfile_t *dir){ + if(!dir || !name || !dir->fileops || !dir->fileops->rfopen){ + return 0; + } + return dir->fileops->rfopen(name); } int readdir(vfile_t* file, vfile_t* buffer, uint32_t offset, uint32_t count){ @@ -74,6 +88,15 @@ int readdir(vfile_t* file, vfile_t* buffer, uint32_t offset, uint32_t count){ } vfile_t *fopen(char *name){ - + if(!name){ + return 0; + } + vfile_t *root = get_root_dir(); + return root->fileops->open(name + (name[0] == '/')); +} + +vfile_t *fclose(vfile_t *file){ + if(!file || !file->fileops || !file->fileops->close); + file->fileops->close(file); return 0; } \ No newline at end of file diff --git a/src/kernel/system/vfs.h b/src/kernel/system/vfs.h index 35a97ef..1da5e1c 100644 --- a/src/kernel/system/vfs.h +++ b/src/kernel/system/vfs.h @@ -19,8 +19,8 @@ typedef struct fileops{ int (*read)(struct virtual_file *file_entry, void *data, uint32_t offset, uint32_t count); struct virtual_file *(*open)(char *path); void (*close)(struct virtual_file *file); - int (*readdir)(struct virtual_file* file, struct virtual_file *buffer, uint32_t count, uint32_t offset); - // struct virtual_file **(*lookup)(char *name); + // int (*readdir)(struct virtual_file* file, struct virtual_file *buffer, uint32_t count, uint32_t offset); + struct virtual_file *(*rfopen)(char *name); } fileops_t; typedef struct virtual_file{ @@ -37,14 +37,14 @@ typedef struct virtual_file{ }vfile_t; -// vfile_t *lookup(char *name, vfile_t dir); +// vfile_t *rfopen(char *name, vfile_t dir); vfile_t *fcreate(char *path, FS_FILE_FLAGS flags); int fdelete(vfile_t* file_entry); int fwrite(vfile_t *file_entry, void *byte_array, uint32_t offset, uint32_t count); int fread(vfile_t *file_entry, void *byte_array, uint32_t offset, uint32_t count); -int readdir(vfile_t* file, vfile_t *buffer, uint32_t offset, uint32_t count); +// int readdir(vfile_t* file, vfile_t *buffer, uint32_t offset, uint32_t count); vfile_t *vfcreate(vfile_t *parent, char *relpath, FS_FILE_FLAGS flags); -vfile_t *lookup(char *name, vfile_t *dir); +vfile_t *rfopen(char *name, vfile_t *dir); vfile_t *fopen(char *path); \ No newline at end of file