mirror of
https://github.com/RGBCube/serenity
synced 2025-07-24 17:27:35 +00:00
Kernel: Move TTY subsystem to use KString instead of AK::String
This is minor progress on removing the `AK::String` API from the Kernel in the interest of improving OOM safety.
This commit is contained in:
parent
71f05c70b4
commit
9f6eabd73a
10 changed files with 36 additions and 27 deletions
|
@ -497,7 +497,7 @@ private:
|
||||||
process_object.add("nfds", process.fds().open_count());
|
process_object.add("nfds", process.fds().open_count());
|
||||||
process_object.add("name", process.name());
|
process_object.add("name", process.name());
|
||||||
process_object.add("executable", process.executable() ? process.executable()->absolute_path() : "");
|
process_object.add("executable", process.executable() ? process.executable()->absolute_path() : "");
|
||||||
process_object.add("tty", process.tty() ? process.tty()->tty_name() : "notty");
|
process_object.add("tty", process.tty() ? process.tty()->tty_name().view() : "notty"sv);
|
||||||
process_object.add("amount_virtual", process.address_space().amount_virtual());
|
process_object.add("amount_virtual", process.address_space().amount_virtual());
|
||||||
process_object.add("amount_resident", process.address_space().amount_resident());
|
process_object.add("amount_resident", process.address_space().amount_resident());
|
||||||
process_object.add("amount_dirty_private", process.address_space().amount_dirty_private());
|
process_object.add("amount_dirty_private", process.address_space().amount_dirty_private());
|
||||||
|
|
|
@ -18,7 +18,7 @@ KResultOr<FlatPtr> Process::sys$ttyname(int fd, Userspace<char*> buffer, size_t
|
||||||
auto description = TRY(fds().open_file_description(fd));
|
auto description = TRY(fds().open_file_description(fd));
|
||||||
if (!description->is_tty())
|
if (!description->is_tty())
|
||||||
return ENOTTY;
|
return ENOTTY;
|
||||||
auto tty_name = description->tty()->tty_name();
|
auto& tty_name = description->tty()->tty_name();
|
||||||
if (size < tty_name.length() + 1)
|
if (size < tty_name.length() + 1)
|
||||||
return ERANGE;
|
return ERANGE;
|
||||||
return copy_to_user(buffer, tty_name.characters(), tty_name.length() + 1);
|
return copy_to_user(buffer, tty_name.characters(), tty_name.length() + 1);
|
||||||
|
@ -32,7 +32,7 @@ KResultOr<FlatPtr> Process::sys$ptsname(int fd, Userspace<char*> buffer, size_t
|
||||||
auto* master_pty = description->master_pty();
|
auto* master_pty = description->master_pty();
|
||||||
if (!master_pty)
|
if (!master_pty)
|
||||||
return ENOTTY;
|
return ENOTTY;
|
||||||
auto pts_name = master_pty->pts_name();
|
auto& pts_name = master_pty->pts_name();
|
||||||
if (size < pts_name.length() + 1)
|
if (size < pts_name.length() + 1)
|
||||||
return ERANGE;
|
return ERANGE;
|
||||||
return copy_to_user(buffer, pts_name.characters(), pts_name.length() + 1);
|
return copy_to_user(buffer, pts_name.characters(), pts_name.length() + 1);
|
||||||
|
|
|
@ -18,21 +18,25 @@ namespace Kernel {
|
||||||
|
|
||||||
KResultOr<NonnullRefPtr<MasterPTY>> MasterPTY::try_create(unsigned int index)
|
KResultOr<NonnullRefPtr<MasterPTY>> MasterPTY::try_create(unsigned int index)
|
||||||
{
|
{
|
||||||
|
// FIXME: Don't make a temporary String here
|
||||||
|
auto pts_name = TRY(KString::try_create(String::formatted("/dev/pts/{}", index)));
|
||||||
|
auto tty_name = TRY(pts_name->try_clone());
|
||||||
|
|
||||||
auto buffer = TRY(DoubleBuffer::try_create());
|
auto buffer = TRY(DoubleBuffer::try_create());
|
||||||
auto master_pty = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) MasterPTY(index, move(buffer))));
|
auto master_pty = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) MasterPTY(index, move(buffer), move(pts_name))));
|
||||||
auto slave_pty = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) SlavePTY(*master_pty, index)));
|
auto slave_pty = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) SlavePTY(*master_pty, index, move(tty_name))));
|
||||||
master_pty->m_slave = slave_pty;
|
master_pty->m_slave = slave_pty;
|
||||||
master_pty->after_inserting();
|
master_pty->after_inserting();
|
||||||
slave_pty->after_inserting();
|
slave_pty->after_inserting();
|
||||||
return master_pty;
|
return master_pty;
|
||||||
}
|
}
|
||||||
|
|
||||||
MasterPTY::MasterPTY(unsigned index, NonnullOwnPtr<DoubleBuffer> buffer)
|
MasterPTY::MasterPTY(unsigned index, NonnullOwnPtr<DoubleBuffer> buffer, NonnullOwnPtr<KString> pts_name)
|
||||||
: CharacterDevice(200, index)
|
: CharacterDevice(200, index)
|
||||||
, m_index(index)
|
, m_index(index)
|
||||||
, m_buffer(move(buffer))
|
, m_buffer(move(buffer))
|
||||||
|
, m_pts_name(move(pts_name))
|
||||||
{
|
{
|
||||||
m_pts_name = String::formatted("/dev/pts/{}", m_index);
|
|
||||||
auto& process = Process::current();
|
auto& process = Process::current();
|
||||||
set_uid(process.uid());
|
set_uid(process.uid());
|
||||||
set_gid(process.gid());
|
set_gid(process.gid());
|
||||||
|
@ -49,9 +53,9 @@ MasterPTY::~MasterPTY()
|
||||||
PTYMultiplexer::the().notify_master_destroyed({}, m_index);
|
PTYMultiplexer::the().notify_master_destroyed({}, m_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
String MasterPTY::pts_name() const
|
KString const& MasterPTY::pts_name() const
|
||||||
{
|
{
|
||||||
return m_pts_name;
|
return *m_pts_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResultOr<size_t> MasterPTY::read(OpenFileDescription&, u64, UserOrKernelBuffer& buffer, size_t size)
|
KResultOr<size_t> MasterPTY::read(OpenFileDescription&, u64, UserOrKernelBuffer& buffer, size_t size)
|
||||||
|
|
|
@ -20,7 +20,7 @@ public:
|
||||||
virtual ~MasterPTY() override;
|
virtual ~MasterPTY() override;
|
||||||
|
|
||||||
unsigned index() const { return m_index; }
|
unsigned index() const { return m_index; }
|
||||||
String pts_name() const;
|
KString const& pts_name() const;
|
||||||
KResultOr<size_t> on_slave_write(const UserOrKernelBuffer&, size_t);
|
KResultOr<size_t> on_slave_write(const UserOrKernelBuffer&, size_t);
|
||||||
bool can_write_from_slave() const;
|
bool can_write_from_slave() const;
|
||||||
void notify_slave_closed(Badge<SlavePTY>);
|
void notify_slave_closed(Badge<SlavePTY>);
|
||||||
|
@ -29,7 +29,7 @@ public:
|
||||||
virtual KResultOr<NonnullOwnPtr<KString>> pseudo_path(const OpenFileDescription&) const override;
|
virtual KResultOr<NonnullOwnPtr<KString>> pseudo_path(const OpenFileDescription&) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit MasterPTY(unsigned index, NonnullOwnPtr<DoubleBuffer> buffer);
|
explicit MasterPTY(unsigned index, NonnullOwnPtr<DoubleBuffer> buffer, NonnullOwnPtr<KString> pts_name);
|
||||||
// ^CharacterDevice
|
// ^CharacterDevice
|
||||||
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
virtual KResultOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||||
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
virtual KResultOr<size_t> write(OpenFileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
|
||||||
|
@ -44,7 +44,7 @@ private:
|
||||||
unsigned m_index;
|
unsigned m_index;
|
||||||
bool m_closed { false };
|
bool m_closed { false };
|
||||||
NonnullOwnPtr<DoubleBuffer> m_buffer;
|
NonnullOwnPtr<DoubleBuffer> m_buffer;
|
||||||
String m_pts_name;
|
NonnullOwnPtr<KString> m_pts_name;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,12 +35,12 @@ bool SlavePTY::unref() const
|
||||||
return did_hit_zero;
|
return did_hit_zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
SlavePTY::SlavePTY(MasterPTY& master, unsigned index)
|
SlavePTY::SlavePTY(MasterPTY& master, unsigned index, NonnullOwnPtr<KString> tty_name)
|
||||||
: TTY(201, index)
|
: TTY(201, index)
|
||||||
, m_master(master)
|
, m_master(master)
|
||||||
, m_index(index)
|
, m_index(index)
|
||||||
|
, m_tty_name(move(tty_name))
|
||||||
{
|
{
|
||||||
m_tty_name = String::formatted("/dev/pts/{}", m_index);
|
|
||||||
auto& process = Process::current();
|
auto& process = Process::current();
|
||||||
set_uid(process.uid());
|
set_uid(process.uid());
|
||||||
set_gid(process.gid());
|
set_gid(process.gid());
|
||||||
|
@ -54,9 +54,9 @@ SlavePTY::~SlavePTY()
|
||||||
dbgln_if(SLAVEPTY_DEBUG, "~SlavePTY({})", m_index);
|
dbgln_if(SLAVEPTY_DEBUG, "~SlavePTY({})", m_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
String const& SlavePTY::tty_name() const
|
KString const& SlavePTY::tty_name() const
|
||||||
{
|
{
|
||||||
return m_tty_name;
|
return *m_tty_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SlavePTY::echo(u8 ch)
|
void SlavePTY::echo(u8 ch)
|
||||||
|
|
|
@ -27,7 +27,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// ^TTY
|
// ^TTY
|
||||||
virtual String const& tty_name() const override;
|
virtual KString const& tty_name() const override;
|
||||||
virtual KResultOr<size_t> on_tty_write(const UserOrKernelBuffer&, size_t) override;
|
virtual KResultOr<size_t> on_tty_write(const UserOrKernelBuffer&, size_t) override;
|
||||||
virtual void echo(u8) override;
|
virtual void echo(u8) override;
|
||||||
|
|
||||||
|
@ -39,12 +39,12 @@ private:
|
||||||
virtual KResult close() override;
|
virtual KResult close() override;
|
||||||
|
|
||||||
friend class MasterPTY;
|
friend class MasterPTY;
|
||||||
SlavePTY(MasterPTY&, unsigned index);
|
SlavePTY(MasterPTY&, unsigned index, NonnullOwnPtr<KString> pts_name);
|
||||||
|
|
||||||
RefPtr<MasterPTY> m_master;
|
RefPtr<MasterPTY> m_master;
|
||||||
time_t m_time_of_last_write { 0 };
|
time_t m_time_of_last_write { 0 };
|
||||||
unsigned m_index { 0 };
|
unsigned m_index { 0 };
|
||||||
String m_tty_name;
|
NonnullOwnPtr<KString> m_tty_name;
|
||||||
|
|
||||||
mutable IntrusiveListNode<SlavePTY> m_list_node;
|
mutable IntrusiveListNode<SlavePTY> m_list_node;
|
||||||
|
|
||||||
|
|
|
@ -578,7 +578,7 @@ KResult TTY::ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg)
|
||||||
|
|
||||||
KResultOr<NonnullOwnPtr<KString>> TTY::pseudo_path(const OpenFileDescription&) const
|
KResultOr<NonnullOwnPtr<KString>> TTY::pseudo_path(const OpenFileDescription&) const
|
||||||
{
|
{
|
||||||
return KString::try_create(tty_name());
|
return tty_name().try_clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TTY::set_size(unsigned short columns, unsigned short rows)
|
void TTY::set_size(unsigned short columns, unsigned short rows)
|
||||||
|
|
|
@ -28,7 +28,7 @@ public:
|
||||||
virtual KResult ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg) override final;
|
virtual KResult ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg) override final;
|
||||||
virtual KResultOr<NonnullOwnPtr<KString>> pseudo_path(const OpenFileDescription&) const override;
|
virtual KResultOr<NonnullOwnPtr<KString>> pseudo_path(const OpenFileDescription&) const override;
|
||||||
|
|
||||||
virtual String const& tty_name() const = 0;
|
virtual KString const& tty_name() const = 0;
|
||||||
|
|
||||||
unsigned short rows() const { return m_rows; }
|
unsigned short rows() const { return m_rows; }
|
||||||
unsigned short columns() const { return m_columns; }
|
unsigned short columns() const { return m_columns; }
|
||||||
|
|
|
@ -103,7 +103,12 @@ void VirtualConsole::set_graphical(bool graphical)
|
||||||
|
|
||||||
UNMAP_AFTER_INIT NonnullRefPtr<VirtualConsole> VirtualConsole::create(size_t index)
|
UNMAP_AFTER_INIT NonnullRefPtr<VirtualConsole> VirtualConsole::create(size_t index)
|
||||||
{
|
{
|
||||||
auto virtual_console_or_error = DeviceManagement::try_create_device<VirtualConsole>(index);
|
// FIXME: Don't make a temporary String here
|
||||||
|
auto pts_name_or_error = KString::try_create(String::formatted("/dev/tty/{}", index));
|
||||||
|
VERIFY(!pts_name_or_error.is_error());
|
||||||
|
auto pts_name = pts_name_or_error.release_value();
|
||||||
|
|
||||||
|
auto virtual_console_or_error = DeviceManagement::try_create_device<VirtualConsole>(index, move(pts_name));
|
||||||
// FIXME: Find a way to propagate errors
|
// FIXME: Find a way to propagate errors
|
||||||
VERIFY(!virtual_console_or_error.is_error());
|
VERIFY(!virtual_console_or_error.is_error());
|
||||||
return virtual_console_or_error.release_value();
|
return virtual_console_or_error.release_value();
|
||||||
|
@ -123,7 +128,6 @@ UNMAP_AFTER_INIT NonnullRefPtr<VirtualConsole> VirtualConsole::create_with_prese
|
||||||
|
|
||||||
UNMAP_AFTER_INIT void VirtualConsole::initialize()
|
UNMAP_AFTER_INIT void VirtualConsole::initialize()
|
||||||
{
|
{
|
||||||
m_tty_name = String::formatted("/dev/tty{}", m_index);
|
|
||||||
VERIFY(GraphicsManagement::the().console());
|
VERIFY(GraphicsManagement::the().console());
|
||||||
set_size(GraphicsManagement::the().console()->max_column(), GraphicsManagement::the().console()->max_row());
|
set_size(GraphicsManagement::the().console()->max_column(), GraphicsManagement::the().console()->max_row());
|
||||||
m_console_impl.set_size(GraphicsManagement::the().console()->max_column(), GraphicsManagement::the().console()->max_row());
|
m_console_impl.set_size(GraphicsManagement::the().console()->max_column(), GraphicsManagement::the().console()->max_row());
|
||||||
|
@ -174,9 +178,10 @@ void VirtualConsole::refresh_after_resolution_change()
|
||||||
flush_dirty_lines();
|
flush_dirty_lines();
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT VirtualConsole::VirtualConsole(const unsigned index)
|
UNMAP_AFTER_INIT VirtualConsole::VirtualConsole(const unsigned index, NonnullOwnPtr<KString> tty_name)
|
||||||
: TTY(4, index)
|
: TTY(4, index)
|
||||||
, m_index(index)
|
, m_index(index)
|
||||||
|
, m_tty_name(move(tty_name))
|
||||||
, m_console_impl(*this)
|
, m_console_impl(*this)
|
||||||
{
|
{
|
||||||
initialize();
|
initialize();
|
||||||
|
|
|
@ -86,13 +86,13 @@ public:
|
||||||
void emit_char(char);
|
void emit_char(char);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit VirtualConsole(const unsigned index);
|
explicit VirtualConsole(const unsigned index, NonnullOwnPtr<KString> tty_name);
|
||||||
// ^KeyboardClient
|
// ^KeyboardClient
|
||||||
virtual void on_key_pressed(KeyEvent) override;
|
virtual void on_key_pressed(KeyEvent) override;
|
||||||
|
|
||||||
// ^TTY
|
// ^TTY
|
||||||
virtual KResultOr<size_t> on_tty_write(const UserOrKernelBuffer&, size_t) override;
|
virtual KResultOr<size_t> on_tty_write(const UserOrKernelBuffer&, size_t) override;
|
||||||
virtual String const& tty_name() const override { return m_tty_name; }
|
virtual KString const& tty_name() const override { return *m_tty_name; }
|
||||||
virtual void echo(u8) override;
|
virtual void echo(u8) override;
|
||||||
|
|
||||||
// ^TerminalClient
|
// ^TerminalClient
|
||||||
|
@ -114,7 +114,7 @@ private:
|
||||||
bool m_active { false };
|
bool m_active { false };
|
||||||
bool m_graphical { false };
|
bool m_graphical { false };
|
||||||
|
|
||||||
String m_tty_name;
|
NonnullOwnPtr<KString> m_tty_name;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initialize();
|
void initialize();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue