aboutsummaryrefslogtreecommitdiff
path: root/kernel/kapi/filesystem.cpp
blob: 7a0c2728db3b1393b99142ae982fb664084ebf64 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <kapi/filesystem.hpp>

#include <kernel/vfs.hpp>

#include <kstd/memory.hpp>
#include <kstd/result.hpp>
#include <kstd/system_error.hpp>
#include <kstd/units.hpp>

#include <cstddef>
#include <cstdint>
#include <expected>
#include <span>
#include <string_view>
#include <utility>

namespace kapi::filesystem
{
  auto mount(std::string_view source, std::string_view target) -> kstd::result<void>
  {
    return kernel::vfs::vfs::get().mount(source, target);
  }

  auto umount(std::string_view target) -> kstd::result<void>
  {
    return kernel::vfs::vfs::get().unmount(target);
  }

  auto open(std::string_view path) -> kstd::result<std::size_t>
  {
    return kernel::vfs::vfs::get()
        .open(path)
        .transform([](auto dentry) -> kstd::shared_ptr<kernel::vfs::open_file_descriptor> {
          if (dentry->inode()->is_directory())
          {
            return kstd::make_shared<kernel::vfs::directory_file_descriptor>(dentry);
          }
          return kstd::make_shared<kernel::vfs::byte_offset_file_descriptor>(dentry);
        })
        .and_then([](auto file_descriptor) { return kernel::vfs::open_file_table::get().add_file(file_descriptor); });
  }

  auto close(size_t file_descriptor) -> kstd::result<void>
  {
    return kernel::vfs::open_file_table::get()
        .file(file_descriptor)
        .transform([](auto file) { return file->get_dentry()->absolute_path(); })
        .and_then([](auto path) { return kernel::vfs::vfs::get().close(path); })
        .and_then([=]() { return kernel::vfs::open_file_table::get().remove_file(file_descriptor); });
  }

  auto read(size_t file_descriptor, std::span<std::byte> buffer) -> kstd::result<kstd::bytes>
  {
    return kernel::vfs::open_file_table::get().file(file_descriptor).and_then([=](auto descriptor) {
      return descriptor->read(buffer);
    });
  }

  auto write(size_t file_descriptor, std::span<std::byte const> buffer) -> kstd::result<kstd::bytes>
  {
    return kernel::vfs::open_file_table::get().file(file_descriptor).and_then([=](auto descriptor) {
      return descriptor->write(buffer);
    });
  }

  auto seek(size_t file_descriptor, kstd::offset offset, seek_origin origin) -> kstd::result<kstd::bytes>
  {
    return kernel::vfs::open_file_table::get().file(file_descriptor).and_then([=](auto file) {
      return file->seek(offset, origin);
    });
  }

  auto mkdir(std::string_view path) -> kstd::result<void>
  {
    return kernel::vfs::vfs::get().mkdir(path);
  }

  auto create(std::string_view path) -> kstd::result<void>
  {
    return kernel::vfs::vfs::get().create(path);
  }

  auto status(std::string_view path) -> kstd::result<file_status>
  {
    return kernel::vfs::vfs::get().status(path);
  }

  auto create_device_node(std::string_view path, file_type type, device_number number) -> kstd::result<void>
  {
    return kernel::vfs::vfs::get().create_device_node(path, static_cast<std::uint32_t>(type), number);
  }

  auto read_directory(std::size_t file_descriptor, directory_cursor position, std::span<directory_entry> buffer)
      -> kstd::result<std::pair<std::size_t, directory_cursor>>
  {
    static_cast<void>(file_descriptor);
    static_cast<void>(position);
    static_cast<void>(buffer);
    return kstd::failure(make_error_code(kstd::errc::not_supported));
  }

}  // namespace kapi::filesystem