Shell: Update termios settings to match line discipline.

Shell.cpp uses its own line discipline which handles
echoing and line editing. Because of this we disable
ICANON and ECHO so that we don't get duplicate characters
or weird line editing errors.

We also revert these settings just before running a command.
This is so that commands may run with proper line editing
and echoing.
This commit is contained in:
Drew Stratford 2019-10-20 20:02:55 +13:00 committed by Andreas Kling
parent 4c35c8d7fd
commit 58f67c1ccb
Notes: sideshowbarker 2024-07-19 11:37:00 +09:00
2 changed files with 8 additions and 1 deletions

View file

@ -13,6 +13,7 @@ struct GlobalState {
pid_t sid;
uid_t uid;
struct termios termios;
struct termios default_termios;
bool was_interrupted { false };
bool was_resized { false };
int last_return_code { 0 };

View file

@ -634,6 +634,7 @@ static int run_command(const String& cmd)
struct termios trm;
tcgetattr(0, &trm);
tcsetattr(0, TCSANOW, &g.default_termios);
struct SpawnedProcess {
String name;
@ -840,7 +841,12 @@ int main(int argc, char** argv)
g.uid = getuid();
g.sid = setsid();
tcsetpgrp(0, getpgrp());
tcgetattr(0, &g.termios);
tcgetattr(0, &g.default_termios);
g.termios = g.default_termios;
// Because we use our own line discipline which includes echoing,
// we disable ICANON and ECHO.
g.termios.c_lflag &= ~(ECHO | ICANON);
tcsetattr(0, TCSANOW, &g.termios);
signal(SIGINT, [](int) {
g.was_interrupted = true;