DeviceControlDevice.cpp 1.4 KB

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