diff --git a/ChangeLog b/ChangeLog index 388987102d..8a89bd8be9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Tue Oct 30 19:27:48 2012 NAKAMURA Usaku + + * process.c (redirect_dup2): set standard handles when new fd is stdio, + because if there is no allocated console at the moment Windows does + not automatically associate it for child process's standard handle. + this is adhoc workaround. + reported by Martin Thiede at [ruby-core:48542] [Bug #7239]. + + * io.c (rb_cloexec_dup2): ditto. + Tue Oct 30 03:08:53 2012 Nobuyoshi Nakada * lib/rbconfig/obsolete.rb (Config): re-introduce warnings for a diff --git a/io.c b/io.c index b3c02e99a0..aadd8ecb5b 100644 --- a/io.c +++ b/io.c @@ -244,6 +244,10 @@ rb_cloexec_dup2(int oldfd, int newfd) } #else ret = dup2(oldfd, newfd); +# ifdef _WIN32 + if (newfd >= 0 && newfd <= 2) + SetStdHandle(newfd == 0 ? STD_INPUT_HANDLE : newfd == 1 ? STD_OUTPUT_HANDLE : STD_ERROR_HANDLE, (HANDLE)rb_w32_get_osfhandle(newfd)); +# endif #endif if (ret == -1) return -1; } diff --git a/process.c b/process.c index f2da92a8e8..427168de6c 100644 --- a/process.c +++ b/process.c @@ -2438,16 +2438,28 @@ redirect_dup(int oldfd) ttyprintf("dup(%d) => %d\n", oldfd, ret); return ret; } +#else +#define redirect_dup(oldfd) dup(oldfd) +#endif +#if defined(DEBUG_REDIRECT) || defined(_WIN32) static int redirect_dup2(int oldfd, int newfd) { int ret; ret = dup2(oldfd, newfd); + if (newfd >= 0 && newfd <= 2) + SetStdHandle(newfd == 0 ? STD_INPUT_HANDLE : newfd == 1 ? STD_OUTPUT_HANDLE : STD_ERROR_HANDLE, (HANDLE)rb_w32_get_osfhandle(newfd)); +#if defined(DEBUG_REDIRECT) ttyprintf("dup2(%d, %d)\n", oldfd, newfd); +#endif return ret; } +#else +#define redirect_dup2(oldfd, newfd) dup2((oldfd), (newfd)) +#endif +#if defined(DEBUG_REDIRECT) static int redirect_close(int fd) { @@ -2467,8 +2479,6 @@ redirect_open(const char *pathname, int flags, mode_t perm) } #else -#define redirect_dup(oldfd) dup(oldfd) -#define redirect_dup2(oldfd, newfd) dup2((oldfd), (newfd)) #define redirect_close(fd) close(fd) #define redirect_open(pathname, flags, perm) open((pathname), (flags), (perm)) #endif