aboutsummaryrefslogtreecommitdiff
path: root/kernel/kapi
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/kapi')
-rw-r--r--kernel/kapi/filesystem.cpp17
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>