diff options
author | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-08-15 19:58:32 +0000 |
---|---|---|
committer | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-08-15 19:58:32 +0000 |
commit | 6c80040ef41db245fa442ad6e7e7b4d1215ce5d7 (patch) | |
tree | 3396ea719e907bd7d9d9aab8f12c35f7c7b4ef67 | |
parent | 467d6abc59180247311575c90885b225ea876e61 (diff) |
* win32/win32.c (CreateChild): enclose command line except for
command.com which can not handle quotes. [ruby-talk:258939]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_5@12982 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | version.h | 2 | ||||
-rw-r--r-- | win32/win32.c | 29 |
3 files changed, 25 insertions, 11 deletions
@@ -1,3 +1,8 @@ +Thu Aug 16 04:56:35 2007 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * win32/win32.c (CreateChild): enclose command line except for + command.com which can not handle quotes. [ruby-talk:258939] + Thu Aug 16 04:54:45 2007 Nobuyoshi Nakada <nobu@ruby-lang.org> * lib/mkmf.rb (link_command, cc_command, cpp_command): do not expand @@ -2,7 +2,7 @@ #define RUBY_RELEASE_DATE "2007-08-16" #define RUBY_VERSION_CODE 185 #define RUBY_RELEASE_CODE 20070816 -#define RUBY_PATCHLEVEL 69 +#define RUBY_PATCHLEVEL 70 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 8 diff --git a/win32/win32.c b/win32/win32.c index b88c136467..cdb5b61bc9 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -528,7 +528,7 @@ SafeFree(char **vec, int vecc) -e 'END{$cmds.sort.each{|n,f|puts " \"\\#{f.to_s(8)}\" #{n.dump} + 1,"}}' 98cmd ntcmd */ -static char *szInternalCmds[] = { +static const char *const szInternalCmds[] = { "\2" "assoc" + 1, "\3" "break" + 1, "\3" "call" + 1, @@ -587,16 +587,22 @@ internal_match(const void *key, const void *elem) } static int -isInternalCmd(const char *cmd, const char *interp) +is_command_com(const char *interp) { - int i, nt = 1; - char cmdname[9], *b = cmdname, c, **nm; + int i = strlen(interp) - 11; - i = strlen(interp) - 11; if ((i == 0 || i > 0 && isdirsep(interp[i-1])) && strcasecmp(interp+i, "command.com") == 0) { - nt = 0; + return 1; } + return 0; +} + +static int +is_internal_cmd(const char *cmd, int nt) +{ + char cmdname[9], *b = cmdname, c, **nm; + do { if (!(c = *cmd++)) return 0; } while (isspace(c)); @@ -964,6 +970,7 @@ CreateChild(const char *cmd, const char *prog, SECURITY_ATTRIBUTES *psa, else { int redir = -1; int len = 0; + int nt; while (ISSPACE(*cmd)) cmd++; for (prog = cmd; *prog; prog = CharNext(prog)) { if (ISSPACE(*prog)) { @@ -982,10 +989,12 @@ CreateChild(const char *cmd, const char *prog, SECURITY_ATTRIBUTES *psa, cmd = tmp; } else if ((shell = getenv("COMSPEC")) && - ((redir < 0 ? has_redirection(cmd) : redir) || - isInternalCmd(cmd, shell))) { - char *tmp = ALLOCA_N(char, strlen(shell) + len + sizeof(" /c ")); - sprintf(tmp, "%s /c %.*s", shell, len, cmd); + (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 ") + + (nt ? 2 : 0)); + sprintf(tmp, nt ? "%s /c \"%.*s\"" : "%s /c %.*s", shell, len, cmd); cmd = tmp; } else { |