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 add_device(BAN::StringView path, BAN::RefPtr<Device>); | ||||
| 		void add_device(BAN::StringView path, BAN::RefPtr<RamInode>); | ||||
| 
 | ||||
| 		dev_t get_next_dev(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -45,11 +45,15 @@ namespace Kernel | |||
| 	 | ||||
| 		virtual void update() override; | ||||
| 
 | ||||
| 	protected: | ||||
| 		virtual BAN::StringView name() const override { return m_name; } | ||||
| 
 | ||||
| 	private: | ||||
| 		SerialTTY(Serial); | ||||
| 		bool initialize(); | ||||
| 
 | ||||
| 	private: | ||||
| 		BAN::String m_name; | ||||
| 		Serial m_serial; | ||||
| 	 | ||||
| 	public: | ||||
|  |  | |||
|  | @ -47,6 +47,8 @@ namespace Kernel | |||
| 			: CharacterDevice(mode, uid, gid) | ||||
| 		{ } | ||||
| 
 | ||||
| 		virtual BAN::StringView name() const = 0; | ||||
| 
 | ||||
| 	private: | ||||
| 		void do_backspace(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -23,6 +23,9 @@ namespace Kernel | |||
| 		virtual uint32_t width() const override { return m_width; } | ||||
| 		virtual void putchar(uint8_t ch) override; | ||||
| 
 | ||||
| 	protected: | ||||
| 		virtual BAN::StringView name() const override { return m_name; } | ||||
| 
 | ||||
| 	private: | ||||
| 		VirtualTTY(TerminalDriver*); | ||||
| 
 | ||||
|  | @ -64,6 +67,8 @@ namespace Kernel | |||
| 		}; | ||||
| 
 | ||||
| 	private: | ||||
| 		BAN::String m_name; | ||||
| 
 | ||||
| 		State m_state { State::Normal }; | ||||
| 		AnsiState m_ansi_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('/')); | ||||
| 		MUST(reinterpret_cast<RamDirectoryInode*>(root_inode().ptr())->add_inode(path, device)); | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
|  | @ -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() | ||||
|  |  | |||
|  | @ -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(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -11,7 +11,7 @@ | |||
| 
 | ||||
| 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_WRONLY) != 1) _exit(1); | ||||
| 	if (open(tty, O_WRONLY) != 2) _exit(1); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue