mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 01:08:11 +00:00
Kernel: Make /proc/PID/fds display something useful for character devices.
This commit is contained in:
parent
786b903d62
commit
e6fc84e234
14 changed files with 46 additions and 6 deletions
|
@ -18,10 +18,12 @@ public:
|
||||||
Console();
|
Console();
|
||||||
virtual ~Console() override;
|
virtual ~Console() override;
|
||||||
|
|
||||||
|
// ^CharacterDevice
|
||||||
virtual bool can_read(Process&) const override;
|
virtual bool can_read(Process&) const override;
|
||||||
virtual bool can_write(Process&) const override { return true; }
|
virtual bool can_write(Process&) const override { return true; }
|
||||||
virtual ssize_t read(Process&, byte* buffer, size_t size) override;
|
virtual ssize_t read(Process&, byte* buffer, size_t size) override;
|
||||||
virtual ssize_t write(Process&, const byte* data, size_t size) override;
|
virtual ssize_t write(Process&, const byte* data, size_t size) override;
|
||||||
|
virtual const char* class_name() const override { return "Console"; }
|
||||||
|
|
||||||
void setImplementation(ConsoleImplementation* implementation) { m_implementation = implementation; }
|
void setImplementation(ConsoleImplementation* implementation) { m_implementation = implementation; }
|
||||||
|
|
||||||
|
|
|
@ -13,4 +13,5 @@ private:
|
||||||
virtual ssize_t write(Process&, const byte* buffer, size_t bufferSize) override;
|
virtual ssize_t write(Process&, const byte* buffer, size_t bufferSize) override;
|
||||||
virtual bool can_read(Process&) const override;
|
virtual bool can_read(Process&) const override;
|
||||||
virtual bool can_write(Process&) const override { return true; }
|
virtual bool can_write(Process&) const override { return true; }
|
||||||
|
virtual const char* class_name() const override { return "GUIEventDevice"; }
|
||||||
};
|
};
|
||||||
|
|
|
@ -42,6 +42,9 @@ private:
|
||||||
// ^IRQHandler
|
// ^IRQHandler
|
||||||
virtual void handle_irq() override;
|
virtual void handle_irq() override;
|
||||||
|
|
||||||
|
// ^CharacterDevice
|
||||||
|
virtual const char* class_name() const override { return "Keyboard"; }
|
||||||
|
|
||||||
void emit(byte);
|
void emit(byte);
|
||||||
|
|
||||||
KeyboardClient* m_client { nullptr };
|
KeyboardClient* m_client { nullptr };
|
||||||
|
|
|
@ -10,6 +10,7 @@ public:
|
||||||
explicit MasterPTY(unsigned index);
|
explicit MasterPTY(unsigned index);
|
||||||
virtual ~MasterPTY() override;
|
virtual ~MasterPTY() override;
|
||||||
|
|
||||||
|
// ^CharacterDevice
|
||||||
virtual ssize_t read(Process&, byte*, size_t) override;
|
virtual ssize_t read(Process&, byte*, size_t) override;
|
||||||
virtual ssize_t write(Process&, const byte*, size_t) override;
|
virtual ssize_t write(Process&, const byte*, size_t) override;
|
||||||
virtual bool can_read(Process&) const override;
|
virtual bool can_read(Process&) const override;
|
||||||
|
@ -21,6 +22,9 @@ public:
|
||||||
void on_slave_write(const byte*, size_t);
|
void on_slave_write(const byte*, size_t);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
// ^CharacterDevice
|
||||||
|
virtual const char* class_name() const override { return "MasterPTY"; }
|
||||||
|
|
||||||
SlavePTY& m_slave;
|
SlavePTY& m_slave;
|
||||||
unsigned m_index;
|
unsigned m_index;
|
||||||
DoubleBuffer m_buffer;
|
DoubleBuffer m_buffer;
|
||||||
|
|
|
@ -20,6 +20,9 @@ private:
|
||||||
// ^IRQHandler
|
// ^IRQHandler
|
||||||
virtual void handle_irq() override;
|
virtual void handle_irq() override;
|
||||||
|
|
||||||
|
// ^CharacterDevice
|
||||||
|
virtual const char* class_name() const override { return "PS2MouseDevice"; }
|
||||||
|
|
||||||
void initialize();
|
void initialize();
|
||||||
void prepare_for_input();
|
void prepare_for_input();
|
||||||
void prepare_for_output();
|
void prepare_for_output();
|
||||||
|
|
|
@ -19,6 +19,9 @@ public:
|
||||||
virtual bool can_write(Process&) const override { return true; }
|
virtual bool can_write(Process&) const override { return true; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
// ^CharacterDevice
|
||||||
|
virtual const char* class_name() const override { return "PTYMultiplexer"; }
|
||||||
|
|
||||||
Lock m_lock;
|
Lock m_lock;
|
||||||
Vector<RetainPtr<MasterPTY>> m_freelist;
|
Vector<RetainPtr<MasterPTY>> m_freelist;
|
||||||
};
|
};
|
||||||
|
|
|
@ -8,16 +8,18 @@ class SlavePTY final : public TTY {
|
||||||
public:
|
public:
|
||||||
virtual ~SlavePTY() override;
|
virtual ~SlavePTY() override;
|
||||||
|
|
||||||
virtual String tty_name() const override;
|
|
||||||
|
|
||||||
void on_master_write(const byte*, size_t);
|
void on_master_write(const byte*, size_t);
|
||||||
unsigned index() const { return m_index; }
|
unsigned index() const { return m_index; }
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void on_tty_write(const byte*, size_t) override;
|
|
||||||
virtual bool can_write(Process&) const override;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
// ^TTY
|
||||||
|
virtual String tty_name() const override;
|
||||||
|
virtual void on_tty_write(const byte*, size_t) override;
|
||||||
|
|
||||||
|
// ^CharacterDevice
|
||||||
|
virtual bool can_write(Process&) const override;
|
||||||
|
virtual const char* class_name() const override { return "SlavePTY"; }
|
||||||
|
|
||||||
friend class MasterPTY;
|
friend class MasterPTY;
|
||||||
SlavePTY(MasterPTY&, unsigned index);
|
SlavePTY(MasterPTY&, unsigned index);
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,9 @@ private:
|
||||||
virtual void on_tty_write(const byte*, size_t) override;
|
virtual void on_tty_write(const byte*, size_t) override;
|
||||||
virtual String tty_name() const override;
|
virtual String tty_name() const override;
|
||||||
|
|
||||||
|
// ^CharacterDevice
|
||||||
|
virtual const char* class_name() const override { return "VirtualConsole"; }
|
||||||
|
|
||||||
void set_active(bool);
|
void set_active(bool);
|
||||||
void on_char(byte);
|
void on_char(byte);
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,8 @@ public:
|
||||||
|
|
||||||
virtual int ioctl(Process&, unsigned request, unsigned arg);
|
virtual int ioctl(Process&, unsigned request, unsigned arg);
|
||||||
|
|
||||||
|
virtual const char* class_name() const = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
CharacterDevice(unsigned major, unsigned minor) : m_major(major), m_minor(minor) { }
|
CharacterDevice(unsigned major, unsigned minor) : m_major(major), m_minor(minor) { }
|
||||||
|
|
||||||
|
|
|
@ -297,6 +297,11 @@ String FileDescriptor::absolute_path()
|
||||||
ksprintf(buf, "fifo:%x", m_fifo.ptr());
|
ksprintf(buf, "fifo:%x", m_fifo.ptr());
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
if (is_character_device()) {
|
||||||
|
char buf[128];
|
||||||
|
ksprintf(buf, "device:%u,%u (%s)", m_device->major(), m_device->minor(), m_device->class_name());
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
ASSERT(m_inode);
|
ASSERT(m_inode);
|
||||||
return VFS::the().absolute_path(*m_inode);
|
return VFS::the().absolute_path(*m_inode);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,9 +8,12 @@ public:
|
||||||
FullDevice();
|
FullDevice();
|
||||||
virtual ~FullDevice() override;
|
virtual ~FullDevice() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// ^CharacterDevice
|
||||||
virtual ssize_t read(Process&, byte* buffer, size_t bufferSize) override;
|
virtual ssize_t read(Process&, byte* buffer, size_t bufferSize) override;
|
||||||
virtual ssize_t write(Process&, const byte* buffer, size_t bufferSize) override;
|
virtual ssize_t write(Process&, const byte* buffer, size_t bufferSize) override;
|
||||||
virtual bool can_read(Process&) const override;
|
virtual bool can_read(Process&) const override;
|
||||||
virtual bool can_write(Process&) const override { return true; }
|
virtual bool can_write(Process&) const override { return true; }
|
||||||
|
virtual const char* class_name() const override { return "FullDevice"; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -8,9 +8,12 @@ public:
|
||||||
NullDevice();
|
NullDevice();
|
||||||
virtual ~NullDevice() override;
|
virtual ~NullDevice() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// ^CharacterDevice
|
||||||
virtual ssize_t read(Process&, byte* buffer, size_t bufferSize) override;
|
virtual ssize_t read(Process&, byte* buffer, size_t bufferSize) override;
|
||||||
virtual ssize_t write(Process&, const byte* buffer, size_t bufferSize) override;
|
virtual ssize_t write(Process&, const byte* buffer, size_t bufferSize) override;
|
||||||
virtual bool can_write(Process&) const override { return true; }
|
virtual bool can_write(Process&) const override { return true; }
|
||||||
virtual bool can_read(Process&) const override;
|
virtual bool can_read(Process&) const override;
|
||||||
|
virtual const char* class_name() const override { return "CharacterDevice"; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -8,9 +8,12 @@ public:
|
||||||
RandomDevice();
|
RandomDevice();
|
||||||
virtual ~RandomDevice() override;
|
virtual ~RandomDevice() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// ^CharacterDevice
|
||||||
virtual ssize_t read(Process&, byte* buffer, size_t bufferSize) override;
|
virtual ssize_t read(Process&, byte* buffer, size_t bufferSize) override;
|
||||||
virtual ssize_t write(Process&, const byte* buffer, size_t bufferSize) override;
|
virtual ssize_t write(Process&, const byte* buffer, size_t bufferSize) override;
|
||||||
virtual bool can_read(Process&) const override;
|
virtual bool can_read(Process&) const override;
|
||||||
virtual bool can_write(Process&) const override { return true; }
|
virtual bool can_write(Process&) const override { return true; }
|
||||||
|
virtual const char* class_name() const override { return "RandomDevice"; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -8,9 +8,12 @@ public:
|
||||||
ZeroDevice();
|
ZeroDevice();
|
||||||
virtual ~ZeroDevice() override;
|
virtual ~ZeroDevice() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// ^CharacterDevice
|
||||||
virtual ssize_t read(Process&, byte* buffer, size_t bufferSize) override;
|
virtual ssize_t read(Process&, byte* buffer, size_t bufferSize) override;
|
||||||
virtual ssize_t write(Process&, const byte* buffer, size_t bufferSize) override;
|
virtual ssize_t write(Process&, const byte* buffer, size_t bufferSize) override;
|
||||||
virtual bool can_read(Process&) const override;
|
virtual bool can_read(Process&) const override;
|
||||||
virtual bool can_write(Process&) const override { return true; }
|
virtual bool can_write(Process&) const override { return true; }
|
||||||
|
virtual const char* class_name() const override { return "ZeroDevice"; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue