From bdc19f90ef7c404cd7d36d7353296d4d570dbe05 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sun, 7 Aug 2022 13:13:42 -0300 Subject: [PATCH] vfs and tmpfs read --- src/fs/tmpfs.c | 15 ++++++++++++++- src/fs/vfs.c | 34 +++++++++++++++++++++++++++++----- src/include/kernel/vfs.h | 3 +++ 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/fs/tmpfs.c b/src/fs/tmpfs.c index e816793b..fbc2e7f0 100644 --- a/src/fs/tmpfs.c +++ b/src/fs/tmpfs.c @@ -53,6 +53,19 @@ static int tmpfs_write(int* error, vnode_t* node, void* buff, size_t count, size return count; } +static int tmpfs_read(int *error, vnode_t* node, void* buff, size_t count, size_t offset){ + + size_t sizemax = node->st.st_size - offset; + + if(count > sizemax) + count = sizemax; + + memcpy(buff, node->fsdata, count); + + return count; + +} + static int tmpfs_unmount(fs_t* fs) UNIMPLEMENTED static int tmpfs_open(dirnode_t* parent, char* name) UNIMPLEMENTED static int tmpfs_close(vnode_t* node) UNIMPLEMENTED @@ -110,7 +123,7 @@ static int tmpfs_create(dirnode_t* parent, char* name, mode_t mode){ } static fscalls_t funcs = { - tmpfs_mount, tmpfs_unmount, tmpfs_open, tmpfs_close, tmpfs_mkdir, tmpfs_create, tmpfs_write + tmpfs_mount, tmpfs_unmount, tmpfs_open, tmpfs_close, tmpfs_mkdir, tmpfs_create, tmpfs_write, tmpfs_read }; diff --git a/src/fs/vfs.c b/src/fs/vfs.c index fcd61886..337fb4bd 100644 --- a/src/fs/vfs.c +++ b/src/fs/vfs.c @@ -60,11 +60,15 @@ int vfs_write(int* error, vnode_t* node, void* buff, size_t count, size_t offset int type = GETTYPE(node->st.st_mode); - if(type == TYPE_DIR || type == TYPE_LINK) - return EINVAL; - - if(type == TYPE_BLOCKDEV || type == TYPE_CHARDEV) - return ENOSYS; // TODO change this when the device manager is implemented :) + if(type == TYPE_DIR || type == TYPE_LINK){ + *error = EINVAL; + return -1; + } + + if(type == TYPE_BLOCKDEV || type == TYPE_CHARDEV){ + *error = ENOSYS; + return -1; // TODO change this when the device manager is implemented :) + } int writecount = node->fs->calls->write(error, node, buff, count, offset); @@ -72,6 +76,26 @@ int vfs_write(int* error, vnode_t* node, void* buff, size_t count, size_t offset } +int vfs_read(int* error, vnode_t* node, void* buff, size_t count, size_t offset){ + + int type = GETTYPE(node->st.st_mode); + + if(type == TYPE_DIR || type == TYPE_LINK){ + *error = EINVAL; + return -1; + } + + if(type == TYPE_BLOCKDEV || type == TYPE_CHARDEV){ + *error = ENOSYS; + return -1; // TODO change this when the device manager is implemented :) + } + + int readcount = node->fs->calls->read(error, node, buff, count, offset); + + return readcount; + +} + int vfs_close(vnode_t* node){ vfs_releasenode(node); diff --git a/src/include/kernel/vfs.h b/src/include/kernel/vfs.h index 8ee86b4f..191231a8 100644 --- a/src/include/kernel/vfs.h +++ b/src/include/kernel/vfs.h @@ -54,6 +54,8 @@ typedef struct _fscalls_t { int (*create)(dirnode_t* parent, char* name, mode_t mode); // write to a file int (*write)(int* error, vnode_t* node, void* buff, size_t count, size_t offset); + // read from a file + int (*read)(int* error, vnode_t* node, void* buff, size_t count, size_t offset); } fscalls_t; @@ -64,6 +66,7 @@ int vfs_close(vnode_t* node); int vfs_mkdir(dirnode_t* ref, char* path, mode_t mode); int vfs_create(dirnode_t* ref, char* path, mode_t mode); int vfs_write(int* error, vnode_t* node, void* buff, size_t count, size_t offset); +int vfs_read(int* error, vnode_t* node, void* buff, size_t count, size_t offset); void vfs_init(); dirnode_t* vfs_root();