return 1;
}
-static int setup_confirm_stdio(const char *vc, int *_saved_stdin, int *_saved_stdout) {
+static int setup_confirm_stdio(
+ const char *vc,
+ int *ret_saved_stdin,
+ int *ret_saved_stdout) {
+
_cleanup_close_ int fd = -1, saved_stdin = -1, saved_stdout = -1;
int r;
- assert(_saved_stdin);
- assert(_saved_stdout);
+ assert(ret_saved_stdin);
+ assert(ret_saved_stdout);
saved_stdin = fcntl(STDIN_FILENO, F_DUPFD, 3);
if (saved_stdin < 0)
if (r < 0)
return r;
- r = rearrange_stdio(fd, fd, STDERR_FILENO);
- fd = -1;
+ r = rearrange_stdio(fd, fd, STDERR_FILENO); /* Invalidates 'fd' also on failure */
+ TAKE_FD(fd);
if (r < 0)
return r;
- *_saved_stdin = saved_stdin;
- *_saved_stdout = saved_stdout;
-
- saved_stdin = saved_stdout = -1;
-
+ *ret_saved_stdin = TAKE_FD(saved_stdin);
+ *ret_saved_stdout = TAKE_FD(saved_stdout);
return 0;
}
if (r < 0)
log_warning_errno(r, "Failed to update $SYSTEMD_EXEC_PID, ignoring: %m");
- r = rearrange_stdio(stdin_fd, stdout_fd, STDERR_FILENO);
+ r = rearrange_stdio(TAKE_FD(stdin_fd), TAKE_FD(stdout_fd), STDERR_FILENO); /* fds are invalidated by rearrange_stdio() even on failure */
if (r < 0) {
log_error_errno(r, "Failed to rearrange stdin/stdout/stderr: %m");
_exit(EXIT_FAILURE);
}
- stdin_fd = stdout_fd = -1; /* have been invalidated by rearrange_stdio() */
/* Allow overriding the homework path via an environment variable, to make debugging
* easier. */
pipefd[1] = safe_close(pipefd[1]);
- r = rearrange_stdio(pipefd[0], -1, STDERR_FILENO);
+ r = rearrange_stdio(TAKE_FD(pipefd[0]), -1, STDERR_FILENO);
if (r < 0) {
log_error_errno(r, "Failed to rearrange stdin/stdout: %m");
_exit(EXIT_FAILURE);
pipefd[0] = safe_close(pipefd[0]);
- r = rearrange_stdio(-1, pipefd[1], STDERR_FILENO);
+ r = rearrange_stdio(-1, TAKE_FD(pipefd[1]), STDERR_FILENO);
if (r < 0) {
log_error_errno(r, "Failed to rearrange stdin/stdout: %m");
_exit(EXIT_FAILURE);
pipefd[0] = safe_close(pipefd[0]);
- r = rearrange_stdio(t->stdin_fd,
- t->stdout_fd < 0 ? pipefd[1] : t->stdout_fd,
+ r = rearrange_stdio(TAKE_FD(t->stdin_fd),
+ t->stdout_fd < 0 ? pipefd[1] : TAKE_FD(t->stdout_fd),
pipefd[1]);
+ TAKE_FD(pipefd[1]);
if (r < 0) {
log_error_errno(r, "Failed to set stdin/stdout/stderr: %m");
_exit(EXIT_FAILURE);
gpg_pipe[1] = safe_close(gpg_pipe[1]);
- r = rearrange_stdio(gpg_pipe[0], -1, STDERR_FILENO);
+ r = rearrange_stdio(TAKE_FD(gpg_pipe[0]), -1, STDERR_FILENO);
if (r < 0) {
log_error_errno(r, "Failed to rearrange stdin/stdout: %m");
_exit(EXIT_FAILURE);
/* In the child */
if (r == 0) {
- safe_close(fd[0]);
+ fd[0] = safe_close(fd[0]);
- r = rearrange_stdio(STDIN_FILENO, fd[1], STDERR_FILENO);
+ r = rearrange_stdio(STDIN_FILENO, TAKE_FD(fd[1]), STDERR_FILENO);
if (r < 0) {
log_error_errno(r, "Failed to dup pipe to stdout: %m");
_exit(EXIT_FAILURE);
if (r == 0) {
/* Child */
- if (rearrange_stdio(s[1], s[1], STDERR_FILENO) < 0)
+ r = rearrange_stdio(s[1], s[1], STDERR_FILENO);
+ TAKE_FD(s[1]);
+ if (r < 0)
_exit(EXIT_FAILURE);
(void) rlimit_nofile_safe();
if (r == 0) {
char *empty_env = NULL;
- safe_close(pipe_fds[0]);
+ pipe_fds[0] = safe_close(pipe_fds[0]);
- if (rearrange_stdio(-1, pipe_fds[1], -1) < 0)
+ if (rearrange_stdio(-1, TAKE_FD(pipe_fds[1]), -1) < 0)
_exit(EXIT_FAILURE);
(void) close_all_fds(NULL, 0);
char *_argv[2];
if (stdout_fd >= 0) {
- r = rearrange_stdio(STDIN_FILENO, stdout_fd, STDERR_FILENO);
+ r = rearrange_stdio(STDIN_FILENO, TAKE_FD(stdout_fd), STDERR_FILENO);
if (r < 0)
_exit(EXIT_FAILURE);
}
r = safe_fork("(spawn-ldd)", FORK_RESET_SIGNALS|FORK_DEATHSIG|FORK_LOG, &pid);
assert_se(r >= 0);
if (r == 0) {
- if (rearrange_stdio(-1, outpipe[1], errpipe[1]) < 0)
+ if (rearrange_stdio(-1, TAKE_FD(outpipe[1]), TAKE_FD(errpipe[1])) < 0)
_exit(EXIT_FAILURE);
(void) close_all_fds(NULL, 0);
return log_device_error_errno(event->dev, r,
"Failed to fork() to execute command '%s': %m", cmd);
if (r == 0) {
- if (rearrange_stdio(-1, outpipe[WRITE_END], errpipe[WRITE_END]) < 0)
+ if (rearrange_stdio(-1, TAKE_FD(outpipe[WRITE_END]), TAKE_FD(errpipe[WRITE_END])) < 0)
_exit(EXIT_FAILURE);
(void) close_all_fds(NULL, 0);