aboutsummaryrefslogtreecommitdiff
path: root/kernel/kapi
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/kapi')
-rw-r--r--kernel/kapi/filesystem.cpp11
-rw-r--r--kernel/kapi/filesystem.tests.cpp32
2 files changed, 16 insertions, 27 deletions
diff --git a/kernel/kapi/filesystem.cpp b/kernel/kapi/filesystem.cpp
index 4880ae38..24a3adf3 100644
--- a/kernel/kapi/filesystem.cpp
+++ b/kernel/kapi/filesystem.cpp
@@ -5,9 +5,11 @@
#include <kernel/filesystem/vfs.hpp>
#include <kstd/memory.hpp>
+#include <kstd/system_error.hpp>
#include <kstd/unikstd.h>
#include <cstddef>
+#include <expected>
#include <string_view>
namespace kapi::filesystem
@@ -30,15 +32,12 @@ namespace kapi::filesystem
return -1;
}
- auto open(std::string_view path) -> kstd::ssize_t
+ auto open(std::string_view path) -> std::expected<std::size_t, kstd::error_code>
{
- if (auto dentry = kernel::filesystem::vfs::get().open(path))
- {
+ return kernel::filesystem::vfs::get().open(path).transform([](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 -1;
+ });
}
auto close(size_t file_descriptor) -> kstd::ssize_t
diff --git a/kernel/kapi/filesystem.tests.cpp b/kernel/kapi/filesystem.tests.cpp
index d241afa8..37d0c20d 100644
--- a/kernel/kapi/filesystem.tests.cpp
+++ b/kernel/kapi/filesystem.tests.cpp
@@ -25,8 +25,7 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_vfs_fixture, "Kap
THEN("files can be opened, read and closed again")
{
- auto fd = kapi::filesystem::open("/information/info_1.txt");
- REQUIRE(fd >= 0);
+ auto fd = kapi::filesystem::open("/information/info_1.txt").value();
auto buffer = std::vector<std::byte>(6);
auto bytes_read = kapi::filesystem::read(fd, buffer.data(), buffer.size());
@@ -40,8 +39,7 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_vfs_fixture, "Kap
THEN("files can be opened through absolute symbolic link, read and closed again")
{
- auto fd = kapi::filesystem::open("/symlinks/information_directory_absolute/info_1.txt");
- REQUIRE(fd >= 0);
+ auto fd = kapi::filesystem::open("/symlinks/information_directory_absolute/info_1.txt").value();
auto buffer = std::vector<std::byte>(6);
auto bytes_read = kapi::filesystem::read(fd, buffer.data(), buffer.size());
@@ -55,8 +53,7 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_vfs_fixture, "Kap
THEN("files can be opened through relative symbolic link, read and closed again")
{
- auto fd = kapi::filesystem::open("/symlinks/information_directory_relative/info_1.txt");
- REQUIRE(fd >= 0);
+ auto fd = kapi::filesystem::open("/symlinks/information_directory_relative/info_1.txt").value();
auto buffer = std::vector<std::byte>(6);
auto bytes_read = kapi::filesystem::read(fd, buffer.data(), buffer.size());
@@ -72,8 +69,7 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_vfs_fixture, "Kap
{
kapi::filesystem::mount("/archiv/2024.img", "/information");
- auto fd = kapi::filesystem::open("/information/symlinks/traverse_back_twice/information/sheep_1.txt");
- REQUIRE(fd >= 0);
+ auto fd = kapi::filesystem::open("/information/symlinks/traverse_back_twice/information/sheep_1.txt").value();
auto buffer = std::vector<std::byte>(7);
auto bytes_read = kapi::filesystem::read(fd, buffer.data(), buffer.size());
@@ -89,8 +85,7 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_vfs_fixture, "Kap
{
REQUIRE(kapi::filesystem::mount("/dev/ram16", "/information") == 0);
- auto fd = kapi::filesystem::open("/information/monkey_house/monkey_1.txt");
- REQUIRE(fd >= 0);
+ auto fd = kapi::filesystem::open("/information/monkey_house/monkey_1.txt").value();
auto buffer = std::vector<std::byte>(8);
auto bytes_read = kapi::filesystem::read(fd, buffer.data(), buffer.size());
@@ -107,8 +102,7 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_vfs_fixture, "Kap
{
REQUIRE(kapi::filesystem::mount("/dev/ram16", "/information") == 0);
- auto fd = kapi::filesystem::open("/information/monkey_house/monkey_1.txt");
- REQUIRE(fd >= 0);
+ auto fd = kapi::filesystem::open("/information/monkey_house/monkey_1.txt").value();
REQUIRE(kapi::filesystem::umount("/information") < 0);
@@ -118,8 +112,7 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_vfs_fixture, "Kap
THEN("device can be opened as file and read from")
{
- auto fd = kapi::filesystem::open("/dev/ram0");
- REQUIRE(fd >= 0);
+ auto fd = kapi::filesystem::open("/dev/ram0").value();
auto buffer = std::vector<std::byte>(512);
auto bytes_read = kapi::filesystem::read(fd, buffer.data(), buffer.size());
@@ -130,15 +123,13 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_vfs_fixture, "Kap
THEN("device can be opened as file and written to and read from again")
{
- auto read_fd = kapi::filesystem::open("/dev/ram16");
- REQUIRE(read_fd >= 0);
+ auto read_fd = kapi::filesystem::open("/dev/ram16").value();
auto buffer = std::vector<std::byte>(512, std::byte{0xAB});
auto bytes_written = kapi::filesystem::write(read_fd, buffer.data(), buffer.size());
REQUIRE(bytes_written >= 0);
- auto write_fd = kapi::filesystem::open("/dev/ram16");
- REQUIRE(write_fd >= 0);
+ auto write_fd = kapi::filesystem::open("/dev/ram16").value();
auto read_buffer = std::vector<std::byte>(512);
auto bytes_read = kapi::filesystem::read(write_fd, read_buffer.data(), read_buffer.size());
@@ -163,7 +154,7 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_vfs_fixture, "Kap
THEN("non existent files cannot be opened")
{
auto fd = kapi::filesystem::open("/information/non_existent.txt");
- REQUIRE(fd < 0);
+ REQUIRE(!fd);
}
THEN("not opened files cannot closed")
@@ -173,8 +164,7 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_vfs_fixture, "Kap
THEN("same file cannot be closed twice")
{
- auto fd = kapi::filesystem::open("/information/info_1.txt");
- REQUIRE(fd >= 0);
+ auto fd = kapi::filesystem::open("/information/info_1.txt").value();
REQUIRE(kapi::filesystem::close(fd) == 0);
REQUIRE(kapi::filesystem::close(fd) < 0);