diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | io.c | 4 | ||||
-rw-r--r-- | process.c | 14 |
3 files changed, 26 insertions, 2 deletions
@@ -1,3 +1,13 @@ +Tue Oct 30 19:27:48 2012 NAKAMURA Usaku <usa@ruby-lang.org> + + * 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 <nobu@ruby-lang.org> * lib/rbconfig/obsolete.rb (Config): re-introduce warnings for a @@ -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; } @@ -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 |