зеркало из https://github.com/github/ruby.git
* 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:
Родитель
643f5308e6
Коммит
ee2718039c
10
ChangeLog
10
ChangeLog
|
@ -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
|
||||
|
|
4
io.c
4
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;
|
||||
}
|
||||
|
|
14
process.c
14
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
|
||||
|
|
Загрузка…
Ссылка в новой задаче