mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* 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/trunk@12758 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
091fb1c2e4
commit
9dbaa0a9a9
2 changed files with 24 additions and 10 deletions
|
@ -1,3 +1,8 @@
|
|||
Fri Jul 13 15:02:15 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]
|
||||
|
||||
Fri Jul 13 11:33:09 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* range.c (range_max, range_min): return nil for empty set as well as
|
||||
|
|
|
@ -527,7 +527,7 @@ FindFreeChildSlot(void)
|
|||
-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,
|
||||
|
@ -586,16 +586,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));
|
||||
|
@ -929,6 +935,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)) {
|
||||
|
@ -947,10 +954,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 {
|
||||
|
|
Loading…
Reference in a new issue