diff options
author | AnotherTest <ali.mpfard@gmail.com> | 2020-08-04 22:37:47 +0430 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-08-04 21:22:44 +0200 |
commit | 771751258ea17524c582de6ca8b4ca3e3d02808a (patch) | |
tree | 2279819d25a38fb1266e01d21e566c6248d1603e /Shell | |
parent | 984683cf34ee471bfbd2e0d3eca3517d0c2dce97 (diff) | |
download | serenity-771751258ea17524c582de6ca8b4ca3e3d02808a.zip |
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.
Diffstat (limited to 'Shell')
-rw-r--r-- | Shell/Shell.cpp | 18 | ||||
-rw-r--r-- | Shell/Shell.h | 2 | ||||
-rw-r--r-- | 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<Job> 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<RefPtr<Job>> Shell::run_commands(Vector<AST::Command>& 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> job) @@ -660,13 +668,13 @@ void Shell::block_on_job(RefPtr<Job> 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<Line::CompletionSuggestion> 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<Line::CompletionSuggestion> complete_user(const String&, size_t offset); Vector<Line::CompletionSuggestion> 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__ |