/* * Copyright (c) 2021, Liav A. * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include namespace Kernel { ErrorOr> SysFSInode::try_create(SysFS const& fs, SysFSComponent const& component) { return adopt_nonnull_lock_ref_or_enomem(new (nothrow) SysFSInode(fs, component)); } SysFSInode::SysFSInode(SysFS const& fs, SysFSComponent const& component) : Inode(const_cast(fs), component.component_index()) , m_associated_component(component) { } void SysFSInode::did_seek(OpenFileDescription& description, off_t new_offset) { if (new_offset != 0) return; auto result = m_associated_component->refresh_data(description); if (result.is_error()) { // Subsequent calls to read will return EIO! dbgln("SysFS: Could not refresh contents: {}", result.error()); } } ErrorOr SysFSInode::attach(OpenFileDescription& description) { return m_associated_component->refresh_data(description); } ErrorOr SysFSInode::read_bytes_locked(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription* fd) const { return m_associated_component->read_bytes(offset, count, buffer, fd); } ErrorOr SysFSInode::traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const { VERIFY_NOT_REACHED(); } ErrorOr> SysFSInode::lookup(StringView) { VERIFY_NOT_REACHED(); } InodeMetadata SysFSInode::metadata() const { // NOTE: No locking required as m_associated_component or its component index will never change during our lifetime. InodeMetadata metadata; metadata.inode = { fsid(), m_associated_component->component_index() }; metadata.mode = S_IFREG | m_associated_component->permissions(); metadata.uid = 0; metadata.gid = 0; metadata.size = m_associated_component->size(); metadata.mtime = TimeManagement::boot_time(); return metadata; } ErrorOr SysFSInode::flush_metadata() { return {}; } ErrorOr SysFSInode::write_bytes_locked(off_t offset, size_t count, UserOrKernelBuffer const& buffer, OpenFileDescription* fd) { return m_associated_component->write_bytes(offset, count, buffer, fd); } ErrorOr> SysFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID) { return EROFS; } ErrorOr SysFSInode::add_child(Inode&, StringView, mode_t) { return EROFS; } ErrorOr SysFSInode::remove_child(StringView) { return EROFS; } ErrorOr SysFSInode::replace_child(StringView, Inode&) { return EROFS; } ErrorOr SysFSInode::chmod(mode_t) { return EPERM; } ErrorOr SysFSInode::chown(UserID, GroupID) { return EPERM; } ErrorOr SysFSInode::truncate(u64 size) { return m_associated_component->truncate(size); } ErrorOr SysFSInode::update_timestamps(Optional