From 354ffd033c1c67886a6a1e8efe0dfa55c7d875ad Mon Sep 17 00:00:00 2001 From: apio Date: Sun, 12 Mar 2023 14:49:21 +0100 Subject: [PATCH] VFS: Add a size() method to inodes to implement seeking to the end of a file --- kernel/src/fs/VFS.h | 2 ++ kernel/src/fs/tmpfs/FileSystem.cpp | 5 +++++ kernel/src/fs/tmpfs/FileSystem.h | 7 +++++++ kernel/src/sys/file.cpp | 4 ++-- 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/kernel/src/fs/VFS.h b/kernel/src/fs/VFS.h index c01c2db1..97df0fa8 100644 --- a/kernel/src/fs/VFS.h +++ b/kernel/src/fs/VFS.h @@ -28,6 +28,8 @@ namespace VFS virtual Result truncate(usize size) = 0; + virtual usize size() = 0; + // Generic methods virtual FileSystem& fs() const = 0; diff --git a/kernel/src/fs/tmpfs/FileSystem.cpp b/kernel/src/fs/tmpfs/FileSystem.cpp index ccd8b152..8ba8735d 100644 --- a/kernel/src/fs/tmpfs/FileSystem.cpp +++ b/kernel/src/fs/tmpfs/FileSystem.cpp @@ -129,4 +129,9 @@ namespace TmpFS return {}; } + + usize FileInode::size() + { + return m_data_buffer.size(); + } } diff --git a/kernel/src/fs/tmpfs/FileSystem.h b/kernel/src/fs/tmpfs/FileSystem.h index 0a217486..6c71c6d7 100644 --- a/kernel/src/fs/tmpfs/FileSystem.h +++ b/kernel/src/fs/tmpfs/FileSystem.h @@ -65,6 +65,8 @@ namespace TmpFS Result truncate(usize size) override; + usize size() override; + virtual ~FileInode() = default; private: @@ -110,6 +112,11 @@ namespace TmpFS return err(EISDIR); } + usize size() override + { + return 0; + } + VFS::FileSystem& fs() const override { return *m_fs; diff --git a/kernel/src/sys/file.cpp b/kernel/src/sys/file.cpp index 65c886e9..e95e2932 100644 --- a/kernel/src/sys/file.cpp +++ b/kernel/src/sys/file.cpp @@ -42,7 +42,7 @@ Result sys_write(Registers*, SyscallArgs args) if (!descriptor.is_writable()) return err(EBADF); - if (descriptor.should_append()) todo(); + if (descriptor.should_append()) descriptor.offset = descriptor.inode->size(); usize nwritten = TRY(descriptor.inode->write(buf, descriptor.offset, size)); @@ -67,7 +67,7 @@ Result sys_lseek(Registers*, SyscallArgs args) { case SEEK_SET: new_offset = offset; break; case SEEK_CUR: new_offset = TRY(safe_add((long)descriptor.offset, offset)); break; - case SEEK_END: todo(); + case SEEK_END: new_offset = TRY(safe_add((long)descriptor.inode->size(), offset)); break; default: return err(EINVAL); }