From 18e77aa28535d52eb6be9c2791a6d217433b1b68 Mon Sep 17 00:00:00 2001 From: Liav A Date: Fri, 25 Dec 2020 19:01:19 +0200 Subject: [PATCH] Kernel: Add a method to determine the desired permissions of a Device This method will be used later in DevFS, to set the appropriate permissions for each device node. --- Kernel/Console.h | 3 +++ Kernel/Devices/BXVGADevice.h | 3 +++ Kernel/Devices/Device.h | 2 ++ Kernel/Devices/DiskPartition.h | 3 +++ Kernel/Devices/FullDevice.h | 3 +++ Kernel/Devices/KeyboardDevice.h | 3 +++ Kernel/Devices/MBVGADevice.h | 3 +++ Kernel/Devices/NullDevice.h | 3 +++ Kernel/Devices/PS2MouseDevice.h | 3 +++ Kernel/Devices/RandomDevice.h | 3 +++ Kernel/Devices/SB16.h | 3 +++ Kernel/Devices/SerialDevice.h | 3 +++ Kernel/Devices/ZeroDevice.h | 3 +++ Kernel/Storage/StorageDevice.h | 3 +++ Kernel/TTY/MasterPTY.h | 3 +++ Kernel/TTY/PTYMultiplexer.h | 3 +++ Kernel/TTY/TTY.h | 3 +++ 17 files changed, 50 insertions(+) diff --git a/Kernel/Console.h b/Kernel/Console.h index c37731e4f7f34e..55ae0f1b549d33 100644 --- a/Kernel/Console.h +++ b/Kernel/Console.h @@ -51,6 +51,9 @@ class Console final : public Kernel::CharacterDevice { const CircularQueue& logbuffer() const { return m_logbuffer; } + // ^Device + virtual mode_t required_mode() const override { return 0666; } + private: CircularQueue m_logbuffer; }; diff --git a/Kernel/Devices/BXVGADevice.h b/Kernel/Devices/BXVGADevice.h index de3f4bfd72104f..9c24c107dadb60 100644 --- a/Kernel/Devices/BXVGADevice.h +++ b/Kernel/Devices/BXVGADevice.h @@ -44,6 +44,9 @@ class BXVGADevice final : public BlockDevice { virtual int ioctl(FileDescription&, unsigned request, FlatPtr arg) override; virtual KResultOr mmap(Process&, FileDescription&, VirtualAddress preferred_vaddr, size_t offset, size_t, int prot, bool shared) override; + // ^Device + virtual mode_t required_mode() const override { return 0660; } + private: virtual const char* class_name() const override { return "BXVGA"; } virtual bool can_read(const FileDescription&, size_t) const override { return true; } diff --git a/Kernel/Devices/Device.h b/Kernel/Devices/Device.h index 80a63e22a8c0c7..1ef8bcfa89ef8e 100644 --- a/Kernel/Devices/Device.h +++ b/Kernel/Devices/Device.h @@ -57,6 +57,8 @@ class Device : public File { uid_t uid() const { return m_uid; } uid_t gid() const { return m_gid; } + virtual mode_t required_mode() const = 0; + virtual bool is_device() const override { return true; } virtual bool is_disk_device() const { return false; } diff --git a/Kernel/Devices/DiskPartition.h b/Kernel/Devices/DiskPartition.h index 7d37354960eb52..acd9547c9aae5f 100644 --- a/Kernel/Devices/DiskPartition.h +++ b/Kernel/Devices/DiskPartition.h @@ -44,6 +44,9 @@ class DiskPartition final : public BlockDevice { virtual KResultOr write(FileDescription&, size_t, const UserOrKernelBuffer&, size_t) override; virtual bool can_write(const FileDescription&, size_t) const override; + // ^Device + virtual mode_t required_mode() const override { return 0600; } + private: virtual const char* class_name() const override; diff --git a/Kernel/Devices/FullDevice.h b/Kernel/Devices/FullDevice.h index 43070686c16fdc..8c7a9668d7b0b0 100644 --- a/Kernel/Devices/FullDevice.h +++ b/Kernel/Devices/FullDevice.h @@ -36,6 +36,9 @@ class FullDevice final : public CharacterDevice { FullDevice(); virtual ~FullDevice() override; + // ^Device + virtual mode_t required_mode() const override { return 0600; } + private: // ^CharacterDevice virtual KResultOr read(FileDescription&, size_t, UserOrKernelBuffer&, size_t) override; diff --git a/Kernel/Devices/KeyboardDevice.h b/Kernel/Devices/KeyboardDevice.h index 4e943bf298f1a5..ba1749e82d1a2d 100644 --- a/Kernel/Devices/KeyboardDevice.h +++ b/Kernel/Devices/KeyboardDevice.h @@ -74,6 +74,9 @@ class KeyboardDevice final : public IRQHandler enable_irq(); } + // ^Device + virtual mode_t required_mode() const override { return 0440; } + private: // ^IRQHandler virtual void handle_irq(const RegisterState&) override; diff --git a/Kernel/Devices/MBVGADevice.h b/Kernel/Devices/MBVGADevice.h index 9ee9d762ae9e8e..16685cc9a4db00 100644 --- a/Kernel/Devices/MBVGADevice.h +++ b/Kernel/Devices/MBVGADevice.h @@ -43,6 +43,9 @@ class MBVGADevice final : public BlockDevice { virtual int ioctl(FileDescription&, unsigned request, FlatPtr arg) override; virtual KResultOr mmap(Process&, FileDescription&, VirtualAddress preferred_vaddr, size_t offset, size_t, int prot, bool shared) override; + // ^Device + virtual mode_t required_mode() const override { return 0660; } + private: virtual const char* class_name() const override { return "MBVGA"; } virtual bool can_read(const FileDescription&, size_t) const override { return true; } diff --git a/Kernel/Devices/NullDevice.h b/Kernel/Devices/NullDevice.h index 4fcc9c02581f8d..11e98b567c5eba 100644 --- a/Kernel/Devices/NullDevice.h +++ b/Kernel/Devices/NullDevice.h @@ -39,6 +39,9 @@ class NullDevice final : public CharacterDevice { static void initialize(); static NullDevice& the(); + // ^Device + virtual mode_t required_mode() const override { return 0666; } + private: // ^CharacterDevice virtual KResultOr read(FileDescription&, size_t, UserOrKernelBuffer&, size_t) override; diff --git a/Kernel/Devices/PS2MouseDevice.h b/Kernel/Devices/PS2MouseDevice.h index 386e690f090039..a0e0eb0db57d46 100644 --- a/Kernel/Devices/PS2MouseDevice.h +++ b/Kernel/Devices/PS2MouseDevice.h @@ -61,6 +61,9 @@ class PS2MouseDevice final : public IRQHandler enable_irq(); } + // ^Device + virtual mode_t required_mode() const override { return 0440; } + private: // ^IRQHandler void handle_vmmouse_absolute_pointer(); diff --git a/Kernel/Devices/RandomDevice.h b/Kernel/Devices/RandomDevice.h index c4199341071aba..fbf5bbaf7bf1f3 100644 --- a/Kernel/Devices/RandomDevice.h +++ b/Kernel/Devices/RandomDevice.h @@ -36,6 +36,9 @@ class RandomDevice final : public CharacterDevice { RandomDevice(); virtual ~RandomDevice() override; + // ^Device + virtual mode_t required_mode() const override { return 0666; } + private: // ^CharacterDevice virtual KResultOr read(FileDescription&, size_t, UserOrKernelBuffer&, size_t) override; diff --git a/Kernel/Devices/SB16.h b/Kernel/Devices/SB16.h index c780618d62265d..5c0df448f2e8c0 100644 --- a/Kernel/Devices/SB16.h +++ b/Kernel/Devices/SB16.h @@ -53,6 +53,9 @@ class SB16 final : public IRQHandler virtual const char* purpose() const override { return class_name(); } + // ^Device + virtual mode_t required_mode() const override { return 0220; } + private: // ^IRQHandler virtual void handle_irq(const RegisterState&) override; diff --git a/Kernel/Devices/SerialDevice.h b/Kernel/Devices/SerialDevice.h index 5c76f5abdfd080..fb5785284cfadd 100644 --- a/Kernel/Devices/SerialDevice.h +++ b/Kernel/Devices/SerialDevice.h @@ -123,6 +123,9 @@ class SerialDevice final : public CharacterDevice { DataReady = 0x01 << 0 }; + // ^Device + virtual mode_t required_mode() const override { return 0620; } + private: // ^CharacterDevice virtual const char* class_name() const override { return "SerialDevice"; } diff --git a/Kernel/Devices/ZeroDevice.h b/Kernel/Devices/ZeroDevice.h index f307c6f645ba92..8140174e16910a 100644 --- a/Kernel/Devices/ZeroDevice.h +++ b/Kernel/Devices/ZeroDevice.h @@ -36,6 +36,9 @@ class ZeroDevice final : public CharacterDevice { ZeroDevice(); virtual ~ZeroDevice() override; + // ^Device + virtual mode_t required_mode() const override { return 0666; } + private: // ^CharacterDevice virtual KResultOr read(FileDescription&, size_t, UserOrKernelBuffer&, size_t) override; diff --git a/Kernel/Storage/StorageDevice.h b/Kernel/Storage/StorageDevice.h index 8cc4f8fed957bf..21840b4d9233ed 100644 --- a/Kernel/Storage/StorageDevice.h +++ b/Kernel/Storage/StorageDevice.h @@ -53,6 +53,9 @@ class StorageDevice : public BlockDevice { virtual KResultOr write(FileDescription&, size_t, const UserOrKernelBuffer&, size_t) override; virtual bool can_write(const FileDescription&, size_t) const override; + // ^Device + virtual mode_t required_mode() const override { return 0600; } + protected: StorageDevice(const StorageController&, int, int, size_t, size_t); // ^DiskDevice diff --git a/Kernel/TTY/MasterPTY.h b/Kernel/TTY/MasterPTY.h index 69ba0a16dc9fa7..7744a58cdb03ee 100644 --- a/Kernel/TTY/MasterPTY.h +++ b/Kernel/TTY/MasterPTY.h @@ -48,6 +48,9 @@ class MasterPTY final : public CharacterDevice { virtual String absolute_path(const FileDescription&) const override; + // ^Device + virtual mode_t required_mode() const override { return 0640; } + private: // ^CharacterDevice virtual KResultOr read(FileDescription&, size_t, UserOrKernelBuffer&, size_t) override; diff --git a/Kernel/TTY/PTYMultiplexer.h b/Kernel/TTY/PTYMultiplexer.h index bb20469f38696c..9402ae11363418 100644 --- a/Kernel/TTY/PTYMultiplexer.h +++ b/Kernel/TTY/PTYMultiplexer.h @@ -55,6 +55,9 @@ class PTYMultiplexer final : public CharacterDevice { void notify_master_destroyed(Badge, unsigned index); + // ^Device + virtual mode_t required_mode() const override { return 0666; } + private: // ^CharacterDevice virtual const char* class_name() const override { return "PTYMultiplexer"; } diff --git a/Kernel/TTY/TTY.h b/Kernel/TTY/TTY.h index 8ba84a0dc66f2c..a60526078ce5a3 100644 --- a/Kernel/TTY/TTY.h +++ b/Kernel/TTY/TTY.h @@ -67,6 +67,9 @@ class TTY : public CharacterDevice { void set_default_termios(); void hang_up(); + // ^Device + virtual mode_t required_mode() const override { return 0620; } + protected: virtual ssize_t on_tty_write(const UserOrKernelBuffer&, ssize_t) = 0; void set_size(unsigned short columns, unsigned short rows);