2023-06-21 21:32:28 +02:00
|
|
|
#pragma once
|
|
|
|
#include "fs/ext2/FileSystem.h"
|
2023-06-24 22:21:22 +02:00
|
|
|
#include <luna/Buffer.h>
|
2023-06-22 20:10:09 +02:00
|
|
|
#include <luna/String.h>
|
2023-06-21 21:32:28 +02:00
|
|
|
|
|
|
|
#define EXT2_FIFO 0x1000
|
|
|
|
#define EXT2_CHR 0x2000
|
|
|
|
#define EXT2_DIR 0x4000
|
|
|
|
#define EXT2_BLK 0x6000
|
|
|
|
#define EXT2_REG 0x8000
|
|
|
|
#define EXT2_LNK 0xA000
|
|
|
|
#define EXT2_SOCK 0xC000
|
|
|
|
|
|
|
|
namespace Ext2
|
|
|
|
{
|
2023-06-22 19:41:35 +02:00
|
|
|
class Inode : public VFS::Inode
|
2023-06-21 21:32:28 +02:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
VFS::InodeType type() const override
|
|
|
|
{
|
|
|
|
return m_type;
|
|
|
|
}
|
|
|
|
|
|
|
|
VFS::FileSystem* fs() const override
|
|
|
|
{
|
|
|
|
return m_fs;
|
|
|
|
}
|
|
|
|
|
|
|
|
void did_link() override
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void did_unlink() override
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2023-08-02 22:18:36 +02:00
|
|
|
Result<u64> query_shared_memory(off_t, usize) override
|
|
|
|
{
|
|
|
|
return err(ENOTSUP);
|
|
|
|
}
|
|
|
|
|
2023-08-01 17:20:28 +02:00
|
|
|
Result<void> set_metadata(const VFS::InodeMetadata&) override
|
2023-06-21 21:32:28 +02:00
|
|
|
{
|
|
|
|
return err(EROFS);
|
|
|
|
}
|
|
|
|
|
|
|
|
Result<usize> read(u8* buf, usize offset, usize length) const override;
|
|
|
|
|
|
|
|
Result<usize> write(const u8*, usize, usize) override
|
|
|
|
{
|
|
|
|
return err(EROFS);
|
|
|
|
}
|
|
|
|
|
|
|
|
Result<void> truncate(usize) override
|
|
|
|
{
|
|
|
|
return err(EROFS);
|
|
|
|
}
|
|
|
|
|
2023-06-22 19:41:35 +02:00
|
|
|
Result<SharedPtr<VFS::Inode>> find(const char*) const override;
|
|
|
|
|
|
|
|
Option<VFS::DirectoryEntry> get(usize) const override;
|
|
|
|
|
2023-08-01 17:20:28 +02:00
|
|
|
Result<SharedPtr<VFS::Inode>> create_file(const char*, mode_t) override
|
2023-06-22 19:41:35 +02:00
|
|
|
{
|
|
|
|
if (m_type != VFS::InodeType::Directory) return err(ENOTDIR);
|
|
|
|
|
|
|
|
return err(EROFS);
|
|
|
|
}
|
|
|
|
|
2023-08-01 17:20:28 +02:00
|
|
|
Result<SharedPtr<VFS::Inode>> create_subdirectory(const char*, mode_t) override
|
2023-06-22 19:41:35 +02:00
|
|
|
{
|
|
|
|
if (m_type != VFS::InodeType::Directory) return err(ENOTDIR);
|
|
|
|
|
|
|
|
return err(EROFS);
|
|
|
|
}
|
|
|
|
|
|
|
|
Result<void> add_entry(SharedPtr<VFS::Inode>, const char*) override
|
|
|
|
{
|
|
|
|
if (m_type != VFS::InodeType::Directory) return err(ENOTDIR);
|
|
|
|
|
|
|
|
return err(EROFS);
|
|
|
|
}
|
|
|
|
|
|
|
|
Result<void> replace_entry(SharedPtr<VFS::Inode>, const char*) override;
|
|
|
|
|
|
|
|
Result<void> remove_entry(const char*) override
|
|
|
|
{
|
|
|
|
if (m_type != VFS::InodeType::Directory) return err(ENOTDIR);
|
|
|
|
|
|
|
|
return err(EROFS);
|
|
|
|
}
|
|
|
|
|
|
|
|
usize entries() const override
|
|
|
|
{
|
|
|
|
return m_entries.size();
|
|
|
|
}
|
|
|
|
|
2023-07-30 11:41:53 +02:00
|
|
|
bool will_block_if_read() const override
|
2023-06-22 19:41:35 +02:00
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2023-06-22 20:10:09 +02:00
|
|
|
Result<StringView> readlink() override;
|
|
|
|
|
2023-06-22 19:41:35 +02:00
|
|
|
Result<void> lazy_initialize_dir() const;
|
|
|
|
|
2023-07-15 13:17:58 +02:00
|
|
|
// FIXME: Implement device numbers.
|
2023-06-22 19:41:35 +02:00
|
|
|
|
2023-06-21 21:32:28 +02:00
|
|
|
Inode(Badge<FileSystem>, FileSystem* fs);
|
|
|
|
virtual ~Inode() = default;
|
|
|
|
|
|
|
|
private:
|
|
|
|
VFS::InodeType m_type;
|
|
|
|
RawInode m_raw_inode;
|
|
|
|
FileSystem* m_fs;
|
|
|
|
ino_t m_inum;
|
|
|
|
|
2023-06-24 22:21:22 +02:00
|
|
|
mutable Buffer m_singly_indirect_block;
|
|
|
|
|
2023-06-22 20:10:09 +02:00
|
|
|
String m_link;
|
|
|
|
|
2023-06-22 19:41:35 +02:00
|
|
|
mutable Vector<VFS::DirectoryEntry> m_entries;
|
|
|
|
mutable bool m_dir_already_lazily_initialized { false };
|
|
|
|
|
2023-06-24 22:21:22 +02:00
|
|
|
Result<usize> find_block(usize index) const;
|
2023-06-22 16:34:22 +02:00
|
|
|
|
2023-06-21 21:32:28 +02:00
|
|
|
friend class FileSystem;
|
|
|
|
};
|
|
|
|
}
|