aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/filesystem/ext2/inode.cpp
diff options
context:
space:
mode:
authorMarcel Braun <marcel.braun@ost.ch>2026-05-04 20:17:43 +0200
committerLukas Oesch <lukasoesch20@gmail.com>2026-05-05 14:38:52 +0200
commitd90d6bb4b4820df6cb4b0747439293bb85b8cbec (patch)
tree858857bb8f54166046d32325927cc20054c5e7bb /kernel/src/filesystem/ext2/inode.cpp
parent7ff97f0fe861bb7382f41ecd4bab26cbb62b1f7d (diff)
downloadkernel-d90d6bb4b4820df6cb4b0747439293bb85b8cbec.tar.xz
kernel-d90d6bb4b4820df6cb4b0747439293bb85b8cbec.zip
Implement symlink read in inode, fix max amount of bytes to read
Diffstat (limited to 'kernel/src/filesystem/ext2/inode.cpp')
-rw-r--r--kernel/src/filesystem/ext2/inode.cpp16
1 files changed, 15 insertions, 1 deletions
diff --git a/kernel/src/filesystem/ext2/inode.cpp b/kernel/src/filesystem/ext2/inode.cpp
index 5b6bcb3..1914c70 100644
--- a/kernel/src/filesystem/ext2/inode.cpp
+++ b/kernel/src/filesystem/ext2/inode.cpp
@@ -5,6 +5,8 @@
#include <kapi/system.hpp>
+#include <kstd/cstring>
+
#include <algorithm>
#include <cstddef>
#include <cstdint>
@@ -23,6 +25,17 @@ namespace kernel::filesystem::ext2
auto inode::read(void * buffer, size_t offset, size_t size) const -> size_t
{
+ // TODO BA-FS26 use revision 1 size
+ auto const max_readable = static_cast<size_t>(m_data.size) - offset;
+ auto const requested_size = std::min(size, max_readable);
+
+ if (is_symbolic_link() && m_data.size <= sizeof(m_data.block))
+ {
+ auto inline_target = reinterpret_cast<uint8_t const *>(m_data.block.data());
+ kstd::libc::memcpy(static_cast<uint8_t *>(buffer), inline_target + offset, requested_size);
+ return requested_size;
+ }
+
auto block_index = offset / m_filesystem->get_block_size();
auto in_block_offset = offset % m_filesystem->get_block_size();
@@ -40,7 +53,8 @@ namespace kernel::filesystem::ext2
auto const block_start_offset = block_number * m_filesystem->get_block_size();
auto const read_offset = block_start_offset + in_block_offset;
- auto const bytes_to_read = std::min(size - bytes_read, m_filesystem->get_block_size() - in_block_offset);
+ auto const bytes_to_read =
+ std::min(requested_size - bytes_read, m_filesystem->get_block_size() - in_block_offset);
bytes_read +=
m_filesystem->backing_inode()->read(static_cast<uint8_t *>(buffer) + bytes_read, read_offset, bytes_to_read);