Serenity Operating System
at master 63 lines 2.7 kB view raw
1/* 2 * Copyright (c) 2021, sin-ack <sin-ack@protonmail.com> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#pragma once 8 9#include <Kernel/FileSystem/ISO9660FS/FileSystem.h> 10#include <Kernel/FileSystem/Inode.h> 11 12namespace Kernel { 13 14class ISO9660Inode final : public Inode { 15 friend ISO9660FS; 16 17public: 18 virtual ~ISO9660Inode() override; 19 20 ISO9660FS& fs() { return static_cast<ISO9660FS&>(Inode::fs()); } 21 ISO9660FS const& fs() const { return static_cast<ISO9660FS const&>(Inode::fs()); } 22 23 // ^Inode 24 virtual InodeMetadata metadata() const override; 25 virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override; 26 virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override; 27 virtual ErrorOr<void> flush_metadata() override; 28 virtual ErrorOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override; 29 virtual ErrorOr<void> add_child(Inode&, StringView name, mode_t) override; 30 virtual ErrorOr<void> remove_child(StringView name) override; 31 virtual ErrorOr<void> replace_child(StringView name, Inode& child) override; 32 virtual ErrorOr<void> chmod(mode_t) override; 33 virtual ErrorOr<void> chown(UserID, GroupID) override; 34 virtual ErrorOr<void> truncate(u64) override; 35 virtual ErrorOr<void> update_timestamps(Optional<Time> atime, Optional<Time> ctime, Optional<Time> mtime) override; 36 37private: 38 // HACK: The base ISO 9660 standard says the maximum filename length is 37 39 // bytes large; however, we can read filenames longer than that right now 40 // without any problems, so let's allow it anyway. 41 static constexpr size_t max_file_identifier_length = 256 - sizeof(ISO::DirectoryRecordHeader); 42 43 // ^Inode 44 virtual ErrorOr<size_t> read_bytes_locked(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override; 45 virtual ErrorOr<size_t> write_bytes_locked(off_t, size_t, UserOrKernelBuffer const& buffer, OpenFileDescription*) override; 46 47 ISO9660Inode(ISO9660FS&, ISO::DirectoryRecordHeader const& record, StringView name); 48 static ErrorOr<NonnullRefPtr<ISO9660Inode>> try_create_from_directory_record(ISO9660FS&, ISO::DirectoryRecordHeader const& record, StringView name); 49 50 static InodeIndex get_inode_index(ISO::DirectoryRecordHeader const& record, StringView name); 51 static StringView get_normalized_filename(ISO::DirectoryRecordHeader const& record, Bytes buffer); 52 53 void create_metadata(); 54 time_t parse_numerical_date_time(ISO::NumericalDateAndTime const&); 55 56 InodeMetadata m_metadata; 57 ISO::DirectoryRecordHeader m_record; 58}; 59 60} 61 62using Kernel::ISO::has_any_flag; 63using Kernel::ISO::has_flag;