mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 03:57:44 +00:00
Kernel: Have File virtuals take a FileDescriptor& rather than a Process&.
This will allow us to implement different behaviors depending on the role of the descriptor a File is being accessed through.
This commit is contained in:
parent
3761bc3ed7
commit
8cbb7f101f
39 changed files with 156 additions and 155 deletions
|
@ -31,14 +31,14 @@ String MasterPTY::pts_name() const
|
|||
return m_pts_name;
|
||||
}
|
||||
|
||||
ssize_t MasterPTY::read(Process&, byte* buffer, ssize_t size)
|
||||
ssize_t MasterPTY::read(FileDescriptor&, byte* buffer, ssize_t size)
|
||||
{
|
||||
if (!m_slave && m_buffer.is_empty())
|
||||
return 0;
|
||||
return m_buffer.read(buffer, size);
|
||||
}
|
||||
|
||||
ssize_t MasterPTY::write(Process&, const byte* buffer, ssize_t size)
|
||||
ssize_t MasterPTY::write(FileDescriptor&, const byte* buffer, ssize_t size)
|
||||
{
|
||||
if (!m_slave)
|
||||
return -EIO;
|
||||
|
@ -46,14 +46,14 @@ ssize_t MasterPTY::write(Process&, const byte* buffer, ssize_t size)
|
|||
return size;
|
||||
}
|
||||
|
||||
bool MasterPTY::can_read(Process&) const
|
||||
bool MasterPTY::can_read(FileDescriptor&) const
|
||||
{
|
||||
if (!m_slave)
|
||||
return true;
|
||||
return !m_buffer.is_empty();
|
||||
}
|
||||
|
||||
bool MasterPTY::can_write(Process&) const
|
||||
bool MasterPTY::can_write(FileDescriptor&) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
@ -96,9 +96,9 @@ void MasterPTY::close()
|
|||
}
|
||||
}
|
||||
|
||||
int MasterPTY::ioctl(Process& process, unsigned request, unsigned arg)
|
||||
int MasterPTY::ioctl(FileDescriptor& descriptor, unsigned request, unsigned arg)
|
||||
{
|
||||
if (request == TIOCSWINSZ)
|
||||
return m_slave->ioctl(process, request, arg);
|
||||
return m_slave->ioctl(descriptor, request, arg);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
|
@ -20,13 +20,13 @@ public:
|
|||
|
||||
private:
|
||||
// ^CharacterDevice
|
||||
virtual ssize_t read(Process&, byte*, ssize_t) override;
|
||||
virtual ssize_t write(Process&, const byte*, ssize_t) override;
|
||||
virtual bool can_read(Process&) const override;
|
||||
virtual bool can_write(Process&) const override;
|
||||
virtual ssize_t read(FileDescriptor&, byte*, ssize_t) override;
|
||||
virtual ssize_t write(FileDescriptor&, const byte*, ssize_t) override;
|
||||
virtual bool can_read(FileDescriptor&) const override;
|
||||
virtual bool can_write(FileDescriptor&) const override;
|
||||
virtual void close() override;
|
||||
virtual bool is_master_pty() const override { return true; }
|
||||
virtual int ioctl(Process&, unsigned request, unsigned arg) override;
|
||||
virtual int ioctl(FileDescriptor&, unsigned request, unsigned arg) override;
|
||||
virtual const char* class_name() const override { return "MasterPTY"; }
|
||||
|
||||
RetainPtr<SlavePTY> m_slave;
|
||||
|
|
|
@ -16,10 +16,10 @@ public:
|
|||
|
||||
// ^CharacterDevice
|
||||
virtual KResultOr<Retained<FileDescriptor>> open(int options) override;
|
||||
virtual ssize_t read(Process&, byte*, ssize_t) override { return 0; }
|
||||
virtual ssize_t write(Process&, const byte*, ssize_t) override { return 0; }
|
||||
virtual bool can_read(Process&) const override { return true; }
|
||||
virtual bool can_write(Process&) const override { return true; }
|
||||
virtual ssize_t read(FileDescriptor&, byte*, ssize_t) override { return 0; }
|
||||
virtual ssize_t write(FileDescriptor&, const byte*, ssize_t) override { return 0; }
|
||||
virtual bool can_read(FileDescriptor&) const override { return true; }
|
||||
virtual bool can_write(FileDescriptor&) const override { return true; }
|
||||
|
||||
void notify_master_destroyed(Badge<MasterPTY>, unsigned index);
|
||||
|
||||
|
|
|
@ -41,23 +41,23 @@ ssize_t SlavePTY::on_tty_write(const byte* data, ssize_t size)
|
|||
return m_master->on_slave_write(data, size);
|
||||
}
|
||||
|
||||
bool SlavePTY::can_write(Process&) const
|
||||
bool SlavePTY::can_write(FileDescriptor&) const
|
||||
{
|
||||
return m_master->can_write_from_slave();
|
||||
}
|
||||
|
||||
bool SlavePTY::can_read(Process& process) const
|
||||
bool SlavePTY::can_read(FileDescriptor& descriptor) const
|
||||
{
|
||||
if (m_master->is_closed())
|
||||
return true;
|
||||
return TTY::can_read(process);
|
||||
return TTY::can_read(descriptor);
|
||||
}
|
||||
|
||||
ssize_t SlavePTY::read(Process& process, byte* buffer, ssize_t size)
|
||||
ssize_t SlavePTY::read(FileDescriptor& descriptor, byte* buffer, ssize_t size)
|
||||
{
|
||||
if (m_master->is_closed())
|
||||
return 0;
|
||||
return TTY::read(process, buffer, size);
|
||||
return TTY::read(descriptor, buffer, size);
|
||||
}
|
||||
|
||||
void SlavePTY::close()
|
||||
|
|
|
@ -21,9 +21,9 @@ private:
|
|||
virtual ssize_t on_tty_write(const byte*, ssize_t) override;
|
||||
|
||||
// ^CharacterDevice
|
||||
virtual bool can_read(Process&) const override;
|
||||
virtual ssize_t read(Process&, byte*, ssize_t) override;
|
||||
virtual bool can_write(Process&) const override;
|
||||
virtual bool can_read(FileDescriptor&) const override;
|
||||
virtual ssize_t read(FileDescriptor&, byte*, ssize_t) override;
|
||||
virtual bool can_write(FileDescriptor&) const override;
|
||||
virtual const char* class_name() const override { return "SlavePTY"; }
|
||||
virtual void close() override;
|
||||
|
||||
|
|
|
@ -24,12 +24,12 @@ void TTY::set_default_termios()
|
|||
memcpy(m_termios.c_cc, default_cc, sizeof(default_cc));
|
||||
}
|
||||
|
||||
ssize_t TTY::read(Process&, byte* buffer, ssize_t size)
|
||||
ssize_t TTY::read(FileDescriptor&, byte* buffer, ssize_t size)
|
||||
{
|
||||
return m_buffer.read(buffer, size);
|
||||
}
|
||||
|
||||
ssize_t TTY::write(Process&, const byte* buffer, ssize_t size)
|
||||
ssize_t TTY::write(FileDescriptor&, const byte* buffer, ssize_t size)
|
||||
{
|
||||
#ifdef TTY_DEBUG
|
||||
dbgprintf("TTY::write {%u} ", size);
|
||||
|
@ -42,12 +42,12 @@ ssize_t TTY::write(Process&, const byte* buffer, ssize_t size)
|
|||
return size;
|
||||
}
|
||||
|
||||
bool TTY::can_read(Process&) const
|
||||
bool TTY::can_read(FileDescriptor&) const
|
||||
{
|
||||
return !m_buffer.is_empty();
|
||||
}
|
||||
|
||||
bool TTY::can_write(Process&) const
|
||||
bool TTY::can_write(FileDescriptor&) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
@ -106,8 +106,9 @@ void TTY::set_termios(const termios& t)
|
|||
);
|
||||
}
|
||||
|
||||
int TTY::ioctl(Process& process, unsigned request, unsigned arg)
|
||||
int TTY::ioctl(FileDescriptor&, unsigned request, unsigned arg)
|
||||
{
|
||||
auto& process = current->process();
|
||||
pid_t pgid;
|
||||
termios* tp;
|
||||
winsize* ws;
|
||||
|
|
|
@ -10,11 +10,11 @@ class TTY : public CharacterDevice {
|
|||
public:
|
||||
virtual ~TTY() override;
|
||||
|
||||
virtual ssize_t read(Process&, byte*, ssize_t) override;
|
||||
virtual ssize_t write(Process&, const byte*, ssize_t) override;
|
||||
virtual bool can_read(Process&) const override;
|
||||
virtual bool can_write(Process&) const override;
|
||||
virtual int ioctl(Process&, unsigned request, unsigned arg) override final;
|
||||
virtual ssize_t read(FileDescriptor&, byte*, ssize_t) override;
|
||||
virtual ssize_t write(FileDescriptor&, const byte*, ssize_t) override;
|
||||
virtual bool can_read(FileDescriptor&) const override;
|
||||
virtual bool can_write(FileDescriptor&) const override;
|
||||
virtual int ioctl(FileDescriptor&, unsigned request, unsigned arg) override final;
|
||||
virtual String absolute_path() const override { return tty_name(); }
|
||||
|
||||
virtual String tty_name() const = 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue