2023-02-20 01:46:00 +02:00
|
|
|
#pragma once
|
|
|
|
|
2023-04-10 21:03:41 +03:00
|
|
|
#include <BAN/RefPtr.h>
|
2023-03-19 05:51:25 +02:00
|
|
|
#include <BAN/String.h>
|
2023-03-30 22:39:45 +03:00
|
|
|
#include <BAN/StringView.h>
|
2023-03-19 05:51:25 +02:00
|
|
|
#include <BAN/Vector.h>
|
2023-02-20 01:46:00 +02:00
|
|
|
|
2023-03-23 22:26:06 +02:00
|
|
|
#include <sys/types.h>
|
2023-03-26 04:30:57 +03:00
|
|
|
#include <time.h>
|
2023-03-23 22:26:06 +02:00
|
|
|
|
2023-02-20 01:46:00 +02:00
|
|
|
namespace Kernel
|
|
|
|
{
|
|
|
|
|
2023-03-08 03:21:30 +02:00
|
|
|
class Inode : public BAN::RefCounted<Inode>
|
2023-02-20 01:46:00 +02:00
|
|
|
{
|
|
|
|
public:
|
2023-03-30 14:41:15 +03:00
|
|
|
struct Mode
|
2023-02-20 21:39:24 +02:00
|
|
|
{
|
2023-03-30 14:41:15 +03:00
|
|
|
enum Mask : mode_t
|
|
|
|
{
|
|
|
|
IXOTH = 0x0001,
|
|
|
|
IWOTH = 0x0002,
|
|
|
|
IROTH = 0x0004,
|
|
|
|
IXGRP = 0x0008,
|
|
|
|
IWGRP = 0x0010,
|
|
|
|
IRGRP = 0x0020,
|
|
|
|
IXUSR = 0x0040,
|
|
|
|
IWUSR = 0x0080,
|
|
|
|
IRUSR = 0x0100,
|
|
|
|
ISVTX = 0x0200,
|
|
|
|
ISGID = 0x0400,
|
|
|
|
ISUID = 0x0800,
|
|
|
|
IFIFO = 0x1000,
|
|
|
|
IFCHR = 0x2000,
|
|
|
|
IFDIR = 0x4000,
|
|
|
|
IFBLK = 0x6000,
|
|
|
|
IFREG = 0x8000,
|
|
|
|
IFLNK = 0xA000,
|
|
|
|
IFSOCK = 0xC000,
|
|
|
|
TYPE_MASK = 0xF000,
|
|
|
|
};
|
|
|
|
|
|
|
|
bool ifchr() const { return (mode & Mask::TYPE_MASK) == Mask::IFCHR; }
|
|
|
|
bool ifdir() const { return (mode & Mask::TYPE_MASK) == Mask::IFDIR; }
|
|
|
|
bool ifblk() const { return (mode & Mask::TYPE_MASK) == Mask::IFBLK; }
|
|
|
|
bool ifreg() const { return (mode & Mask::TYPE_MASK) == Mask::IFREG; }
|
|
|
|
bool iflnk() const { return (mode & Mask::TYPE_MASK) == Mask::IFLNK; }
|
|
|
|
bool ifsock() const { return (mode & Mask::TYPE_MASK) == Mask::IFSOCK; }
|
|
|
|
mode_t mode;
|
2023-02-20 21:39:24 +02:00
|
|
|
};
|
|
|
|
|
2023-03-30 15:06:41 +03:00
|
|
|
enum class InodeType
|
|
|
|
{
|
|
|
|
Device,
|
|
|
|
Ext2,
|
|
|
|
};
|
|
|
|
|
2023-02-20 21:39:24 +02:00
|
|
|
public:
|
2023-03-17 21:16:22 +02:00
|
|
|
virtual ~Inode() {}
|
|
|
|
|
2023-03-29 21:34:48 +03:00
|
|
|
bool operator==(const Inode& other) const { return dev() == other.dev() && rdev() == other.rdev() && ino() == other.ino(); }
|
|
|
|
|
2023-03-26 04:30:57 +03:00
|
|
|
virtual ino_t ino() const = 0;
|
2023-03-30 14:41:15 +03:00
|
|
|
virtual Mode mode() const = 0;
|
2023-03-26 04:30:57 +03:00
|
|
|
virtual nlink_t nlink() const = 0;
|
2023-03-23 22:26:06 +02:00
|
|
|
virtual uid_t uid() const = 0;
|
|
|
|
virtual gid_t gid() const = 0;
|
2023-03-26 04:30:57 +03:00
|
|
|
virtual off_t size() const = 0;
|
2023-03-29 21:34:48 +03:00
|
|
|
virtual timespec atime() const = 0;
|
2023-03-26 04:30:57 +03:00
|
|
|
virtual timespec mtime() const = 0;
|
|
|
|
virtual timespec ctime() const = 0;
|
|
|
|
virtual blksize_t blksize() const = 0;
|
|
|
|
virtual blkcnt_t blocks() const = 0;
|
2023-03-29 21:34:48 +03:00
|
|
|
virtual dev_t dev() const = 0;
|
|
|
|
virtual dev_t rdev() const = 0;
|
2023-02-20 21:39:24 +02:00
|
|
|
|
2023-03-30 15:06:41 +03:00
|
|
|
virtual InodeType inode_type() const = 0;
|
|
|
|
|
2023-02-20 01:46:00 +02:00
|
|
|
virtual BAN::StringView name() const = 0;
|
|
|
|
|
2023-06-01 00:24:45 +03:00
|
|
|
virtual BAN::ErrorOr<BAN::String> link_target() { ASSERT_NOT_REACHED(); }
|
|
|
|
|
2023-03-30 14:41:15 +03:00
|
|
|
virtual BAN::ErrorOr<BAN::RefPtr<Inode>> read_directory_inode(BAN::StringView) { if (!mode().ifdir()) return BAN::Error::from_errno(ENOTDIR); ASSERT_NOT_REACHED(); }
|
|
|
|
virtual BAN::ErrorOr<BAN::Vector<BAN::String>> read_directory_entries(size_t) { if (!mode().ifdir()) return BAN::Error::from_errno(ENOTDIR); ASSERT_NOT_REACHED(); }
|
2023-03-19 05:51:25 +02:00
|
|
|
|
2023-04-05 00:56:09 +03:00
|
|
|
virtual BAN::ErrorOr<size_t> read(size_t, void*, size_t) { if (mode().ifdir()) return BAN::Error::from_errno(EISDIR); ASSERT_NOT_REACHED(); }
|
|
|
|
virtual BAN::ErrorOr<size_t> write(size_t, const void*, size_t) { if (mode().ifdir()) return BAN::Error::from_errno(EISDIR); ASSERT_NOT_REACHED(); }
|
2023-04-03 20:28:20 +03:00
|
|
|
|
2023-03-30 14:41:15 +03:00
|
|
|
virtual BAN::ErrorOr<void> create_file(BAN::StringView, mode_t) { if (!mode().ifdir()) return BAN::Error::from_errno(ENOTDIR); ASSERT_NOT_REACHED(); }
|
2023-02-20 01:46:00 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|