diff --git a/kernel/include/kernel/FS/TmpFS/Inode.h b/kernel/include/kernel/FS/TmpFS/Inode.h index 1c5ed682..a0ae80f8 100644 --- a/kernel/include/kernel/FS/TmpFS/Inode.h +++ b/kernel/include/kernel/FS/TmpFS/Inode.h @@ -82,6 +82,29 @@ namespace Kernel 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> create_new(TmpFileSystem&, mode_t, uid_t, gid_t); + ~TmpFIFOInode(); + + protected: + virtual BAN::ErrorOr read_impl(off_t, BAN::ByteSpan) override { return BAN::Error::from_errno(ENODEV); } + virtual BAN::ErrorOr write_impl(off_t, BAN::ConstByteSpan) override { return BAN::Error::from_errno(ENODEV); } + virtual BAN::ErrorOr 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 { public: diff --git a/kernel/kernel/FS/TmpFS/Inode.cpp b/kernel/kernel/FS/TmpFS/Inode.cpp index d601214a..f20d5eff 100644 --- a/kernel/kernel/FS/TmpFS/Inode.cpp +++ b/kernel/kernel/FS/TmpFS/Inode.cpp @@ -408,7 +408,32 @@ namespace Kernel return {}; } + /* FIFO INODE */ + + BAN::ErrorOr> 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::adopt(inode_ptr); + } + + TmpFIFOInode::TmpFIFOInode(TmpFileSystem& fs, ino_t ino, const TmpInodeInfo& info) + : TmpInode(fs, ino, info) + { + ASSERT(mode().ififo()); + } + + TmpFIFOInode::~TmpFIFOInode() + { + } + /* SOCKET INODE */ + BAN::ErrorOr> TmpSocketInode::create_new(TmpFileSystem& fs, mode_t mode, uid_t uid, gid_t gid) { auto info = create_inode_info(Mode::IFSOCK | mode, uid, gid); @@ -679,6 +704,9 @@ namespace Kernel case Mode::IFLNK: new_inode = TRY(TmpSymlinkInode::create_new(m_fs, mode, uid, gid, ""_sv)); break; + case Mode::IFIFO: + new_inode = TRY(TmpFIFOInode::create_new(m_fs, mode, uid, gid)); + break; case Mode::IFSOCK: new_inode = TRY(TmpSocketInode::create_new(m_fs, mode, uid, gid)); break;