From ee2718039c143a2668e227b1c5611c41a93da2bb Mon Sep 17 00:00:00 2001 From: usa Date: Tue, 30 Oct 2012 10:32:56 +0000 Subject: * 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37388 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- process.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'process.c') 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 -- cgit v1.2.3