From 3b3ce23df042a8a0e7e56ed3813618efdd95ca08 Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Sat, 26 Apr 2025 19:46:34 +0300 Subject: [PATCH] add seek, read, write --- inc/fs.h | 3 +++ src/cli.c | 6 +++--- src/fs.c | 11 ++++++++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/inc/fs.h b/inc/fs.h index 97e9df9..6abd122 100644 --- a/inc/fs.h +++ b/inc/fs.h @@ -56,6 +56,9 @@ int fs_ls(void *d); int fs_la(void *d); int fs_rm(void *d); int fs_open(void *d); +int fs_seek(void *d); +int fs_read(void *d); +int fs_write(void *d); int fs_close(void *d); int fs_allow_write(void *d); int fs_prohibit_write(void *d); diff --git a/src/cli.c b/src/cli.c index 6afa691..d17fa36 100644 --- a/src/cli.c +++ b/src/cli.c @@ -21,9 +21,9 @@ static const struct CliCommandEntry cmd[] = { {"rm", 1, (enum CliArgType[]) {STR}, fs_rm}, //{"truncate", 2, (enum CliArgType[]) {STR, INT}, fs_truncate}, {"open", 1, (enum CliArgType[]) {STR}, fs_open}, - //{"seek", 2, (enum CliArgType[]) {INT, INT}, fs_seek}, - //{"read", 2, (enum CliArgType[]) {INT, INT}, fs_read}, - //{"write", 2, (enum CliArgType[]) {INT, STR}, fs_write}, + {"seek", 2, (enum CliArgType[]) {INT, INT}, fs_seek}, + {"read", 2, (enum CliArgType[]) {INT, INT}, fs_read}, + {"write", 2, (enum CliArgType[]) {INT, STR}, fs_write}, {"close", 1, (enum CliArgType[]) {INT}, fs_close}, // custom commands diff --git a/src/fs.c b/src/fs.c index d381257..21abef2 100644 --- a/src/fs.c +++ b/src/fs.c @@ -856,7 +856,7 @@ print_read_data: int fs_write(void *d) { int fd = ((int *) d)[0]; - char *str = *((char **) d+4); + char *str = *((char **) ((char *) d+4)); int str_len = strlen(str); if (!fs_file_descriptions[fd].inode) { @@ -890,6 +890,15 @@ int fs_write(void *d) fd, fs_file_descriptions[fd].rw_offset, fs_file_descriptions[fd].rw_offset + str_len); fs_file_descriptions[fd].rw_offset += str_len; + struct fs_inode f; + read_block(fs_file_descriptions[fd].inode, (void *) &f); + + if (fs_file_descriptions[fd].rw_offset > f.size) { + pr("Increasing fd %d file size: %d -> %d\n", fd, f.size, f.size + str_len); + f.size = fs_file_descriptions[fd].rw_offset; + write_block(fs_file_descriptions[fd].inode, (void *) &f); + } + return 0; }