summaryrefslogtreecommitdiff
path: root/Kernel/Devices
diff options
context:
space:
mode:
authorLiav A <liavalb@gmail.com>2022-02-15 21:24:31 +0200
committerAndreas Kling <kling@serenityos.org>2022-03-22 20:26:05 +0100
commit12867d60adaf8fa4f1d6e22b33d5b6c971be0d64 (patch)
tree1766b741565b8b8b1c17150f4f2c438c29367084 /Kernel/Devices
parent2fb9eb52576529001d68063e314e848c674d076a (diff)
downloadserenity-12867d60adaf8fa4f1d6e22b33d5b6c971be0d64.zip
Kernel: Create SelfTTYDevice class to help replace /dev/tty symlink
This will replace the /dev/tty symlink created by SystemServer, so instead of a symlink, a character device will be created. When doing read(2), write(2) and ioctl(2) on this device, it will "redirect" these operations to the attached TTY of the current process.
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; }
+};
+
+}