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/