From 132286895fd6cc2637e580e3d68c1a68ae4fe63e Mon Sep 17 00:00:00 2001 From: Bananymous Date: Wed, 7 Feb 2024 15:33:48 +0200 Subject: [PATCH] Kernel: Implement Socket inodes for tmpfs --- kernel/include/kernel/FS/TmpFS/Inode.h | 18 ++++++++++++ kernel/kernel/FS/TmpFS/Inode.cpp | 38 +++++++++++++++++++++++++- kernel/kernel/Process.cpp | 3 +- 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/kernel/include/kernel/FS/TmpFS/Inode.h b/kernel/include/kernel/FS/TmpFS/Inode.h index fe0589bf..d9492942 100644 --- a/kernel/include/kernel/FS/TmpFS/Inode.h +++ b/kernel/include/kernel/FS/TmpFS/Inode.h @@ -80,6 +80,24 @@ namespace Kernel friend class TmpInode; }; + class TmpSocketInode : public TmpInode + { + public: + static BAN::ErrorOr> create_new(TmpFileSystem&, mode_t, uid_t, gid_t); + ~TmpSocketInode(); + + 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 has_data_impl() const override { return true; } + + private: + TmpSocketInode(TmpFileSystem&, ino_t, const TmpInodeInfo&); + + friend class TmpInode; + }; + class TmpSymlinkInode : public TmpInode { public: diff --git a/kernel/kernel/FS/TmpFS/Inode.cpp b/kernel/kernel/FS/TmpFS/Inode.cpp index 611d7cae..e14932f8 100644 --- a/kernel/kernel/FS/TmpFS/Inode.cpp +++ b/kernel/kernel/FS/TmpFS/Inode.cpp @@ -215,6 +215,30 @@ namespace Kernel return {}; } + /* 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); + ino_t ino = TRY(fs.allocate_inode(info)); + + auto* inode_ptr = new TmpSocketInode(fs, ino, info); + if (inode_ptr == nullptr) + return BAN::Error::from_errno(ENOMEM); + + return BAN::RefPtr::adopt(inode_ptr); + } + + TmpSocketInode::TmpSocketInode(TmpFileSystem& fs, ino_t ino, const TmpInodeInfo& info) + : TmpInode(fs, ino, info) + { + ASSERT(mode().ifsock()); + } + + TmpSocketInode::~TmpSocketInode() + { + } + /* SYMLINK INODE */ BAN::ErrorOr> TmpSymlinkInode::create_new(TmpFileSystem& fs, mode_t mode, uid_t uid, gid_t gid, BAN::StringView target) @@ -446,7 +470,19 @@ namespace Kernel BAN::ErrorOr TmpDirectoryInode::create_file_impl(BAN::StringView name, mode_t mode, uid_t uid, gid_t gid) { - auto new_inode = TRY(TmpFileInode::create_new(m_fs, mode, uid, gid)); + BAN::RefPtr new_inode; + switch (mode & Mode::TYPE_MASK) + { + case Mode::IFREG: + new_inode = TRY(TmpFileInode::create_new(m_fs, mode, uid, gid)); + break; + case Mode::IFSOCK: + new_inode = TRY(TmpSocketInode::create_new(m_fs, mode, uid, gid)); + break; + default: + dprintln("Creating with mode {o} is not supported", mode); + return BAN::Error::from_errno(ENOTSUP); + } TRY(link_inode(*new_inode, name)); return {}; } diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 2cbb1d87..f792008f 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -649,8 +649,9 @@ namespace Kernel case Inode::Mode::IFREG: break; case Inode::Mode::IFDIR: break; case Inode::Mode::IFIFO: break; + case Inode::Mode::IFSOCK: break; default: - return BAN::Error::from_errno(EINVAL); + return BAN::Error::from_errno(ENOTSUP); } LockGuard _(m_lock);