Shell: Save and restore stdin flags after child returns
If child makes stdin nonblocking, Shell now restores it back to "normal" flags
This commit is contained in:
parent
d9647868cc
commit
d73a270fb1
|
@ -4,6 +4,7 @@
|
|||
|
||||
#include <BAN/ScopeGuard.h>
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <limits.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/wait.h>
|
||||
|
@ -192,6 +193,10 @@ BAN::ErrorOr<void> Execute::execute_command(const PipedCommand& piped_command)
|
|||
return result;
|
||||
};
|
||||
|
||||
const int stdin_flags = fcntl(STDIN_FILENO, F_GETFL);
|
||||
if (stdin_flags == -1)
|
||||
perror("fcntl");
|
||||
|
||||
for (size_t i = 0; i < piped_command.commands.size(); i++)
|
||||
{
|
||||
int new_pipe[2] { STDIN_FILENO, STDOUT_FILENO };
|
||||
|
@ -278,8 +283,13 @@ BAN::ErrorOr<void> Execute::execute_command(const PipedCommand& piped_command)
|
|||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
if (isatty(STDIN_FILENO) && tcsetpgrp(0, getpgrp()) == -1)
|
||||
perror("tcsetpgrp");
|
||||
if (isatty(STDIN_FILENO))
|
||||
{
|
||||
if (tcsetpgrp(0, getpgrp()) == -1)
|
||||
perror("tcsetpgrp");
|
||||
if (stdin_flags != -1 && fcntl(STDIN_FILENO, F_SETFL, stdin_flags) == -1)
|
||||
perror("fcntl");
|
||||
}
|
||||
m_last_return_value = child_codes.back();
|
||||
|
||||
return {};
|
||||
|
|
Loading…
Reference in New Issue