|
|
|
@ -274,6 +274,7 @@ int start_command(struct child_process *cmd)
@@ -274,6 +274,7 @@ int start_command(struct child_process *cmd)
|
|
|
|
|
int need_in, need_out, need_err; |
|
|
|
|
int fdin[2], fdout[2], fderr[2]; |
|
|
|
|
int failed_errno = failed_errno; |
|
|
|
|
char *str; |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
* In case of errors we must keep the promise to close FDs |
|
|
|
@ -286,6 +287,7 @@ int start_command(struct child_process *cmd)
@@ -286,6 +287,7 @@ int start_command(struct child_process *cmd)
|
|
|
|
|
failed_errno = errno; |
|
|
|
|
if (cmd->out > 0) |
|
|
|
|
close(cmd->out); |
|
|
|
|
str = "standard input"; |
|
|
|
|
goto fail_pipe; |
|
|
|
|
} |
|
|
|
|
cmd->in = fdin[1]; |
|
|
|
@ -301,6 +303,7 @@ int start_command(struct child_process *cmd)
@@ -301,6 +303,7 @@ int start_command(struct child_process *cmd)
|
|
|
|
|
close_pair(fdin); |
|
|
|
|
else if (cmd->in) |
|
|
|
|
close(cmd->in); |
|
|
|
|
str = "standard output"; |
|
|
|
|
goto fail_pipe; |
|
|
|
|
} |
|
|
|
|
cmd->out = fdout[0]; |
|
|
|
@ -318,9 +321,10 @@ int start_command(struct child_process *cmd)
@@ -318,9 +321,10 @@ int start_command(struct child_process *cmd)
|
|
|
|
|
close_pair(fdout); |
|
|
|
|
else if (cmd->out) |
|
|
|
|
close(cmd->out); |
|
|
|
|
str = "standard error"; |
|
|
|
|
fail_pipe: |
|
|
|
|
error("cannot create pipe for %s: %s", |
|
|
|
|
cmd->argv[0], strerror(failed_errno)); |
|
|
|
|
error("cannot create %s pipe for %s: %s", |
|
|
|
|
str, cmd->argv[0], strerror(failed_errno)); |
|
|
|
|
errno = failed_errno; |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|