[前][次][番号順一覧][スレッド一覧]

ruby-changes:8993

From: usa <ko1@a...>
Date: Fri, 5 Dec 2008 01:39:21 +0900 (JST)
Subject: [ruby-changes:8993] Ruby:r20528 (trunk): * win32/win32.c (rb_w32_read): ERROR_BROKEN_PIPE is not a real error

usa	2008-12-05 01:39:03 +0900 (Fri, 05 Dec 2008)

  New Revision: 20528

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=20528

  Log:
    * 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:
    trunk/ChangeLog
    trunk/io.c
    trunk/win32/win32.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 20527)
+++ ChangeLog	(revision 20528)
@@ -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.
+
 Fri Dec  5 01:35:08 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* string.c (sym_to_proc): use hidden object.
Index: io.c
===================================================================
--- io.c	(revision 20527)
+++ io.c	(revision 20528)
@@ -4445,6 +4445,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;
@@ -4569,11 +4570,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:
@@ -4591,6 +4623,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: win32/win32.c
===================================================================
--- win32/win32.c	(revision 20527)
+++ win32/win32.c	(revision 20528)
@@ -4391,11 +4391,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/

[前][次][番号順一覧][スレッド一覧]