SimpleKernel 1.17.0
Loading...
Searching...
No Matches
vfs_types.hpp
Go to the documentation of this file.
1
5#pragma once
6
7#include <cstddef>
8#include <cstdint>
9
10#include "expected.hpp"
11
12namespace vfs {
13
14// Forward declarations
15struct Inode;
16struct Dentry;
17struct File;
18struct FileSystem;
19class MountTable;
20
22enum class FileType : uint8_t {
23 kUnknown = 0,
25 kRegular = 1,
27 kDirectory = 2,
29 kCharDevice = 3,
31 kBlockDevice = 4,
33 kSymlink = 5,
35 kFifo = 6,
36};
37
39enum class OpenFlags : uint32_t {
40 kOReadOnly = 0x0000,
41 kOWriteOnly = 0x0001,
42 kOReadWrite = 0x0002,
43 kOCreate = 0x0040,
44 kOTruncate = 0x0200,
45 kOAppend = 0x0400,
47 kODirectory = 0x010000,
48};
49
51[[nodiscard]] inline constexpr auto operator|(OpenFlags lhs, OpenFlags rhs)
52 -> OpenFlags {
53 return static_cast<OpenFlags>(static_cast<uint32_t>(lhs) |
54 static_cast<uint32_t>(rhs));
55}
56
58[[nodiscard]] inline constexpr auto operator&(OpenFlags lhs, OpenFlags rhs)
59 -> OpenFlags {
60 return static_cast<OpenFlags>(static_cast<uint32_t>(lhs) &
61 static_cast<uint32_t>(rhs));
62}
63
65[[nodiscard]] inline constexpr auto operator~(OpenFlags flags) -> OpenFlags {
66 return static_cast<OpenFlags>(~static_cast<uint32_t>(flags));
67}
68
70inline constexpr auto operator|=(OpenFlags& lhs, OpenFlags rhs) -> OpenFlags& {
71 lhs = lhs | rhs;
72 return lhs;
73}
74
76inline constexpr auto operator&=(OpenFlags& lhs, OpenFlags rhs) -> OpenFlags& {
77 lhs = lhs & rhs;
78 return lhs;
79}
80
82[[nodiscard]] inline constexpr auto operator==(OpenFlags flags, uint32_t val)
83 -> bool {
84 return static_cast<uint32_t>(flags) == val;
85}
86
88[[nodiscard]] inline constexpr auto operator!=(OpenFlags flags, uint32_t val)
89 -> bool {
90 return static_cast<uint32_t>(flags) != val;
91}
92
94enum class SeekWhence : int {
96 kSet = 0,
98 kCur = 1,
100 kEnd = 2,
101};
102
104class InodeOps {
105 public:
114 virtual auto Lookup(Inode* dir, const char* name) -> Expected<Inode*> = 0;
115
126 virtual auto Create(Inode* dir, const char* name, FileType type)
127 -> Expected<Inode*> = 0;
128
137 virtual auto Unlink(Inode* dir, const char* name) -> Expected<void> = 0;
138
148 virtual auto Mkdir(Inode* dir, const char* name) -> Expected<Inode*> = 0;
149
158 virtual auto Rmdir(Inode* dir, const char* name) -> Expected<void> = 0;
159
162 InodeOps() = default;
163 InodeOps(const InodeOps&) = delete;
164 InodeOps(InodeOps&&) = delete;
165 auto operator=(const InodeOps&) -> InodeOps& = delete;
166 auto operator=(InodeOps&&) -> InodeOps& = delete;
167 virtual ~InodeOps() = default;
169};
171struct DirEntry {
173 uint64_t ino{0};
175 uint8_t type{0};
177 char name[256]{};
178};
179
181class FileOps {
182 public:
192 virtual auto Read(File* file, void* buf, size_t count)
193 -> Expected<size_t> = 0;
194
204 virtual auto Write(File* file, const void* buf, size_t count)
205 -> Expected<size_t> = 0;
206
215 virtual auto Seek(File* file, int64_t offset, SeekWhence whence)
216 -> Expected<uint64_t> = 0;
217
225 virtual auto Close(File* file) -> Expected<void> = 0;
226
236 virtual auto ReadDir(File* file, DirEntry* dirent, size_t count)
237 -> Expected<size_t> = 0;
238
241 FileOps() = default;
242 FileOps(const FileOps&) = delete;
243 FileOps(FileOps&&) = delete;
244 auto operator=(const FileOps&) -> FileOps& = delete;
245 auto operator=(FileOps&&) -> FileOps& = delete;
246 virtual ~FileOps() = default;
248};
249
250} // namespace vfs
File 操作接口
virtual auto Read(File *file, void *buf, size_t count) -> Expected< size_t >=0
从文件读取数据
auto operator=(const FileOps &) -> FileOps &=delete
FileOps()=default
virtual auto Seek(File *file, int64_t offset, SeekWhence whence) -> Expected< uint64_t >=0
调整文件偏移量
virtual ~FileOps()=default
virtual auto ReadDir(File *file, DirEntry *dirent, size_t count) -> Expected< size_t >=0
读取目录项
virtual auto Close(File *file) -> Expected< void >=0
关闭文件
FileOps(const FileOps &)=delete
auto operator=(FileOps &&) -> FileOps &=delete
FileOps(FileOps &&)=delete
virtual auto Write(File *file, const void *buf, size_t count) -> Expected< size_t >=0
向文件写入数据
Inode 操作接口
auto operator=(InodeOps &&) -> InodeOps &=delete
virtual auto Unlink(Inode *dir, const char *name) -> Expected< void >=0
删除文件(解除链接)
InodeOps()=default
InodeOps(const InodeOps &)=delete
virtual auto Create(Inode *dir, const char *name, FileType type) -> Expected< Inode * >=0
在目录中创建新文件
auto operator=(const InodeOps &) -> InodeOps &=delete
InodeOps(InodeOps &&)=delete
virtual ~InodeOps()=default
virtual auto Rmdir(Inode *dir, const char *name) -> Expected< void >=0
删除目录
virtual auto Mkdir(Inode *dir, const char *name) -> Expected< Inode * >=0
创建目录
virtual auto Lookup(Inode *dir, const char *name) -> Expected< Inode * >=0
在目录中查找指定名称的 inode
std::expected< T, Error > Expected
std::expected 别名模板
Definition expected.hpp:365
OpenFlags
文件打开标志(兼容 Linux O_* 定义)
Definition vfs_types.hpp:39
@ kODirectory
必须是目录
FileType
文件类型
Definition vfs_types.hpp:22
@ kBlockDevice
块设备
@ kCharDevice
字符设备
@ kRegular
普通文件
@ kDirectory
目录
@ kFifo
命名管道
@ kSymlink
符号链接
constexpr auto operator|=(OpenFlags &lhs, OpenFlags rhs) -> OpenFlags &
按位或赋值
Definition vfs_types.hpp:70
constexpr auto operator==(OpenFlags flags, uint32_t val) -> bool
检查 OpenFlags 是否为零(无标志位设置)
Definition vfs_types.hpp:82
constexpr auto operator&(OpenFlags lhs, OpenFlags rhs) -> OpenFlags
按位与
Definition vfs_types.hpp:58
constexpr auto operator!=(OpenFlags flags, uint32_t val) -> bool
检查 OpenFlags 是否不为零
Definition vfs_types.hpp:88
SeekWhence
文件 seek 基准
Definition vfs_types.hpp:94
@ kSet
从文件开头
@ kCur
从当前位置
@ kEnd
从文件末尾
constexpr auto operator&=(OpenFlags &lhs, OpenFlags rhs) -> OpenFlags &
按位与赋值
Definition vfs_types.hpp:76
constexpr auto operator~(OpenFlags flags) -> OpenFlags
按位取反
Definition vfs_types.hpp:65
constexpr auto operator|(OpenFlags lhs, OpenFlags rhs) -> OpenFlags
按位或
Definition vfs_types.hpp:51
目录项结构(用于 readdir)
uint64_t ino
inode 编号
char name[256]
文件名
uint8_t type
文件类型
File — 打开的文件实例(每次 open 产生一个)
Definition vfs.hpp:65
Inode — 文件元数据(独立于路径名)
Definition vfs.hpp:16