diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-05-20 15:36:34 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-05-20 15:36:34 +0000 |
commit | aa107497cd379b713eba8cecdb9a882bb1e0dd89 (patch) | |
tree | 2bb39d9e87512d5937e85b47fee89ae285f85240 /process.c | |
parent | cbde995b2f271396689573d7306df185b86f9b6a (diff) |
fix build on no-fork-spawnv platforms
* process.c (rb_execarg_commandline): build command line string
from argument vector in rb_execarg.
[ruby-core:75611] [Bug #12398]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55091 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'process.c')
-rw-r--r-- | process.c | 33 |
1 files changed, 27 insertions, 6 deletions
@@ -3902,6 +3902,29 @@ rb_syswait(rb_pid_t pid) rb_waitpid(pid, &status, 0); } +#if !defined HAVE_WORKING_FORK && !defined HAVE_SPAWNV +char * +rb_execarg_commandline(const struct rb_execarg *eargp, VALUE *prog) +{ + VALUE cmd = *prog; + if (eargp && !eargp->use_shell) { + VALUE str = eargp->invoke.cmd.argv_str; + VALUE buf = eargp->invoke.cmd.argv_buf; + char *p, **argv = ARGVSTR2ARGV(str); + long i, argc = ARGVSTR2ARGC(str); + const char *start = RSTRING_PTR(buf); + cmd = rb_str_new(start, RSTRING_LEN(buf)); + p = RSTRING_PTR(cmd); + for (i = 1; i < argc; ++i) { + p[argv[i] - start - 1] = ' '; + } + *prog = cmd; + return p; + } + return StringValueCStr(*prog); +} +#endif + static rb_pid_t rb_spawn_process(struct rb_execarg *eargp, char *errmsg, size_t errmsg_buflen) { @@ -3909,6 +3932,9 @@ rb_spawn_process(struct rb_execarg *eargp, char *errmsg, size_t errmsg_buflen) #if !defined HAVE_WORKING_FORK || USE_SPAWNV VALUE prog; struct rb_execarg sarg; +# if !defined HAVE_SPAWNV + int status; +# endif #endif #if defined HAVE_WORKING_FORK && !USE_SPAWNV @@ -3935,12 +3961,7 @@ rb_spawn_process(struct rb_execarg *eargp, char *errmsg, size_t errmsg_buflen) if (pid == -1) rb_last_status_set(0x7f << 8, 0); # else - if (!eargp->use_shell) { - char **argv = ARGVSTR2ARGV(eargp->invoke.cmd.argv_str); - int argc = ARGVSTR2ARGC(eargp->invoke.cmd.argv_str); - prog = rb_ary_join(rb_ary_new4(argc, argv), rb_str_new2(" ")); - } - status = system(StringValuePtr(prog)); + status = system(rb_execarg_commandline(eargp, &prog)); rb_last_status_set((status & 0xff) << 8, 0); pid = 1; /* dummy */ # endif |