forked from Bananymous/banan-os
Kernel: Inode can now return full mode value
Kernel::Inode::Mode is an union of bitmasked fields for every possible bit
This commit is contained in:
parent
fbc17eb6dd
commit
038379274e
|
@ -122,13 +122,12 @@ namespace Kernel
|
||||||
class Ext2Inode : public Inode
|
class Ext2Inode : public Inode
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual bool is_directory() const override;
|
|
||||||
virtual bool is_regular_file() const override;
|
|
||||||
|
|
||||||
virtual uint16_t uid() const override { return m_inode.uid; }
|
virtual uint16_t uid() const override { return m_inode.uid; }
|
||||||
virtual uint16_t gid() const override { return m_inode.gid; }
|
virtual uint16_t gid() const override { return m_inode.gid; }
|
||||||
virtual uint32_t size() const override { return m_inode.size; }
|
virtual uint32_t size() const override { return m_inode.size; }
|
||||||
|
|
||||||
|
virtual Mode mode() const override { return { .mode = m_inode.mode }; }
|
||||||
|
|
||||||
virtual BAN::StringView name() const override { return m_name; }
|
virtual BAN::StringView name() const override { return m_name; }
|
||||||
|
|
||||||
virtual BAN::ErrorOr<BAN::Vector<uint8_t>> read_all() override;
|
virtual BAN::ErrorOr<BAN::Vector<uint8_t>> read_all() override;
|
||||||
|
|
|
@ -11,13 +11,40 @@ namespace Kernel
|
||||||
class Inode
|
class Inode
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual bool is_directory() const = 0;
|
union Mode
|
||||||
virtual bool is_regular_file() const = 0;
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint16_t IXOTH : 1; // 0x0001
|
||||||
|
uint16_t IWOTH : 1; // 0x0002
|
||||||
|
uint16_t IROTH : 1; // 0x0004
|
||||||
|
uint16_t IXGRP : 1; // 0x0008
|
||||||
|
uint16_t IWGRP : 1; // 0x0010
|
||||||
|
uint16_t IRGRP : 1; // 0x0020
|
||||||
|
uint16_t IXUSR : 1; // 0x0040
|
||||||
|
uint16_t IWUSR : 1; // 0x0080
|
||||||
|
uint16_t IRUSR : 1; // 0x0100
|
||||||
|
uint16_t ISVTX : 1; // 0x0200
|
||||||
|
uint16_t ISGID : 1; // 0x0400
|
||||||
|
uint16_t ISUID : 1; // 0x0800
|
||||||
|
uint16_t IFIFO : 1; // 0x1000
|
||||||
|
uint16_t IFCHR : 1; // 0x2000
|
||||||
|
uint16_t IFDIR : 1; // 0x4000
|
||||||
|
uint16_t IFREG : 1; // 0x8000
|
||||||
|
};
|
||||||
|
uint16_t mode;
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool ifdir() const { return mode().IFDIR; }
|
||||||
|
bool ifreg() const { return mode().IFREG; }
|
||||||
|
|
||||||
virtual uint16_t uid() const = 0;
|
virtual uint16_t uid() const = 0;
|
||||||
virtual uint16_t gid() const = 0;
|
virtual uint16_t gid() const = 0;
|
||||||
virtual uint32_t size() const = 0;
|
virtual uint32_t size() const = 0;
|
||||||
|
|
||||||
|
virtual Mode mode() const = 0;
|
||||||
|
|
||||||
virtual BAN::StringView name() const = 0;
|
virtual BAN::StringView name() const = 0;
|
||||||
|
|
||||||
virtual BAN::ErrorOr<BAN::Vector<uint8_t>> read_all() = 0;
|
virtual BAN::ErrorOr<BAN::Vector<uint8_t>> read_all() = 0;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
#include <kernel/kprint.h>
|
#include <kernel/kprint.h>
|
||||||
|
|
||||||
#define EXT2_DEBUG_PRINT 1
|
#define EXT2_DEBUG_PRINT 0
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel
|
||||||
{
|
{
|
||||||
|
@ -88,7 +88,7 @@ namespace Kernel
|
||||||
enum InodeMode
|
enum InodeMode
|
||||||
{
|
{
|
||||||
// -- file format --
|
// -- file format --
|
||||||
IFSOKC = 0xC000,
|
IFSOCK = 0xC000,
|
||||||
IFLNK = 0xA000,
|
IFLNK = 0xA000,
|
||||||
IFREG = 0x8000,
|
IFREG = 0x8000,
|
||||||
IFBLK = 0x6000,
|
IFBLK = 0x6000,
|
||||||
|
@ -138,16 +138,6 @@ namespace Kernel
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Ext2Inode::is_directory() const
|
|
||||||
{
|
|
||||||
return m_inode.mode & Ext2::Enum::IFDIR;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Ext2Inode::is_regular_file() const
|
|
||||||
{
|
|
||||||
return m_inode.mode & Ext2::Enum::IFREG;
|
|
||||||
}
|
|
||||||
|
|
||||||
BAN::ErrorOr<void> Ext2Inode::for_each_block(BAN::Function<BAN::ErrorOr<bool>(const BAN::Vector<uint8_t>&)>& func)
|
BAN::ErrorOr<void> Ext2Inode::for_each_block(BAN::Function<BAN::ErrorOr<bool>(const BAN::Vector<uint8_t>&)>& func)
|
||||||
{
|
{
|
||||||
uint32_t data_blocks_left = m_inode.blocks / (2 << m_fs->superblock().log_block_size);
|
uint32_t data_blocks_left = m_inode.blocks / (2 << m_fs->superblock().log_block_size);
|
||||||
|
@ -237,7 +227,7 @@ namespace Kernel
|
||||||
|
|
||||||
BAN::ErrorOr<BAN::Vector<uint8_t>> Ext2Inode::read_all()
|
BAN::ErrorOr<BAN::Vector<uint8_t>> Ext2Inode::read_all()
|
||||||
{
|
{
|
||||||
if (is_directory())
|
if (ifdir())
|
||||||
return BAN::Error::from_string("Inode is a directory");
|
return BAN::Error::from_string("Inode is a directory");
|
||||||
|
|
||||||
BAN::Vector<uint8_t> data_buffer;
|
BAN::Vector<uint8_t> data_buffer;
|
||||||
|
@ -265,7 +255,7 @@ namespace Kernel
|
||||||
|
|
||||||
BAN::ErrorOr<BAN::RefCounted<Inode>> Ext2Inode::directory_find(BAN::StringView file_name)
|
BAN::ErrorOr<BAN::RefCounted<Inode>> Ext2Inode::directory_find(BAN::StringView file_name)
|
||||||
{
|
{
|
||||||
if (!is_directory())
|
if (!ifdir())
|
||||||
return BAN::Error::from_string("Inode is not a directory");
|
return BAN::Error::from_string("Inode is not a directory");
|
||||||
|
|
||||||
BAN::RefCounted<Inode> result;
|
BAN::RefCounted<Inode> result;
|
||||||
|
@ -298,7 +288,7 @@ namespace Kernel
|
||||||
|
|
||||||
BAN::ErrorOr<BAN::Vector<BAN::RefCounted<Inode>>> Ext2Inode::directory_inodes()
|
BAN::ErrorOr<BAN::Vector<BAN::RefCounted<Inode>>> Ext2Inode::directory_inodes()
|
||||||
{
|
{
|
||||||
if (!is_directory())
|
if (!ifdir())
|
||||||
return BAN::Error::from_string("Inode is not a directory");
|
return BAN::Error::from_string("Inode is not a directory");
|
||||||
|
|
||||||
BAN::Vector<BAN::RefCounted<Inode>> inodes;
|
BAN::Vector<BAN::RefCounted<Inode>> inodes;
|
||||||
|
|
|
@ -271,7 +271,7 @@ argument_done:
|
||||||
path = path.substring(1);
|
path = path.substring(1);
|
||||||
|
|
||||||
auto directory = VirtualFileSystem::get().root_inode();
|
auto directory = VirtualFileSystem::get().root_inode();
|
||||||
ASSERT(directory->is_directory());
|
ASSERT(directory->ifdir());
|
||||||
|
|
||||||
if (arguments.size() == 2)
|
if (arguments.size() == 2)
|
||||||
{
|
{
|
||||||
|
@ -282,7 +282,7 @@ argument_done:
|
||||||
if (inode_or_error.is_error())
|
if (inode_or_error.is_error())
|
||||||
return TTY_PRINTLN("{}", inode_or_error.get_error().get_message());
|
return TTY_PRINTLN("{}", inode_or_error.get_error().get_message());
|
||||||
directory = inode_or_error.value();
|
directory = inode_or_error.value();
|
||||||
if (!directory->is_directory())
|
if (!directory->ifdir())
|
||||||
return TTY_PRINTLN("expected argument to be path to directory");
|
return TTY_PRINTLN("expected argument to be path to directory");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -292,13 +292,29 @@ argument_done:
|
||||||
return TTY_PRINTLN("{}", inodes_or_error.get_error().get_message());
|
return TTY_PRINTLN("{}", inodes_or_error.get_error().get_message());
|
||||||
auto& inodes = inodes_or_error.value();
|
auto& inodes = inodes_or_error.value();
|
||||||
|
|
||||||
|
auto mode_string = [](Inode::Mode mode)
|
||||||
|
{
|
||||||
|
static char buffer[11] {};
|
||||||
|
buffer[0] = mode.IFDIR ? 'd' : '-';
|
||||||
|
buffer[1] = mode.IRUSR ? 'r' : '-';
|
||||||
|
buffer[2] = mode.IWUSR ? 'w' : '-';
|
||||||
|
buffer[3] = mode.IXUSR ? 'x' : '-';
|
||||||
|
buffer[4] = mode.IRGRP ? 'r' : '-';
|
||||||
|
buffer[5] = mode.IWGRP ? 'w' : '-';
|
||||||
|
buffer[6] = mode.IXGRP ? 'x' : '-';
|
||||||
|
buffer[7] = mode.IROTH ? 'r' : '-';
|
||||||
|
buffer[8] = mode.IWOTH ? 'w' : '-';
|
||||||
|
buffer[9] = mode.IXOTH ? 'x' : '-';
|
||||||
|
return (const char*)buffer;
|
||||||
|
};
|
||||||
|
|
||||||
TTY_PRINTLN("/{}", path);
|
TTY_PRINTLN("/{}", path);
|
||||||
for (auto& inode : inodes)
|
for (auto& inode : inodes)
|
||||||
if (inode->is_directory())
|
if (inode->ifdir())
|
||||||
TTY_PRINTLN(" {7} \e[34m{}\e[m", inode->size(), inode->name());
|
TTY_PRINTLN(" {} {7} \e[34m{}\e[m", mode_string(inode->mode()), inode->size(), inode->name());
|
||||||
for (auto& inode : inodes)
|
for (auto& inode : inodes)
|
||||||
if (!inode->is_directory())
|
if (!inode->ifdir())
|
||||||
TTY_PRINTLN(" {7} {}", inode->size(), inode->name());
|
TTY_PRINTLN(" {} {7} {}", mode_string(inode->mode()), inode->size(), inode->name());
|
||||||
}
|
}
|
||||||
else if (arguments.front() == "cat")
|
else if (arguments.front() == "cat")
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue