Add FD swap / redirect stderr code

This commit is contained in:
Sargun Dhillon 2017-04-12 02:27:36 -07:00
parent 1f18862ed9
commit 0982ad2613
1 changed files with 32 additions and 0 deletions

View File

@ -136,8 +136,29 @@ int isolate_child() {
int spawn(const signal_configuration_t* const sigconf_ptr, char* const argv[], int* const child_pid_ptr) {
int new_stdout_fd = 1;
int new_stderr_fd = 2;
char *redir_path;
pid_t pid;
redir_path = getenv("REDIR_STDOUT");
if (redir_path) {
new_stdout_fd = open(redir_path, O_WRONLY | O_CREAT | O_APPEND);
if (new_stdout_fd == -1) {
PRINT_FATAL("Failed to open stdout redirect path: %s", strerror(errno));
return 1;
}
}
redir_path = getenv("REDIR_STDERR");
if (redir_path) {
new_stderr_fd = open(redir_path, O_WRONLY | O_CREAT | O_APPEND);
if (new_stderr_fd == -1) {
PRINT_FATAL("Failed to open stderr redirect path: %s", strerror(errno));
return 1;
}
}
// TODO: check if tini was a foreground process to begin with (it's not OK to "steal" the foreground!")
pid = fork();
@ -156,6 +177,17 @@ int spawn(const signal_configuration_t* const sigconf_ptr, char* const argv[], i
return 1;
}
// Do the FD swap
// No need to set CLO_EXEC on existing stdout, stderr FDs, because we're closing them anyway
if (dup2(new_stdout_fd, 1) == -1) {
PRINT_FATAL("Failed to duplicate stdout FD: %s", strerror(errno));
return 1;
}
if (dup2(new_stderr_fd, 2) == -1) {
PRINT_FATAL("Failed to duplicate stdout FD: %s", strerror(errno));
return 1;
}
execvp(argv[0], argv);
// execvp will only return on an error so make sure that we check the errno