From 771751258ea17524c582de6ca8b4ca3e3d02808a Mon Sep 17 00:00:00 2001 From: AnotherTest Date: Tue, 4 Aug 2020 22:37:47 +0430 Subject: [PATCH] Shell: Give the TTY to the foreground process This fixes the bug with the shell not waiting for any foreground process that attempts to read from the terminal in the Lagom build. --- Shell/Shell.cpp | 18 +++++++++++++----- Shell/Shell.h | 2 +- Shell/main.cpp | 1 + 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Shell/Shell.cpp b/Shell/Shell.cpp index cf6c66a9f7..de8a103a91 100644 --- a/Shell/Shell.cpp +++ b/Shell/Shell.cpp @@ -522,6 +522,12 @@ RefPtr Shell::run_command(const AST::Command& command) if (child == 0) { setpgid(0, 0); tcsetattr(0, TCSANOW, &default_termios); + if (command.should_wait) { + auto pid = getpid(); + auto pgid = getpgid(pid); + tcsetpgrp(STDOUT_FILENO, pgid); + tcsetpgrp(STDIN_FILENO, pgid); + } for (auto& rewiring : rewirings) { #ifdef SH_DEBUG dbgprintf("in %s<%d>, dup2(%d, %d)\n", argv[0], getpid(), rewiring.dest_fd, rewiring.source_fd); @@ -618,7 +624,7 @@ Vector> Shell::run_commands(Vector& commands) jobs_to_wait_for.append(job); } else if (command.should_notify_if_in_background) { job->set_running_in_background(true); - restore_stdin(); + restore_ios(); } } } @@ -641,9 +647,11 @@ bool Shell::run_file(const String& filename, bool explicitly_invoked) run_command(data); return true; } -void Shell::restore_stdin() +void Shell::restore_ios() { tcsetattr(0, TCSANOW, &termios); + tcsetpgrp(STDOUT_FILENO, m_pid); + tcsetpgrp(STDIN_FILENO, m_pid); } void Shell::block_on_job(RefPtr job) @@ -660,13 +668,13 @@ void Shell::block_on_job(RefPtr job) loop.quit(0); }; if (job->exited()) { - restore_stdin(); + restore_ios(); return; } loop.exec(); - restore_stdin(); + restore_ios(); } String Shell::get_history_path() @@ -1030,7 +1038,7 @@ Vector Shell::complete_option(const String& program_ bool Shell::read_single_line() { - restore_stdin(); + restore_ios(); auto line_result = editor->get_line(prompt()); if (line_result.is_error()) { diff --git a/Shell/Shell.h b/Shell/Shell.h index 5f6dd91b9c..0da1fd1c6a 100644 --- a/Shell/Shell.h +++ b/Shell/Shell.h @@ -132,7 +132,7 @@ public: Vector complete_user(const String&, size_t offset); Vector complete_option(const String&, const String&, size_t offset); - void restore_stdin(); + void restore_ios(); u64 find_last_job_id() const; const Job* find_job(u64 id); diff --git a/Shell/main.cpp b/Shell/main.cpp index be79d761d5..bb40b3d2e7 100644 --- a/Shell/main.cpp +++ b/Shell/main.cpp @@ -131,6 +131,7 @@ int main(int argc, char** argv) sigset_t blocked; sigemptyset(&blocked); sigaddset(&blocked, SIGTTOU); + sigaddset(&blocked, SIGTTIN); pthread_sigmask(SIG_BLOCK, &blocked, NULL); #endif #ifdef __serenity__