X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=cbits%2FrunProcess.c;h=b89e1308b4138f362944ac58c4f3938206af2154;hb=b959bfb92f069ebe2911d1239155fc80beceb283;hp=d117e3605a120f394bfd236eb2920e209eb026ab;hpb=3457025838609e26918bb0cf5c16393d3bb5b69b;p=haskell-directory.git diff --git a/cbits/runProcess.c b/cbits/runProcess.c index d117e36..b89e130 100644 --- a/cbits/runProcess.c +++ b/cbits/runProcess.c @@ -47,7 +47,9 @@ runProcess (char *const args[], char *workingDirectory, char **environment, pPrPr_disableITimers(); if (workingDirectory) { - chdir (workingDirectory); + if (chdir (workingDirectory) < 0) { + return -1; + } } /* Set the SIGINT/SIGQUIT signal handlers in the child, if requested @@ -107,19 +109,29 @@ runInteractiveProcess (char *const args[], pPrPr_disableITimers(); if (workingDirectory) { - chdir (workingDirectory); + if (chdir (workingDirectory) < 0) { + return -1; + } } - dup2 (fdStdInput[0], STDIN_FILENO); - dup2 (fdStdOutput[1], STDOUT_FILENO); - dup2 (fdStdError[1], STDERR_FILENO); + if (fdStdInput[0] != STDIN_FILENO) { + dup2 (fdStdInput[0], STDIN_FILENO); + close(fdStdInput[0]); + } + + if (fdStdOutput[1] != STDOUT_FILENO) { + dup2 (fdStdOutput[1], STDOUT_FILENO); + close(fdStdOutput[1]); + } + + if (fdStdError[1] != STDERR_FILENO) { + dup2 (fdStdError[1], STDERR_FILENO); + close(fdStdError[1]); + } - close(fdStdInput[0]); close(fdStdInput[1]); close(fdStdOutput[0]); - close(fdStdOutput[1]); close(fdStdError[0]); - close(fdStdError[1]); /* the child */ if (environment) { @@ -204,7 +216,7 @@ int waitForProcess (ProcHandle handle) else if (WIFSIGNALED(wstat)) { - errno = EINTR; + return wstat; } else { @@ -506,8 +518,6 @@ terminateProcess (ProcHandle handle) maperrno(); return -1; } - - CloseHandle((HANDLE) handle); return 0; } @@ -523,8 +533,6 @@ getProcessExitCode (ProcHandle handle, int *pExitCode) maperrno(); return -1; } - - CloseHandle((HANDLE) handle); return 1; } @@ -543,8 +551,6 @@ waitForProcess (ProcHandle handle) maperrno(); return -1; } - - CloseHandle((HANDLE) handle); return retCode; }