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

ruby-changes:20960

From: nobu <ko1@a...>
Date: Fri, 19 Aug 2011 14:27:05 +0900 (JST)
Subject: [ruby-changes:20960] nobu:r33009 (trunk, ruby_1_9_3): * process.c (proc_spawn_v, proc_spawn): should not wait the

nobu	2011-08-19 14:25:52 +0900 (Fri, 19 Aug 2011)

  New Revision: 33009

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

  Log:
    * process.c (proc_spawn_v, proc_spawn): should not wait the
      spawned process.
    * process.c (proc_spawn_v): fix missing argument, and try with
      /bin/sh only if failed with ENOEXEC.

  Modified files:
    branches/ruby_1_9_3/ChangeLog
    branches/ruby_1_9_3/configure.in
    branches/ruby_1_9_3/process.c
    trunk/ChangeLog
    trunk/configure.in
    trunk/process.c

Index: configure.in
===================================================================
--- configure.in	(revision 33008)
+++ configure.in	(revision 33009)
@@ -1143,7 +1143,7 @@
 		 syscall.h pwd.h grp.h a.out.h utime.h direct.h sys/resource.h \
 		 sys/mkdev.h sys/utime.h xti.h netinet/in_systm.h float.h ieeefp.h \
 		 ucontext.h intrinsics.h langinfo.h locale.h sys/sendfile.h time.h \
-		 net/socket.h sys/socket.h)
+		 net/socket.h sys/socket.h process.h)
 
 AC_TYPE_SIZE_T
 RUBY_CHECK_SIZEOF(size_t, [int long void*], [], [@%:@include <sys/types.h>])
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 33008)
+++ ChangeLog	(revision 33009)
@@ -1,3 +1,11 @@
+Fri Aug 19 14:25:51 2011  Nobuyoshi Nakada  <nobu@r...>
+
+	* process.c (proc_spawn_v, proc_spawn): should not wait the
+	  spawned process.
+
+	* process.c (proc_spawn_v): fix missing argument, and try with
+	  /bin/sh only if failed with ENOEXEC.
+
 Fri Aug 19 14:12:57 2011  Shugo Maeda  <shugo@r...>
 
 	* lib/net/imap.rb (idle): raises a Net::IMAP::Error when the
Index: process.c
===================================================================
--- process.c	(revision 33008)
+++ process.c	(revision 33009)
@@ -29,6 +29,9 @@
 #ifdef HAVE_FCNTL_H
 #include <fcntl.h>
 #endif
+#ifdef HAVE_PROCESS_H
+#include <process.h>
+#endif
 
 #include <time.h>
 #include <ctype.h>
@@ -1205,6 +1208,15 @@
 #endif
 
 #if !defined(HAVE_FORK) && defined(HAVE_SPAWNV)
+# define USE_SPAWNV 1
+#else
+# define USE_SPAWNV 0
+#endif
+#ifndef P_NOWAIT
+# define P_NOWAIT _P_NOWAIT
+#endif
+
+#if USE_SPAWNV
 #if defined(_WIN32)
 #define proc_spawn_v(argv, prog) rb_w32_aspawn(P_NOWAIT, (prog), (argv))
 #else
@@ -1222,14 +1234,15 @@
 	return -1;
 
     before_exec();
-    status = spawnv(P_WAIT, prog, argv);
-    preserving_errno({
-	rb_last_status_set(status == -1 ? 127 : status, 0);
+    status = spawnv(P_NOWAIT, prog, (const char **)argv);
+    if (status == -1 && errno == ENOEXEC) {
 	*argv = (char *)prog;
 	*--argv = (char *)"sh";
-	status = spawnv("/bin/sh", argv);
+	status = spawnv(P_NOWAIT, "/bin/sh", (const char **)argv);
 	after_exec();
-    });
+	if (status == -1) errno = ENOEXEC;
+    }
+    rb_last_status_set(status == -1 ? 127 : status, 0);
     return status;
 }
 #endif
