summaryrefslogtreecommitdiff
path: root/Kernel/Devices/Device.h
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-04-03 12:36:40 +0200
committerAndreas Kling <awesomekling@gmail.com>2019-04-03 12:36:40 +0200
commitab43658c5537c03d075f8abc57fe90e940023779 (patch)
tree01bd0f73784dd42372dd8a8f065a3a8c6b3d9858 /Kernel/Devices/Device.h
parent072ea7eece8607efec8e2824307b0a6209e4d014 (diff)
downloadserenity-ab43658c5537c03d075f8abc57fe90e940023779.zip
Kernel: Move devices into Kernel/Devices/.
Diffstat (limited to 'Kernel/Devices/Device.h')
-rw-r--r--Kernel/Devices/Device.h51
1 files changed, 51 insertions, 0 deletions
diff --git a/Kernel/Devices/Device.h b/Kernel/Devices/Device.h
new file mode 100644
index 0000000000..27e31bad8d
--- /dev/null
+++ b/Kernel/Devices/Device.h
@@ -0,0 +1,51 @@
+#pragma once
+
+#include <AK/Retainable.h>
+#include <AK/Types.h>
+#include "Limits.h"
+#include "FileDescriptor.h"
+
+class Process;
+
+class Device : public Retainable<Device> {
+public:
+ virtual ~Device();
+
+ InodeMetadata metadata() const { return { }; }
+
+ virtual KResultOr<Retained<FileDescriptor>> open(int options);
+ virtual void close();
+
+ virtual bool can_read(Process&) const = 0;
+ virtual bool can_write(Process&) const = 0;
+
+ virtual ssize_t read(Process&, byte*, ssize_t) = 0;
+ virtual ssize_t write(Process&, const byte*, ssize_t) = 0;
+
+ unsigned major() const { return m_major; }
+ unsigned minor() const { return m_minor; }
+
+ virtual bool is_tty() const { return false; }
+ virtual bool is_master_pty() const { return false; }
+
+ virtual int ioctl(Process&, unsigned request, unsigned arg);
+
+ virtual const char* class_name() const = 0;
+
+ uid_t uid() const { return m_uid; }
+ uid_t gid() const { return m_gid; }
+
+ virtual bool is_block_device() const { return false; }
+ virtual bool is_character_device() const { return false; }
+
+protected:
+ Device(unsigned major, unsigned minor);
+ void set_uid(uid_t uid) { m_uid = uid; }
+ void set_gid(gid_t gid) { m_gid = gid; }
+
+private:
+ unsigned m_major { 0 };
+ unsigned m_minor { 0 };
+ uid_t m_uid { 0 };
+ gid_t m_gid { 0 };
+};