Kernel: Add /dev/tty symlink that targets the current tty

This commit is contained in:
Bananymous
2023-09-05 00:59:29 +03:00
parent 35fd30ee29
commit ddd36af0f1
9 changed files with 35 additions and 12 deletions

View File

@@ -52,7 +52,7 @@ namespace Kernel
);
}
void DevFileSystem::add_device(BAN::StringView path, BAN::RefPtr<Device> device)
void DevFileSystem::add_device(BAN::StringView path, BAN::RefPtr<RamInode> device)
{
ASSERT(!path.contains('/'));
MUST(reinterpret_cast<RamDirectoryInode*>(root_inode().ptr())->add_inode(path, device));

View File

@@ -207,7 +207,9 @@ namespace Kernel
: TTY(0660, 0, 0)
, m_serial(serial)
, m_rdev(next_rdev())
{}
{
m_name = BAN::String::formatted("ttyS{}", minor(rdev()));
}
BAN::ErrorOr<BAN::RefPtr<SerialTTY>> SerialTTY::create(Serial serial)
{
@@ -228,11 +230,8 @@ namespace Kernel
IDT::register_irq_handler(COM2_IRQ, irq3_handler);
}
ASSERT(minor(tty->rdev()) < 10);
char name[] = { 't', 't', 'y', 'S', (char)('0' + minor(tty->rdev())), '\0' };
auto ref_ptr = BAN::RefPtr<SerialTTY>::adopt(tty);
DevFileSystem::get().add_device(name, ref_ptr);
DevFileSystem::get().add_device(ref_ptr->name(), ref_ptr);
if (serial.port() == COM1_PORT)
s_com1 = ref_ptr;
if (serial.port() == COM2_PORT)

View File

@@ -25,6 +25,20 @@ namespace Kernel
void TTY::set_as_current()
{
s_tty = this;
auto inode_or_error = DevFileSystem::get().root_inode()->directory_find_inode("tty");
if (inode_or_error.is_error())
{
if (inode_or_error.error().get_error_code() == ENOENT)
DevFileSystem::get().add_device("tty"sv, MUST(RamSymlinkInode::create(DevFileSystem::get(), s_tty->name(), S_IFLNK | 0666, 0, 0)));
else
dwarnln("{}", inode_or_error.error());
return;
}
auto inode = inode_or_error.release_value();
if (inode->mode().iflnk())
MUST(((RamSymlinkInode*)inode.ptr())->set_link_target(name()));
}
void TTY::initialize_devices()

View File

@@ -36,11 +36,8 @@ namespace Kernel
auto* tty = new VirtualTTY(driver);
ASSERT(tty);
ASSERT(minor(tty->rdev()) < 10);
char name[5] { 't', 't', 'y', (char)('0' + minor(tty->rdev())), '\0' };
auto ref_ptr = BAN::RefPtr<VirtualTTY>::adopt(tty);
DevFileSystem::get().add_device(name, ref_ptr);
DevFileSystem::get().add_device(ref_ptr->name(), ref_ptr);
return ref_ptr;
}
@@ -49,6 +46,8 @@ namespace Kernel
, m_terminal_driver(driver)
, m_rdev(next_rdev())
{
m_name = BAN::String::formatted("tty{}", minor(rdev()));
m_width = m_terminal_driver->width();
m_height = m_terminal_driver->height();