- if (!args)
- err = ENOMEM;
- else {
- if (tochild[0] != STDIN_FILENO) {
- if (dup2(tochild[0], STDIN_FILENO) == -1)
- goto child_errno_fail;
- close(tochild[0]);
- }
- if (fromchild[1] != STDOUT_FILENO) {
- if (dup2(fromchild[1], STDOUT_FILENO) == -1)
- goto child_errno_fail;
- close(fromchild[1]);
- }
- execvp(cmd, args);
- child_errno_fail:
- err = errno;
+ if (tochild[0] != STDIN_FILENO) {
+ if (dup2(tochild[0], STDIN_FILENO) == -1)
+ goto child_errno_fail;
+ close(tochild[0]);
+ }
+ if (fromchild[1] != STDOUT_FILENO) {
+ if (dup2(fromchild[1], STDOUT_FILENO) == -1)
+ goto child_errno_fail;
+ close(fromchild[1]);
+ }
+ if (fd_errfromchild && fd_errfromchild == fd_fromchild) {
+ if (dup2(STDOUT_FILENO, STDERR_FILENO) == -1)
+ goto child_errno_fail;
+ } else if (errfromchild[1] != STDERR_FILENO) {
+ if (dup2(errfromchild[1], STDERR_FILENO) == -1)
+ goto child_errno_fail;
+ close(errfromchild[1]);
+ }
+ execvp(arr[0], arr);
+
+ child_errno_fail:
+ err = errno;
+ /* Gcc's warn-unused-result fail. */
+ if (write(execfail[1], &err, sizeof(err))) {
+ ;