From 4c0b7d44b404f5c8b073ea06d8b23fc7c87b78e6 Mon Sep 17 00:00:00 2001
From: Bananymous <oskari.alaranta@bananymous.com>
Date: Mon, 2 Jun 2025 16:26:53 +0300
Subject: [PATCH] Kernel: Enable ECHOE and ECHOK, support VKILL, fix VEOF

---
 kernel/kernel/Terminal/PseudoTerminal.cpp |  2 +-
 kernel/kernel/Terminal/Serial.cpp         |  2 +-
 kernel/kernel/Terminal/TTY.cpp            | 11 +++++++----
 kernel/kernel/Terminal/VirtualTTY.cpp     |  2 +-
 4 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/kernel/kernel/Terminal/PseudoTerminal.cpp b/kernel/kernel/Terminal/PseudoTerminal.cpp
index 167ca646..4cdd6a19 100644
--- a/kernel/kernel/Terminal/PseudoTerminal.cpp
+++ b/kernel/kernel/Terminal/PseudoTerminal.cpp
@@ -162,7 +162,7 @@ namespace Kernel
 			.c_iflag = 0,
 			.c_oflag = 0,
 			.c_cflag = CS8,
-			.c_lflag = ECHO | ICANON | ISIG,
+			.c_lflag = ECHO | ECHOE | ECHOK | ICANON | ISIG,
 			.c_cc = TTY_DEFAULT_TERMIOS_CC,
 			.c_ospeed = B38400,
 			.c_ispeed = B38400,
diff --git a/kernel/kernel/Terminal/Serial.cpp b/kernel/kernel/Terminal/Serial.cpp
index 82e62333..467fd990 100644
--- a/kernel/kernel/Terminal/Serial.cpp
+++ b/kernel/kernel/Terminal/Serial.cpp
@@ -174,7 +174,7 @@ namespace Kernel
 			.c_iflag = ICRNL,
 			.c_oflag = OPOST | ONLCR,
 			.c_cflag = CS8,
-			.c_lflag = ECHO | ICANON | ISIG,
+			.c_lflag = ECHO | ECHOE | ECHOK  | ICANON | ISIG,
 			.c_cc = TTY_DEFAULT_TERMIOS_CC,
 			.c_ospeed = B38400,
 			.c_ispeed = B38400,
diff --git a/kernel/kernel/Terminal/TTY.cpp b/kernel/kernel/Terminal/TTY.cpp
index 03af9d48..d1a6aa48 100644
--- a/kernel/kernel/Terminal/TTY.cpp
+++ b/kernel/kernel/Terminal/TTY.cpp
@@ -266,8 +266,12 @@ namespace Kernel
 			if (ch == m_termios.c_cc[VERASE] && (m_termios.c_lflag & ECHOE))
 				return do_backspace();
 
-			//if (ch == m_termios.c_cc[VKILL] && (m_termios.c_lflag & ECHOK))
-			//	;
+			if (ch == m_termios.c_cc[VKILL] && (m_termios.c_lflag & ECHOK))
+			{
+				while (m_output.bytes > 0 && m_output.buffer[m_output.bytes - 1] != '\n')
+					do_backspace();
+				return;
+			}
 
 			if (ch == m_termios.c_cc[VEOF])
 			{
@@ -277,7 +281,6 @@ namespace Kernel
 
 			if (ch == NL || ch == m_termios.c_cc[VEOL])
 			{
-				should_append = true;
 				should_flush = true;
 				force_echo = !!(m_termios.c_lflag & ECHONL);
 				ch = NL;
@@ -297,7 +300,7 @@ namespace Kernel
 			m_output.buffer[m_output.bytes++] = ch;
 		}
 
-		if (force_echo || (m_termios.c_lflag & ECHO))
+		if (should_append && (force_echo || (m_termios.c_lflag & ECHO)))
 		{
 			if ((ch <= 31 || ch == 127) && ch != '\n')
 			{
diff --git a/kernel/kernel/Terminal/VirtualTTY.cpp b/kernel/kernel/Terminal/VirtualTTY.cpp
index 7cbaebcd..6b2a577e 100644
--- a/kernel/kernel/Terminal/VirtualTTY.cpp
+++ b/kernel/kernel/Terminal/VirtualTTY.cpp
@@ -40,7 +40,7 @@ namespace Kernel
 			.c_iflag = 0,
 			.c_oflag = 0,
 			.c_cflag = CS8,
-			.c_lflag = ECHO | ICANON | ISIG,
+			.c_lflag = ECHO | ECHOE | ECHOK  | ICANON | ISIG,
 			.c_cc = TTY_DEFAULT_TERMIOS_CC,
 			.c_ospeed = B38400,
 			.c_ispeed = B38400,