1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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
This commit is contained in:
usa 2012-10-30 10:32:56 +00:00
parent 643f5308e6
commit ee2718039c
3 changed files with 26 additions and 2 deletions

View file

@ -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> Tue Oct 30 03:08:53 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* lib/rbconfig/obsolete.rb (Config): re-introduce warnings for a * lib/rbconfig/obsolete.rb (Config): re-introduce warnings for a

4
io.c
View file

@ -244,6 +244,10 @@ rb_cloexec_dup2(int oldfd, int newfd)
} }
#else #else
ret = dup2(oldfd, newfd); 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 #endif
if (ret == -1) return -1; if (ret == -1) return -1;
} }

View file

@ -2438,16 +2438,28 @@ redirect_dup(int oldfd)
ttyprintf("dup(%d) => %d\n", oldfd, ret); ttyprintf("dup(%d) => %d\n", oldfd, ret);
return ret; return ret;
} }
#else
#define redirect_dup(oldfd) dup(oldfd)
#endif
#if defined(DEBUG_REDIRECT) || defined(_WIN32)
static int static int
redirect_dup2(int oldfd, int newfd) redirect_dup2(int oldfd, int newfd)
{ {
int ret; int ret;
ret = dup2(oldfd, newfd); 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); ttyprintf("dup2(%d, %d)\n", oldfd, newfd);
#endif
return ret; return ret;
} }
#else
#define redirect_dup2(oldfd, newfd) dup2((oldfd), (newfd))
#endif
#if defined(DEBUG_REDIRECT)
static int static int
redirect_close(int fd) redirect_close(int fd)
{ {
@ -2467,8 +2479,6 @@ redirect_open(const char *pathname, int flags, mode_t perm)
} }
#else #else
#define redirect_dup(oldfd) dup(oldfd)
#define redirect_dup2(oldfd, newfd) dup2((oldfd), (newfd))
#define redirect_close(fd) close(fd) #define redirect_close(fd) close(fd)
#define redirect_open(pathname, flags, perm) open((pathname), (flags), (perm)) #define redirect_open(pathname, flags, perm) open((pathname), (flags), (perm))
#endif #endif