Newer
Older
minerva / Userland / Services / DeviceMapper / DeviceEventLoop.h
@minerva minerva on 13 Jul 1 KB Initial commit
/*
 * Copyright (c) 2023, Liav A. <liavalb@hotmail.co.il>
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#pragma once

#include "DeviceNodeFamily.h"
#include <AK/ByteBuffer.h>
#include <Kernel/API/DeviceEvent.h>
#include <Kernel/API/DeviceFileTypes.h>
#include <LibCore/EventLoop.h>
#include <LibCore/File.h>
#include <LibCore/Notifier.h>

namespace DeviceMapper {

class DeviceEventLoop {
public:
    struct DeviceNodeMatch {
        String permission_group;
        String family_type_literal;
        String path_pattern;
        DeviceNodeType device_node_type;
        MajorNumber major_number;
        Optional<MinorNumber> specific_minor_number;
        mode_t create_mode;
    };

    DeviceEventLoop(Vector<DeviceNodeMatch>, NonnullOwnPtr<Core::File>);
    virtual ~DeviceEventLoop() = default;

    ErrorOr<void> drain_events_from_devctl();

private:
    Optional<DeviceEventLoop::DeviceNodeMatch const&> device_node_family_to_match_type(DeviceNodeType device_node_type, MajorNumber major_number, MinorNumber minor_number);

    Optional<DeviceNodeFamily&> find_device_node_family(DeviceNodeType, MajorNumber major_number) const;
    ErrorOr<NonnullRefPtr<DeviceNodeFamily>> find_or_register_new_device_node_family(DeviceNodeMatch const& match, DeviceNodeType, MajorNumber major_number);

    ErrorOr<void> register_new_device(DeviceNodeType, MajorNumber major_number, MinorNumber minor_number);
    ErrorOr<void> unregister_device(DeviceNodeType, MajorNumber major_number, MinorNumber minor_number);

    ErrorOr<void> read_one_or_eof(DeviceEvent& event);

    Vector<NonnullRefPtr<DeviceNodeFamily>> m_device_node_families;
    NonnullOwnPtr<Core::File> const m_devctl_file;
    Vector<DeviceNodeMatch> m_matches;
};

}