ruby-changes:2487
From: ko1@a...
Date: 20 Nov 2007 13:05:16 +0900
Subject: [ruby-changes:2487] usa - Ruby:r13978 (trunk): * include/ruby/win32.h win32/win32.c (rb_w32_pipe_exec): use dual fd
usa 2007-11-20 13:04:51 +0900 (Tue, 20 Nov 2007)
New Revision: 13978
Modified files:
trunk/ChangeLog
trunk/include/ruby/win32.h
trunk/io.c
trunk/version.h
trunk/win32/win32.c
Log:
* include/ruby/win32.h win32/win32.c (rb_w32_pipe_exec): use dual fd
instead of socketpair when mode is RDWR.
* io.c (pipe_open): pass &write_fd to rb_w32_pipe_exec().
* io.c (popen_redirect): define only when HAVE_FORK.
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/win32/win32.c?r1=13978&r2=13977
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/version.h?r1=13978&r2=13977
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/include/ruby/win32.h?r1=13978&r2=13977
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=13978&r2=13977
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/io.c?r1=13978&r2=13977
Index: include/ruby/win32.h
===================================================================
--- include/ruby/win32.h (revision 13977)
+++ include/ruby/win32.h (revision 13978)
@@ -206,7 +206,7 @@
#endif
#define NtInitialize ruby_sysinit
extern int rb_w32_cmdvector(const char *, char ***);
-extern rb_pid_t rb_w32_pipe_exec(const char *, const char *, int, int *);
+extern rb_pid_t rb_w32_pipe_exec(const char *, const char *, int, int *, int *);
extern int flock(int fd, int oper);
extern int rb_w32_is_socket(int);
extern int WSAAPI rb_w32_accept(int, struct sockaddr *, int *);
Index: ChangeLog
===================================================================
--- ChangeLog (revision 13977)
+++ ChangeLog (revision 13978)
@@ -1,3 +1,12 @@
+Tue Nov 20 13:00:44 2007 NAKAMURA Usaku <usa@r...>
+
+ * include/ruby/win32.h win32/win32.c (rb_w32_pipe_exec): use dual fd
+ instead of socketpair when mode is RDWR.
+
+ * io.c (pipe_open): pass &write_fd to rb_w32_pipe_exec().
+
+ * io.c (popen_redirect): define only when HAVE_FORK.
+
Tue Nov 20 12:12:04 2007 Tanaka Akira <akr@f...>
* include/ruby/io.h (rb_io_t): add tied_io_for_writing member.
Index: io.c
===================================================================
--- io.c (revision 13977)
+++ io.c (revision 13978)
@@ -3138,6 +3138,7 @@
rb_io_synchronized(fptr);
}
+#ifdef HAVE_FORK
struct popen_arg {
struct rb_exec_arg exec;
int modef;
@@ -3176,7 +3177,6 @@
}
}
-#ifdef HAVE_FORK
static int
popen_exec(void *pp)
{
@@ -3299,7 +3299,7 @@
exename = cmd;
cmd = rb_w32_join_argv(ALLOCA_N(char, rb_w32_argv_size(args)), args);
}
- while ((pid = rb_w32_pipe_exec(cmd, exename, openmode, &fd)) == -1) {
+ while ((pid = rb_w32_pipe_exec(cmd, exename, openmode, &fd, &write_fd)) == -1) {
/* exec failed */
switch (errno) {
case EAGAIN:
Index: win32/win32.c
===================================================================
--- win32/win32.c (revision 13977)
+++ win32/win32.c (revision 13978)
@@ -706,39 +706,32 @@
static int socketpair_internal(int af, int type, int protocol, SOCKET *sv);
rb_pid_t
-rb_w32_pipe_exec(const char *cmd, const char *prog, int mode, int *pipe)
+rb_w32_pipe_exec(const char *cmd, const char *prog, int mode, int *pipe, int *write_pipe)
{
struct ChildRecord* child;
- HANDLE hOrg, hIn, hOut;
- HANDLE hDupFile;
+ HANDLE hIn, hOut;
+ HANDLE hDupIn, hDupOut;
HANDLE hCurProc;
SECURITY_ATTRIBUTES sa;
BOOL reading, writing;
SOCKET pair[2];
int fd;
- int pipemode;
+ int binmode;
int ret;
/* Figure out what we're doing... */
if (mode & O_RDWR) {
- if (IsWin95()) {
- errno = EINVAL;
- return -1;
- }
reading = writing = TRUE;
- pipemode = _O_RDWR;
}
else if (mode & O_WRONLY) {
reading = FALSE;
writing = TRUE;
- pipemode = _O_WRONLY;
}
else {
reading = TRUE;
writing = FALSE;
- pipemode = _O_RDONLY;
}
- pipemode |= (mode & O_BINARY) ? O_BINARY : O_TEXT;
+ binmode |= (mode & O_BINARY) ? O_BINARY : O_TEXT;
sa.nLength = sizeof (SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
@@ -748,68 +741,72 @@
RUBY_CRITICAL(do {
/* create pipe */
hCurProc = GetCurrentProcess();
- if (reading && writing) {
- if (socketpair_internal(AF_INET, SOCK_STREAM, 0, pair) < 0) {
- break;
- }
- if (!DuplicateHandle(hCurProc, (HANDLE)pair[1], hCurProc,
- &hDupFile, 0, FALSE,
- DUPLICATE_SAME_ACCESS)) {
+ hIn = hOut = hDupIn = hDupOut = NULL;
+ if (reading) {
+ HANDLE hTmpIn;
+ if (!CreatePipe(&hTmpIn, &hOut, &sa, 2048L)) {
errno = map_errno(GetLastError());
- closesocket(pair[0]);
- closesocket(pair[1]);
- CloseHandle(hCurProc);
break;
}
- closesocket(pair[1]);
- hOrg = hIn = hOut = (HANDLE)pair[0];
- }
- else if (reading) {
- if (!CreatePipe(&hIn, &hOut, &sa, 2048L)) {
- errno = map_errno(GetLastError());
- break;
- }
- if (!DuplicateHandle(hCurProc, hIn, hCurProc, &hDupFile, 0,
+ if (!DuplicateHandle(hCurProc, hTmpIn, hCurProc, &hDupIn, 0,
FALSE, DUPLICATE_SAME_ACCESS)) {
errno = map_errno(GetLastError());
- CloseHandle(hIn);
+ CloseHandle(hTmpIn);
CloseHandle(hOut);
break;
}
- CloseHandle(hIn);
- hIn = NULL;
- hOrg = hOut;
+ CloseHandle(hTmpIn);
+ hTmpIn = NULL;
}
- else { /* writing */
- if (!CreatePipe(&hIn, &hOut, &sa, 2048L)) {
+ if (writing) {
+ HANDLE hTmpOut;
+ if (!CreatePipe(&hIn, &hTmpOut, &sa, 2048L)) {
errno = map_errno(GetLastError());
break;
}
- if (!DuplicateHandle(hCurProc, hOut, hCurProc, &hDupFile, 0,
+ if (!DuplicateHandle(hCurProc, hTmpOut, hCurProc, &hDupOut, 0,
FALSE, DUPLICATE_SAME_ACCESS)) {
errno = map_errno(GetLastError());
CloseHandle(hIn);
- CloseHandle(hOut);
+ CloseHandle(hTmpOut);
break;
}
- CloseHandle(hOut);
- hOut = NULL;
- hOrg = hIn;
+ CloseHandle(hTmpOut);
+ hTmpOut = NULL;
}
/* create child process */
child = CreateChild(cmd, prog, &sa, hIn, hOut, NULL);
if (!child) {
- CloseHandle(hOrg);
- CloseHandle(hDupFile);
+ if (hIn)
+ CloseHandle(hIn);
+ if (hOut)
+ CloseHandle(hOut);
+ if (hDupIn)
+ CloseHandle(hDupIn);
+ if (hDupOut)
+ CloseHandle(hDupOut);
break;
}
/* associate handle to file descritor */
- *pipe = rb_w32_open_osfhandle((intptr_t)hDupFile, pipemode);
- CloseHandle(hOrg);
+ if (reading) {
+ *pipe = rb_w32_open_osfhandle((intptr_t)hDupIn, _O_RDONLY | binmode);
+ if (writing)
+ *write_pipe = rb_w32_open_osfhandle((intptr_t)hDupOut, _O_WRONLY | binmode);
+ }
+ else {
+ *pipe = rb_w32_open_osfhandle((intptr_t)hDupOut, _O_WRONLY | binmode);
+ }
+ if (hIn)
+ CloseHandle(hIn);
+ if (hOut)
+ CloseHandle(hOut);
if (*pipe == -1) {
- CloseHandle(hDupFile);
+ if (hDupIn)
+ CloseHandle(hDupIn);
+ if (hDupOut)
+ CloseHandle(hDupOut);
CloseChildHandle(child);
break;
}
Index: version.h
===================================================================
--- version.h (revision 13977)
+++ version.h (revision 13978)
@@ -1,7 +1,7 @@
#define RUBY_VERSION "1.9.0"
-#define RUBY_RELEASE_DATE "2007-11-19"
+#define RUBY_RELEASE_DATE "2007-11-20"
#define RUBY_VERSION_CODE 190
-#define RUBY_RELEASE_CODE 20071119
+#define RUBY_RELEASE_CODE 20071120
#define RUBY_PATCHLEVEL 0
#define RUBY_VERSION_MAJOR 1
@@ -9,7 +9,7 @@
#define RUBY_VERSION_TEENY 0
#define RUBY_RELEASE_YEAR 2007
#define RUBY_RELEASE_MONTH 11
-#define RUBY_RELEASE_DAY 19
+#define RUBY_RELEASE_DAY 20
#ifdef RUBY_EXTERN
RUBY_EXTERN const char ruby_version[];
--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml