diff options
author | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-12-23 07:50:57 +0000 |
---|---|---|
committer | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-12-23 07:50:57 +0000 |
commit | 15432b67aae3aa1c5a2f0a0298368c6159523e1c (patch) | |
tree | 242327f500db7cf847a30a6375a691f326d8c218 | |
parent | 0ac07a2cca4eded3d65113d15b8bc3ef719ac5c0 (diff) | |
download | ruby-15432b67aae3aa1c5a2f0a0298368c6159523e1c.tar.gz ruby-15432b67aae3aa1c5a2f0a0298368c6159523e1c.tar.xz ruby-15432b67aae3aa1c5a2f0a0298368c6159523e1c.zip |
* win32/win32.c (rb_w32_spawn): support normal commands with arguments.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@20942 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | win32/win32.c | 34 |
2 files changed, 21 insertions, 17 deletions
@@ -1,3 +1,7 @@ +Tue Dec 23 16:49:48 2008 NAKAMURA Usaku <usa@ruby-lang.org> + + * win32/win32.c (rb_w32_spawn): support normal commands with arguments. + Tue Dec 23 16:22:41 2008 Tanaka Akira <akr@fsij.org> * io.c (rb_io_inspect): show fd number if there is no pathname. diff --git a/win32/win32.c b/win32/win32.c index 9697c8ec6..e111bf87e 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -900,35 +900,36 @@ rb_w32_spawn(int mode, const char *cmd, const char *prog) } else { int redir = -1; - int len = 0; int nt; while (ISSPACE(*cmd)) cmd++; - for (prog = cmd; *prog; prog = CharNext(prog)) { - if (ISSPACE(*prog)) { - len = prog - cmd; - do ++prog; while (ISSPACE(*prog)); - if (!*prog--) break; - } - else { - len = 0; - } - } - if (!len) len = strlen(cmd); if ((shell = getenv("RUBYSHELL")) && (redir = has_redirection(cmd))) { - char *tmp = ALLOCA_N(char, strlen(shell) + len + sizeof(" -c ") + 2); - sprintf(tmp, "%s -c \"%.*s\"", shell, len, cmd); + char *tmp = ALLOCA_N(char, strlen(shell) + strlen(cmd) + sizeof(" -c ") + 2); + sprintf(tmp, "%s -c \"%s\"", shell, cmd); cmd = tmp; } else if ((shell = getenv("COMSPEC")) && (nt = !is_command_com(shell), (redir < 0 ? has_redirection(cmd) : redir) || is_internal_cmd(cmd, nt))) { - char *tmp = ALLOCA_N(char, strlen(shell) + len + sizeof(" /c ") + char *tmp = ALLOCA_N(char, strlen(shell) + strlen(cmd) + sizeof(" /c ") + (nt ? 2 : 0)); - sprintf(tmp, nt ? "%s /c \"%.*s\"" : "%s /c %.*s", shell, len, cmd); + sprintf(tmp, nt ? "%s /c \"%s\"" : "%s /c %s", shell, cmd); cmd = tmp; } else { + int len = 0; + for (prog = cmd; *prog; prog = CharNext(prog)) { + if (ISSPACE(*prog)) { + len = prog - cmd; + do ++prog; while (ISSPACE(*prog)); + break; + } + else { + len = 0; + } + } + if (!len) len = strlen(cmd); + shell = NULL; prog = cmd; for (;;) { @@ -941,7 +942,6 @@ rb_w32_spawn(int mode, const char *cmd, const char *prog) STRNDUPA(p, cmd, len); } p = dln_find_exe_r(p ? p : cmd, NULL, fbuf, sizeof(fbuf)); - cmd += len; break; } if (ISSPACE(*prog) || strchr("<>|", *prog)) { |