summaryrefslogtreecommitdiff
path: root/Shell
diff options
context:
space:
mode:
authorAnotherTest <ali.mpfard@gmail.com>2020-08-04 22:37:47 +0430
committerAndreas Kling <kling@serenityos.org>2020-08-04 21:22:44 +0200
commit771751258ea17524c582de6ca8b4ca3e3d02808a (patch)
tree2279819d25a38fb1266e01d21e566c6248d1603e /Shell
parent984683cf34ee471bfbd2e0d3eca3517d0c2dce97 (diff)
downloadserenity-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.cpp18
-rw-r--r--Shell/Shell.h2
-rw-r--r--Shell/main.cpp1
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__