diff options
-rw-r--r-- | win32/process.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/win32/process.c b/win32/process.c index 428d6c703..1ee576055 100644 --- a/win32/process.c +++ b/win32/process.c | |||
@@ -408,21 +408,31 @@ mingw_spawn_proc(const char **argv) | |||
408 | return mingw_spawnvp(P_NOWAIT, argv[0], (char *const *)argv); | 408 | return mingw_spawnvp(P_NOWAIT, argv[0], (char *const *)argv); |
409 | } | 409 | } |
410 | 410 | ||
411 | static NORETURN void wait_for_child(HANDLE child) | ||
412 | { | ||
413 | DWORD code; | ||
414 | |||
415 | SetConsoleCtrlHandler(NULL, TRUE); | ||
416 | WaitForSingleObject(child, INFINITE); | ||
417 | GetExitCodeProcess(child, &code); | ||
418 | exit((int)code); | ||
419 | } | ||
420 | |||
411 | int | 421 | int |
412 | mingw_execvp(const char *cmd, char *const *argv) | 422 | mingw_execvp(const char *cmd, char *const *argv) |
413 | { | 423 | { |
414 | int ret = (int)mingw_spawnvp(P_WAIT, cmd, argv); | 424 | intptr_t ret = mingw_spawnvp(P_NOWAIT, cmd, argv); |
415 | if (ret != -1 || errno == 0) | 425 | if (ret != -1 || errno == 0) |
416 | exit(ret); | 426 | wait_for_child((HANDLE)ret); |
417 | return ret; | 427 | return ret; |
418 | } | 428 | } |
419 | 429 | ||
420 | int | 430 | int |
421 | mingw_execve(const char *cmd, char *const *argv, char *const *envp) | 431 | mingw_execve(const char *cmd, char *const *argv, char *const *envp) |
422 | { | 432 | { |
423 | int ret = (int)mingw_spawn_interpreter(P_WAIT, cmd, argv, envp, 0); | 433 | intptr_t ret = mingw_spawn_interpreter(P_NOWAIT, cmd, argv, envp, 0); |
424 | if (ret != -1 || errno == 0) | 434 | if (ret != -1 || errno == 0) |
425 | exit(ret); | 435 | wait_for_child((HANDLE)ret); |
426 | return ret; | 436 | return ret; |
427 | } | 437 | } |
428 | 438 | ||