forked from Bananymous/banan-os
Kernel: Add /dev/tty symlink that targets the current tty
This commit is contained in:
parent
35fd30ee29
commit
ddd36af0f1
|
@ -14,7 +14,7 @@ namespace Kernel
|
||||||
|
|
||||||
void initialize_device_updater();
|
void initialize_device_updater();
|
||||||
|
|
||||||
void add_device(BAN::StringView path, BAN::RefPtr<Device>);
|
void add_device(BAN::StringView path, BAN::RefPtr<RamInode>);
|
||||||
|
|
||||||
dev_t get_next_dev();
|
dev_t get_next_dev();
|
||||||
|
|
||||||
|
|
|
@ -45,11 +45,15 @@ namespace Kernel
|
||||||
|
|
||||||
virtual void update() override;
|
virtual void update() override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual BAN::StringView name() const override { return m_name; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SerialTTY(Serial);
|
SerialTTY(Serial);
|
||||||
bool initialize();
|
bool initialize();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
BAN::String m_name;
|
||||||
Serial m_serial;
|
Serial m_serial;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -47,6 +47,8 @@ namespace Kernel
|
||||||
: CharacterDevice(mode, uid, gid)
|
: CharacterDevice(mode, uid, gid)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
virtual BAN::StringView name() const = 0;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void do_backspace();
|
void do_backspace();
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,9 @@ namespace Kernel
|
||||||
virtual uint32_t width() const override { return m_width; }
|
virtual uint32_t width() const override { return m_width; }
|
||||||
virtual void putchar(uint8_t ch) override;
|
virtual void putchar(uint8_t ch) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual BAN::StringView name() const override { return m_name; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
VirtualTTY(TerminalDriver*);
|
VirtualTTY(TerminalDriver*);
|
||||||
|
|
||||||
|
@ -64,6 +67,8 @@ namespace Kernel
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
BAN::String m_name;
|
||||||
|
|
||||||
State m_state { State::Normal };
|
State m_state { State::Normal };
|
||||||
AnsiState m_ansi_state { };
|
AnsiState m_ansi_state { };
|
||||||
UTF8State m_utf8_state { };
|
UTF8State m_utf8_state { };
|
||||||
|
|
|
@ -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('/'));
|
ASSERT(!path.contains('/'));
|
||||||
MUST(reinterpret_cast<RamDirectoryInode*>(root_inode().ptr())->add_inode(path, device));
|
MUST(reinterpret_cast<RamDirectoryInode*>(root_inode().ptr())->add_inode(path, device));
|
||||||
|
|
|
@ -207,7 +207,9 @@ namespace Kernel
|
||||||
: TTY(0660, 0, 0)
|
: TTY(0660, 0, 0)
|
||||||
, m_serial(serial)
|
, m_serial(serial)
|
||||||
, m_rdev(next_rdev())
|
, m_rdev(next_rdev())
|
||||||
{}
|
{
|
||||||
|
m_name = BAN::String::formatted("ttyS{}", minor(rdev()));
|
||||||
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<BAN::RefPtr<SerialTTY>> SerialTTY::create(Serial serial)
|
BAN::ErrorOr<BAN::RefPtr<SerialTTY>> SerialTTY::create(Serial serial)
|
||||||
{
|
{
|
||||||
|
@ -228,11 +230,8 @@ namespace Kernel
|
||||||
IDT::register_irq_handler(COM2_IRQ, irq3_handler);
|
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);
|
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)
|
if (serial.port() == COM1_PORT)
|
||||||
s_com1 = ref_ptr;
|
s_com1 = ref_ptr;
|
||||||
if (serial.port() == COM2_PORT)
|
if (serial.port() == COM2_PORT)
|
||||||
|
|
|
@ -25,6 +25,20 @@ namespace Kernel
|
||||||
void TTY::set_as_current()
|
void TTY::set_as_current()
|
||||||
{
|
{
|
||||||
s_tty = this;
|
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()
|
void TTY::initialize_devices()
|
||||||
|
|
|
@ -36,11 +36,8 @@ namespace Kernel
|
||||||
auto* tty = new VirtualTTY(driver);
|
auto* tty = new VirtualTTY(driver);
|
||||||
ASSERT(tty);
|
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);
|
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;
|
return ref_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,6 +46,8 @@ namespace Kernel
|
||||||
, m_terminal_driver(driver)
|
, m_terminal_driver(driver)
|
||||||
, m_rdev(next_rdev())
|
, m_rdev(next_rdev())
|
||||||
{
|
{
|
||||||
|
m_name = BAN::String::formatted("tty{}", minor(rdev()));
|
||||||
|
|
||||||
m_width = m_terminal_driver->width();
|
m_width = m_terminal_driver->width();
|
||||||
m_height = m_terminal_driver->height();
|
m_height = m_terminal_driver->height();
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
void initialize_stdio()
|
void initialize_stdio()
|
||||||
{
|
{
|
||||||
const char* tty = "/dev/tty0";
|
const char* tty = "/dev/tty";
|
||||||
if (open(tty, O_RDONLY | O_TTY_INIT) != 0) _exit(1);
|
if (open(tty, O_RDONLY | O_TTY_INIT) != 0) _exit(1);
|
||||||
if (open(tty, O_WRONLY) != 1) _exit(1);
|
if (open(tty, O_WRONLY) != 1) _exit(1);
|
||||||
if (open(tty, O_WRONLY) != 2) _exit(1);
|
if (open(tty, O_WRONLY) != 2) _exit(1);
|
||||||
|
|
Loading…
Reference in New Issue