diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-08-26 19:12:56 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-08-26 20:37:48 +0200 |
| commit | 03788775fbebbb3669c115b7653af59194b167d3 (patch) | |
| tree | dbcae06f81056791e612d21bdc7494bdf3eedc95 /kernel/kapi/filesystem.cpp | |
| parent | d999c29c82b77e3e7b4ba23dc0ede76415424856 (diff) | |
| download | kernel-03788775fbebbb3669c115b7653af59194b167d3.tar.xz kernel-03788775fbebbb3669c115b7653af59194b167d3.zip | |
kernel/fs: vfs: make file descriptor polymorphic
Diffstat (limited to 'kernel/kapi/filesystem.cpp')
| -rw-r--r-- | kernel/kapi/filesystem.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/kernel/kapi/filesystem.cpp b/kernel/kapi/filesystem.cpp index 3708c15d..e4b3443a 100644 --- a/kernel/kapi/filesystem.cpp +++ b/kernel/kapi/filesystem.cpp @@ -1,5 +1,7 @@ #include <kapi/filesystem.hpp> +#include <kernel/filesystem/byte_offset_file_descriptor.hpp> +#include <kernel/filesystem/directory_file_descriptor.hpp> #include <kernel/filesystem/open_file_descriptor.hpp> #include <kernel/filesystem/open_file_table.hpp> #include <kernel/filesystem/vfs.hpp> @@ -28,10 +30,17 @@ namespace kapi::filesystem auto open(std::string_view path) -> kstd::result<std::size_t> { - return kernel::filesystem::vfs::get().open(path).and_then([](auto dentry) { - auto open_file_descriptor = kstd::make_shared<kernel::filesystem::open_file_descriptor>(dentry); - return kernel::filesystem::open_file_table::get().add_file(open_file_descriptor); - }); + return kernel::filesystem::vfs::get() + .open(path) + .transform([](auto dentry) -> kstd::shared_ptr<kernel::filesystem::open_file_descriptor> { + if (dentry->inode()->is_directory()) + { + return kstd::make_shared<kernel::filesystem::directory_file_descriptor>(dentry); + } + return kstd::make_shared<kernel::filesystem::byte_offset_file_descriptor>(dentry); + }) + .and_then( + [](auto file_descriptor) { return kernel::filesystem::open_file_table::get().add_file(file_descriptor); }); } auto close(size_t file_descriptor) -> kstd::result<void> |
