summaryrefslogtreecommitdiff
path: root/Kernel/Devices
diff options
context:
space:
mode:
Diffstat (limited to 'Kernel/Devices')
-rw-r--r--Kernel/Devices/SelfTTYDevice.cpp67
-rw-r--r--Kernel/Devices/SelfTTYDevice.h32
2 files changed, 99 insertions, 0 deletions
diff --git a/Kernel/Devices/SelfTTYDevice.cpp b/Kernel/Devices/SelfTTYDevice.cpp
new file mode 100644
index 0000000000..e7701e7b29
--- /dev/null
+++ b/Kernel/Devices/SelfTTYDevice.cpp
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <Kernel/Devices/DeviceManagement.h>
+#include <Kernel/Devices/SelfTTYDevice.h>
+#include <Kernel/Sections.h>
+#include <Kernel/TTY/TTY.h>
+
+namespace Kernel {
+
+UNMAP_AFTER_INIT NonnullRefPtr<SelfTTYDevice> SelfTTYDevice::must_create()
+{
+ auto self_tty_device_or_error = DeviceManagement::try_create_device<SelfTTYDevice>();
+ // FIXME: Find a way to propagate errors
+ VERIFY(!self_tty_device_or_error.is_error());
+ return self_tty_device_or_error.release_value();
+}
+
+ErrorOr<NonnullRefPtr<OpenFileDescription>> SelfTTYDevice::open(int options)
+{
+ // Note: If for some odd reason we try to open this device (early on boot?)
+ // while there's no current Process assigned, don't fail and return an error.
+ if (!Process::has_current())
+ return Error::from_errno(ESRCH);
+ auto& current_process = Process::current();
+ RefPtr<TTY> tty = current_process.tty();
+ if (!tty)
+ return Error::from_errno(ENXIO);
+ auto description = TRY(OpenFileDescription::try_create(*tty));
+ description->set_rw_mode(options);
+ description->set_file_flags(options);
+ return description;
+}
+
+bool SelfTTYDevice::can_read(OpenFileDescription const&, u64) const
+{
+ VERIFY_NOT_REACHED();
+}
+
+bool SelfTTYDevice::can_write(OpenFileDescription const&, u64) const
+{
+ VERIFY_NOT_REACHED();
+}
+
+ErrorOr<size_t> SelfTTYDevice::read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t)
+{
+ VERIFY_NOT_REACHED();
+}
+
+ErrorOr<size_t> SelfTTYDevice::write(OpenFileDescription&, u64, UserOrKernelBuffer const&, size_t)
+{
+ VERIFY_NOT_REACHED();
+}
+
+UNMAP_AFTER_INIT SelfTTYDevice::SelfTTYDevice()
+ : CharacterDevice(5, 0)
+{
+}
+
+UNMAP_AFTER_INIT SelfTTYDevice::~SelfTTYDevice()
+{
+}
+
+}
diff --git a/Kernel/Devices/SelfTTYDevice.h b/Kernel/Devices/SelfTTYDevice.h
new file mode 100644
index 0000000000..7a808e37d4
--- /dev/null
+++ b/Kernel/Devices/SelfTTYDevice.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <Kernel/Devices/CharacterDevice.h>
+
+namespace Kernel {
+
+class SelfTTYDevice final : public CharacterDevice {
+ friend class DeviceManagement;
+
+public:
+ static NonnullRefPtr<SelfTTYDevice> must_create();
+ virtual ~SelfTTYDevice() override;
+
+private:
+ SelfTTYDevice();
+
+ // ^CharacterDevice
+ virtual ErrorOr<NonnullRefPtr<OpenFileDescription>> open(int options) override;
+ virtual ErrorOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
+ virtual ErrorOr<size_t> write(OpenFileDescription&, u64, UserOrKernelBuffer const&, size_t) override;
+ virtual bool can_read(OpenFileDescription const&, u64) const override;
+ virtual bool can_write(OpenFileDescription const&, u64) const override;
+ virtual StringView class_name() const override { return "SelfTTYDevice"sv; }
+};
+
+}