Skip to content

Commit

Permalink
Shell: Give the TTY to the foreground process
Browse files Browse the repository at this point in the history
This fixes the bug with the shell not waiting for any foreground process
that attempts to read from the terminal in the Lagom build.
  • Loading branch information
alimpfard authored and awesomekling committed Aug 4, 2020
1 parent 984683c commit 7717512
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 6 deletions.
18 changes: 13 additions & 5 deletions Shell/Shell.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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();
}
}
}
Expand All @@ -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)
Expand All @@ -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()
Expand Down Expand Up @@ -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()) {
Expand Down
2 changes: 1 addition & 1 deletion Shell/Shell.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ class Shell : public Core::Object {
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);
Expand Down
1 change: 1 addition & 0 deletions Shell/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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__
Expand Down

0 comments on commit 7717512

Please sign in to comment.