ruby-changes:9360
From: yugui <ko1@a...>
Date: Sun, 21 Dec 2008 14:27:28 +0900 (JST)
Subject: [ruby-changes:9360] Ruby:r20897 (ruby_1_9_1): merges r20528 from trunk into ruby_1_9_1.
yugui 2008-12-21 14:27:06 +0900 (Sun, 21 Dec 2008) New Revision: 20897 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=20897 Log: merges r20528 from trunk into ruby_1_9_1. * win32/win32.c (rb_w32_read): ERROR_BROKEN_PIPE is not a real error at this point. * io.c (pipe_open): use rb_w32_spawn() instead of rb_w32_pipe_exec() to use our own redirection scheme. Modified files: branches/ruby_1_9_1/ChangeLog branches/ruby_1_9_1/io.c branches/ruby_1_9_1/win32/win32.c Index: ruby_1_9_1/ChangeLog =================================================================== --- ruby_1_9_1/ChangeLog (revision 20896) +++ ruby_1_9_1/ChangeLog (revision 20897) @@ -1,3 +1,11 @@ +Fri Dec 5 01:37:02 2008 NAKAMURA Usaku <usa@r...> + + * win32/win32.c (rb_w32_read): ERROR_BROKEN_PIPE is not a real error + at this point. + + * io.c (pipe_open): use rb_w32_spawn() instead of rb_w32_pipe_exec() + to use our own redirection scheme. + Sat Dec 20 10:59:16 2008 Yuki Sonoda (Yugui) <yugui@y...> * lib/irb/locale.rb (IRB::Locale#initialize) Index: ruby_1_9_1/io.c =================================================================== --- ruby_1_9_1/io.c (revision 20896) +++ ruby_1_9_1/io.c (revision 20897) @@ -4450,6 +4450,7 @@ const char *exename = NULL; volatile VALUE cmdbuf; struct rb_exec_arg sarg; + int pair[2], write_pair[2]; #endif FILE *fp = 0; int fd = -1; @@ -4574,11 +4575,42 @@ cmd = rb_w32_join_argv(RSTRING_PTR(cmdbuf), args); rb_str_resize(argbuf, 0); } + switch (fmode & (FMODE_READABLE|FMODE_WRITABLE)) { + case FMODE_READABLE|FMODE_WRITABLE: + if (rb_pipe(write_pair) < 0) + rb_sys_fail(cmd); + if (rb_pipe(pair) < 0) { + int e = errno; + close(write_pair[0]); + close(write_pair[1]); + errno = e; + rb_sys_fail(cmd); + } + if (eargp) { + rb_exec_arg_addopt(eargp, INT2FIX(0), INT2FIX(write_pair[0])); + rb_exec_arg_addopt(eargp, INT2FIX(1), INT2FIX(pair[1])); + } + break; + case FMODE_READABLE: + if (rb_pipe(pair) < 0) + rb_sys_fail(cmd); + if (eargp) + rb_exec_arg_addopt(eargp, INT2FIX(1), INT2FIX(pair[1])); + break; + case FMODE_WRITABLE: + if (rb_pipe(pair) < 0) + rb_sys_fail(cmd); + if (eargp) + rb_exec_arg_addopt(eargp, INT2FIX(0), INT2FIX(pair[0])); + break; + default: + rb_sys_fail(cmd); + } if (eargp) { rb_exec_arg_fixup(eargp); rb_run_exec_options(eargp, &sarg); } - while ((pid = rb_w32_pipe_exec(cmd, exename, openmode, &fd, &write_fd)) == -1) { + while ((pid = rb_w32_spawn(P_NOWAIT, cmd, exename)) == -1) { /* exec failed */ switch (errno) { case EAGAIN: @@ -4596,6 +4628,20 @@ } if (eargp) rb_run_exec_options(&sarg, NULL); + if ((fmode & FMODE_READABLE) && (fmode & FMODE_WRITABLE)) { + close(pair[1]); + fd = pair[0]; + close(write_pair[0]); + write_fd = write_pair[1]; + } + else if (fmode & FMODE_READABLE) { + close(pair[1]); + fd = pair[0]; + } + else { + close(pair[0]); + fd = pair[1]; + } #else if (argc) { prog = rb_ary_join(rb_ary_new4(argc, argv), rb_str_new2(" ")); Index: ruby_1_9_1/win32/win32.c =================================================================== --- ruby_1_9_1/win32/win32.c (revision 20896) +++ ruby_1_9_1/win32/win32.c (revision 20897) @@ -4395,11 +4395,15 @@ if (!GetOverlappedResult((HANDLE)_osfhnd(fd), &ol, &read, TRUE) && (err = GetLastError()) != ERROR_HANDLE_EOF) { - errno = map_errno(err); + int ret = 0; + if (err != ERROR_BROKEN_PIPE) { + errno = map_errno(err); + ret = -1; + } CloseHandle(ol.hEvent); cancel_io((HANDLE)_osfhnd(fd)); MTHREAD_ONLY(LeaveCriticalSection(&_pioinfo(fd)->lock)); - return -1; + return ret; } } } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/