@@ -1269,7 +1282,7 @@
 	if (*s != ' ' && !ISALPHA(*s) && strchr("*?{}[]<>()~&|\\$;'`\"\n",*s)) {
 	    char *shell = dln_find_exe_r("sh", 0, fbuf, sizeof(fbuf));
 	    before_exec();
-	    status = shell?spawnl(P_WAIT,shell,"sh","-c",str,(char*)NULL):system(str);
+	    status = spawnl(P_NOWAIT, (shell ? shell : "/bin/sh"), "sh", "-c", str, (char*)NULL);
 	    rb_last_status_set(status == -1 ? 127 : status, 0);
 	    after_exec();
 	    return status;
@@ -2966,16 +2979,16 @@
 rb_spawn_process(struct rb_exec_arg *earg, VALUE prog, char *errmsg, size_t errmsg_buflen)
 {
     rb_pid_t pid;
-#if defined HAVE_FORK || !defined HAVE_SPAWNV
+#if !USE_SPAWNV
     int status;
 #endif
-#if !defined HAVE_FORK
+#if !defined HAVE_FORK || USE_SPAWNV
     struct rb_exec_arg sarg;
     int argc;
     VALUE *argv;
 #endif
 
-#if defined HAVE_FORK
+#if defined HAVE_FORK && !USE_SPAWNV
     pid = rb_fork_err(&status, rb_exec_atfork, earg, earg->redirect_fds, errmsg, errmsg_buflen);
 #else
     if (rb_run_exec_options_err(earg, &sarg, errmsg, errmsg_buflen) < 0) {
Index: ruby_1_9_3/configure.in
===================================================================
--- ruby_1_9_3/configure.in	(revision 33008)
+++ ruby_1_9_3/configure.in	(revision 33009)
@@ -1154,7 +1154,7 @@
 		 syscall.h pwd.h grp.h a.out.h utime.h direct.h sys/resource.h \
 		 sys/mkdev.h sys/utime.h xti.h netinet/in_systm.h float.h ieeefp.h \
 		 ucontext.h intrinsics.h langinfo.h locale.h sys/sendfile.h time.h \
-		 net/socket.h sys/socket.h)
+		 net/socket.h sys/socket.h process.h)
 
 AC_TYPE_SIZE_T
 RUBY_CHECK_SIZEOF(size_t, [int long void*], [], [@%:@include <sys/types.h>])
Index: ruby_1_9_3/ChangeLog
===================================================================
--- ruby_1_9_3/ChangeLog	(revision 33008)
+++ ruby_1_9_3/ChangeLog	(revision 33009)
@@ -1,3 +1,11 @@
+Fri Aug 19 14:25:51 2011  Nobuyoshi Nakada  <nobu@r...>
+
+	* process.c (proc_spawn_v, proc_spawn): should not wait the
+	  spawned process.
+
+	* process.c (proc_spawn_v): fix missing argument, and try with
+	  /bin/sh only if failed with ENOEXEC.
+
 Fri Aug 19 14:12:57 2011  Shugo Maeda  <shugo@r...>
 
 	* backport r33007 from trunk.
Index: ruby_1_9_3/process.c
===================================================================
--- ruby_1_9_3/process.c	(revision 33008)
+++ ruby_1_9_3/process.c	(revision 33009)
@@ -29,6 +29,9 @@
 #ifdef HAVE_FCNTL_H
 #include <fcntl.h>
 #endif
+#ifdef HAVE_PROCESS_H
+#include <process.h>
+#endif
 
 #include <time.h>
 #include <ctype.h>
@@ -1216,6 +1219,15 @@
 #endif
 
 #if !defined(HAVE_FORK) && defined(HAVE_SPAWNV)
+# define USE_SPAWNV 1
+#else
+# define USE_SPAWNV 0
+#endif
+#ifndef P_NOWAIT
+# define P_NOWAIT _P_NOWAIT
+#endif
+
+#if USE_SPAWNV
 #if defined(_WIN32)
 #define proc_spawn_v(argv, prog) rb_w32_aspawn(P_NOWAIT, (prog), (argv))
 #else
@@ -1233,14 +1245,15 @@
 	return -1;
 
     before_exec();
-    status = spawnv(P_WAIT, prog, argv);
-    preserving_errno({
-	rb_last_status_set(status == -1 ? 127 : status, 0);
+    status = spawnv(P_NOWAIT, prog, (const char **)argv);
+    if (status == -1 && errno == ENOEXEC) {
 	*argv = (char *)prog;
 	*--argv = (char *)"sh";
-	status = spawnv("/bin/sh", argv);
+	status = spawnv(P_NOWAIT, "/bin/sh", (const char **)argv);
 	after_exec();
-    });
+	if (status == -1) errno = ENOEXEC;
+    }
+    rb_last_status_set(status == -1 ? 127 : status, 0);
     return status;
 }
 #endif
@@ -1280,7 +1293,7 @@
 	if (*s != ' ' && !ISALPHA(*s) && strchr("*?{}[]<>()~&|\\$;'`\"\n",*s)) {
 	    char *shell = dln_find_exe_r("sh", 0, fbuf, sizeof(fbuf));
 	    before_exec();
-	    status = shell?spawnl(P_WAIT,shell,"sh","-c",str,(char*)NULL):system(str);
+	    status = spawnl(P_NOWAIT, (shell ? shell : "/bin/sh"), "sh", "-c", str, (char*)NULL);
 	    rb_last_status_set(status == -1 ? 127 : status, 0);
 	    after_exec();
 	    return status;
@@ -3011,16 +3024,16 @@
 rb_spawn_process(struct rb_exec_arg *earg, VALUE prog, char *errmsg, size_t errmsg_buflen)
 {
     rb_pid_t pid;
-#if defined HAVE_FORK || !defined HAVE_SPAWNV
+#if !USE_SPAWNV
     int status;
 #endif
-#if !defined HAVE_FORK
+#if !defined HAVE_FORK || USE_SPAWNV
     struct rb_exec_arg sarg;
     int argc;
     VALUE *argv;
 #endif
 
-#if defined HAVE_FORK
+#if defined HAVE_FORK && !USE_SPAWNV
     pid = rb_fork_err(&status, rb_exec_atfork, earg, earg->redirect_fds, errmsg, errmsg_buflen);
 #else
     if (rb_run_exec_options_err(earg, &sarg, errmsg, errmsg_buflen) < 0) {

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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