Serenity Operating System
at master 51 lines 1.5 kB view raw
1/* 2 * Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <Kernel/Devices/DeviceControlDevice.h> 8#include <Kernel/Devices/DeviceManagement.h> 9 10namespace Kernel { 11 12UNMAP_AFTER_INIT NonnullLockRefPtr<DeviceControlDevice> DeviceControlDevice::must_create() 13{ 14 auto device_control_device_or_error = DeviceManagement::try_create_device<DeviceControlDevice>(); 15 // FIXME: Find a way to propagate errors 16 VERIFY(!device_control_device_or_error.is_error()); 17 return device_control_device_or_error.release_value(); 18} 19 20bool DeviceControlDevice::can_read(OpenFileDescription const&, u64) const 21{ 22 return true; 23} 24 25UNMAP_AFTER_INIT DeviceControlDevice::DeviceControlDevice() 26 : CharacterDevice(2, 10) 27{ 28} 29 30UNMAP_AFTER_INIT DeviceControlDevice::~DeviceControlDevice() = default; 31 32ErrorOr<size_t> DeviceControlDevice::read(OpenFileDescription&, u64, UserOrKernelBuffer& buffer, size_t size) 33{ 34 auto device_event = DeviceManagement::the().dequeue_top_device_event({}); 35 if (!device_event.has_value()) 36 return 0; 37 38 if (size < sizeof(DeviceEvent)) 39 return Error::from_errno(EOVERFLOW); 40 size_t nread = 0; 41 TRY(buffer.write(&device_event.value(), nread, sizeof(DeviceEvent))); 42 nread += sizeof(DeviceEvent); 43 return nread; 44} 45 46ErrorOr<void> DeviceControlDevice::ioctl(OpenFileDescription&, unsigned, Userspace<void*>) 47{ 48 return Error::from_errno(ENOTSUP); 49} 50 51}