/* * Copyright (c) 2023, Liav A. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include "DeviceNodeFamily.h" #include #include #include #include #include #include namespace DeviceMapper { class DeviceEventLoop { public: enum class MinorNumberAllocationType { SequentialUnlimited, SequentialLimited, }; enum class UnixDeviceType { BlockDevice, CharacterDevice, }; struct DeviceNodeMatch { StringView permission_group; StringView family_type_literal; StringView path_pattern; DeviceNodeFamily::Type unix_device_type; MajorNumber major_number; MinorNumberAllocationType minor_number_allocation_type; MinorNumber minor_number_start; size_t minor_number_range_size; mode_t create_mode; }; DeviceEventLoop(NonnullOwnPtr); virtual ~DeviceEventLoop() = default; ErrorOr drain_events_from_devctl(); private: Optional find_device_node_family(DeviceNodeFamily::Type unix_device_type, MajorNumber major_number, MinorNumber minor_number) const; ErrorOr> find_or_register_new_device_node_family(DeviceNodeMatch const& match, DeviceNodeFamily::Type unix_device_type, MajorNumber major_number, MinorNumber minor_number); ErrorOr register_new_device(DeviceNodeFamily::Type unix_device_type, MajorNumber major_number, MinorNumber minor_number); ErrorOr unregister_device(DeviceNodeFamily::Type unix_device_type, MajorNumber major_number, MinorNumber minor_number); ErrorOr read_one_or_eof(DeviceEvent& event); Vector> m_device_node_families; NonnullOwnPtr const m_devctl_file; }; }