/* * Copyright (c) 2021, sin-ack * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include namespace Kernel { class ISO9660Inode final : public Inode { friend ISO9660FS; public: virtual ~ISO9660Inode() override; ISO9660FS& fs() { return static_cast(Inode::fs()); } ISO9660FS const& fs() const { return static_cast(Inode::fs()); } // ^Inode virtual InodeMetadata metadata() const override; virtual ErrorOr traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const override; virtual ErrorOr> lookup(StringView name) override; virtual ErrorOr flush_metadata() override; virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override; virtual ErrorOr add_child(Inode&, StringView name, mode_t) override; virtual ErrorOr remove_child(StringView name) override; virtual ErrorOr replace_child(StringView name, Inode& child) override; virtual ErrorOr chmod(mode_t) override; virtual ErrorOr chown(UserID, GroupID) override; virtual ErrorOr truncate(u64) override; virtual ErrorOr update_timestamps(Optional atime, Optional ctime, Optional mtime) override; private: // HACK: The base ISO 9660 standard says the maximum filename length is 37 // bytes large; however, we can read filenames longer than that right now // without any problems, so let's allow it anyway. static constexpr size_t max_file_identifier_length = 256 - sizeof(ISO::DirectoryRecordHeader); // ^Inode virtual ErrorOr read_bytes_locked(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override; virtual ErrorOr write_bytes_locked(off_t, size_t, UserOrKernelBuffer const& buffer, OpenFileDescription*) override; ISO9660Inode(ISO9660FS&, ISO::DirectoryRecordHeader const& record, StringView name); static ErrorOr> try_create_from_directory_record(ISO9660FS&, ISO::DirectoryRecordHeader const& record, StringView name); static InodeIndex get_inode_index(ISO::DirectoryRecordHeader const& record, StringView name); static StringView get_normalized_filename(ISO::DirectoryRecordHeader const& record, Bytes buffer); void create_metadata(); UnixDateTime parse_numerical_date_time(ISO::NumericalDateAndTime const&); InodeMetadata m_metadata; ISO::DirectoryRecordHeader m_record; }; } using Kernel::ISO::has_any_flag; using Kernel::ISO::has_flag;