Add -E to run-shell to forward stderr as well as stdout, from github at

jyn dot dev in GitHub issue 4246.
This commit is contained in:
nicm
2025-05-12 10:16:42 +00:00
parent 7499d925da
commit 1ce1e7ef27
2 changed files with 22 additions and 12 deletions

27
job.c
View File

@ -79,7 +79,7 @@ job_run(const char *cmd, int argc, char **argv, struct environ *e,
struct job *job;
struct environ *env;
pid_t pid;
int nullfd, out[2], master;
int nullfd, out[2], master, do_close = 1;
const char *home, *shell;
sigset_t set, oldset;
struct winsize ws;
@ -152,19 +152,26 @@ job_run(const char *cmd, int argc, char **argv, struct environ *e,
if (~flags & JOB_PTY) {
if (dup2(out[1], STDIN_FILENO) == -1)
fatal("dup2 failed");
do_close = do_close && out[1] != STDIN_FILENO;
if (dup2(out[1], STDOUT_FILENO) == -1)
fatal("dup2 failed");
if (out[1] != STDIN_FILENO && out[1] != STDOUT_FILENO)
do_close = do_close && out[1] != STDOUT_FILENO;
if (flags & JOB_SHOWSTDERR) {
if (dup2(out[1], STDERR_FILENO) == -1)
fatal("dup2 failed");
do_close = do_close && out[1] != STDERR_FILENO;
} else {
nullfd = open(_PATH_DEVNULL, O_RDWR);
if (nullfd == -1)
fatal("open failed");
if (dup2(nullfd, STDERR_FILENO) == -1)
fatal("dup2 failed");
if (nullfd != STDERR_FILENO)
close(nullfd);
}
if (do_close)
close(out[1]);
close(out[0]);
nullfd = open(_PATH_DEVNULL, O_RDWR);
if (nullfd == -1)
fatal("open failed");
if (dup2(nullfd, STDERR_FILENO) == -1)
fatal("dup2 failed");
if (nullfd != STDERR_FILENO)
close(nullfd);
}
closefrom(STDERR_FILENO + 1);