Kernel: Allow creating FIFOs in tmpfs

This commit is contained in:
2026-05-19 00:05:22 +03:00
parent 1922d78661
commit 8224659c48
2 changed files with 51 additions and 0 deletions

View File

@@ -82,6 +82,29 @@ namespace Kernel
friend class TmpInode; friend class TmpInode;
}; };
// NOTE: this is just a dummy, when opening a fifo a pipe is created
class TmpFIFOInode : public TmpInode
{
public:
static BAN::ErrorOr<BAN::RefPtr<TmpFIFOInode>> create_new(TmpFileSystem&, mode_t, uid_t, gid_t);
~TmpFIFOInode();
protected:
virtual BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan) override { return BAN::Error::from_errno(ENODEV); }
virtual BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan) override { return BAN::Error::from_errno(ENODEV); }
virtual BAN::ErrorOr<void> truncate_impl(size_t) override { return BAN::Error::from_errno(ENODEV); }
virtual bool can_read_impl() const override { return false; }
virtual bool can_write_impl() const override { return false; }
virtual bool has_error_impl() const override { return false; }
virtual bool has_hungup_impl() const override { return false; }
private:
TmpFIFOInode(TmpFileSystem&, ino_t, const TmpInodeInfo&);
friend class TmpInode;
};
class TmpSocketInode : public TmpInode class TmpSocketInode : public TmpInode
{ {
public: public:

View File

@@ -408,7 +408,32 @@ namespace Kernel
return {}; return {};
} }
/* FIFO INODE */
BAN::ErrorOr<BAN::RefPtr<TmpFIFOInode>> TmpFIFOInode::create_new(TmpFileSystem& fs, mode_t mode, uid_t uid, gid_t gid)
{
auto info = create_inode_info(Mode::IFIFO | mode, uid, gid);
ino_t ino = TRY(fs.allocate_inode(info));
auto* inode_ptr = new TmpFIFOInode(fs, ino, info);
if (inode_ptr == nullptr)
return BAN::Error::from_errno(ENOMEM);
return BAN::RefPtr<TmpFIFOInode>::adopt(inode_ptr);
}
TmpFIFOInode::TmpFIFOInode(TmpFileSystem& fs, ino_t ino, const TmpInodeInfo& info)
: TmpInode(fs, ino, info)
{
ASSERT(mode().ififo());
}
TmpFIFOInode::~TmpFIFOInode()
{
}
/* SOCKET INODE */ /* SOCKET INODE */
BAN::ErrorOr<BAN::RefPtr<TmpSocketInode>> TmpSocketInode::create_new(TmpFileSystem& fs, mode_t mode, uid_t uid, gid_t gid) BAN::ErrorOr<BAN::RefPtr<TmpSocketInode>> TmpSocketInode::create_new(TmpFileSystem& fs, mode_t mode, uid_t uid, gid_t gid)
{ {
auto info = create_inode_info(Mode::IFSOCK | mode, uid, gid); auto info = create_inode_info(Mode::IFSOCK | mode, uid, gid);
@@ -679,6 +704,9 @@ namespace Kernel
case Mode::IFLNK: case Mode::IFLNK:
new_inode = TRY(TmpSymlinkInode::create_new(m_fs, mode, uid, gid, ""_sv)); new_inode = TRY(TmpSymlinkInode::create_new(m_fs, mode, uid, gid, ""_sv));
break; break;
case Mode::IFIFO:
new_inode = TRY(TmpFIFOInode::create_new(m_fs, mode, uid, gid));
break;
case Mode::IFSOCK: case Mode::IFSOCK:
new_inode = TRY(TmpSocketInode::create_new(m_fs, mode, uid, gid)); new_inode = TRY(TmpSocketInode::create_new(m_fs, mode, uid, gid));
break; break;