Is it possible that switching /S on will break existing scripts? If so, it's probably better to make the comspec setting a PHP .ini option that only the admin can change and allow /S to be set there.
--Wez. On 2/5/06, Tim Starling <[EMAIL PROTECTED]> wrote: > This patch is untested, my apologies for that. I don't have a working Visual > C++ environment in > which to compile PHP at the moment. I have, however, tested the concepts > involved. I can also > provide test cases and expected output if that would help. > > The problem is PHP's incorrect invocation of cmd.exe, which causes no end of > trouble to those > developing PHP applications on Windows systems. You can find many workarounds > for it in the manual > comments, but a permanent, robust fix is actually quite simple, at least for > NT-based versions of > Windows. > > Here is an extract of the output of "help cmd" on Windows XP: > > CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF] > [[/S] [/C | /K] string] > > /C Carries out the command specified by string and then terminates > /K Carries out the command specified by string but remains > > [...] > > If /C or /K is specified, then the remainder of the command line after > the switch is processed as a command line, where the following logic is > used to process quote (") characters: > > 1. If all of the following conditions are met, then quote characters > on the command line are preserved: > > - no /S switch > - exactly two quote characters > - no special characters between the two quote characters, > where special is one of: &<>()@^| > - there are one or more whitespace characters between the > the two quote characters > - the string between the two quote characters is the name > of an executable file. > > 2. Otherwise, old behavior is to see if the first character is > a quote character and if so, strip the leading character and > remove the last quote character on the command line, preserving > any text after the last quote character. > > [end quote] > > This provides a simple, robust means to execute a command via cmd.exe: > > cmd.exe /s /c "...command goes here..." > > Otherwise, the programmer risks being plunged into a world of heuristic pain > that only a Microsoft > developer could love. Some instructive examples: > > C:\>cmd /c "C:\Program Files\ImageMagick-6.2.6-Q16\convert.exe" > Version: ImageMagick 6.2.6 01/27/06 Q16 http://www.imagemagick.org > Copyright: Copyright (C) 1999-2006 ImageMagick Studio LLC > > Usage: convert.exe [options ...] file [ [options ...] file ...] [options ...] > file > [...] > > C:\>cmd /c "C:\Program Files\ImageMagick-6.2.6-Q16\convert.exe" -version > Version: ImageMagick 6.2.6 01/27/06 Q16 http://www.imagemagick.org > Copyright: Copyright (C) 1999-2006 ImageMagick Studio LLC > > C:\>cmd /c "C:\Program Files\ImageMagick-6.2.6-Q16\convert.exe" "some file" > 'C:\Program' is not recognized as an internal or external command, > operable program or batch file. > > C:\>cd "C:\Program Files\ImageMagick-6.2.6-Q16" > > C:\Program Files\ImageMagick-6.2.6-Q16>cmd /c "convert source dest" > convert: unable to open image `source': No such file or directory. > convert: missing an image filename `dest'. > > C:\Program Files\ImageMagick-6.2.6-Q16>echo @echo G'day > "convert source > dest.bat" > > C:\Program Files\ImageMagick-6.2.6-Q16>cmd /c "convert source dest" > G'day > > > > Positively scary. /s restores sanity to the situation: > > C:\Program Files\ImageMagick-6.2.6-Q16>cmd /s /c "convert source dest" > convert: unable to open image `source': No such file or directory. > convert: missing an image filename `dest'. > > > Users of COMMAND.COM are not so blessed. There's no handling for double > quotes at all, so if you > want to execute a program with spaces in the name, you just have to use the > 8.3 alias. In my patch, > this is the responsibility of the application. > > C:\>command.com /s /c "echo hello" > Invalid switch > Bad command or file name > > The problem as it manifests itself in PHP was reported as Bug #34671, and > closed as bogus by a > trigger-happy admin. You can't work around it properly in application-level > code, because you can't > specify /s. > > -- Tim Starling > > > Index: TSRM/tsrm_win32.c > =================================================================== > RCS file: /repository/TSRM/tsrm_win32.c,v > retrieving revision 1.28 > diff -u -r1.28 tsrm_win32.c > --- TSRM/tsrm_win32.c 1 Jan 2006 13:09:48 -0000 1.28 > +++ TSRM/tsrm_win32.c 6 Feb 2006 01:53:29 -0000 > @@ -209,8 +209,15 @@ > startup.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); > } > > - cmd = (char*)malloc(strlen(command)+strlen(TWG(comspec))+sizeof(" /c > ")); > - sprintf(cmd, "%s /c %s", TWG(comspec), command); > + if (GetVersion()<0x80000000) { > + /* NT calling convention: quotes around everything, /s to > disable heuristics */ > + cmd = > (char*)malloc(strlen(command)+strlen(TWG(comspec))+sizeof(" /s /c \"\"")); > + sprintf(cmd, "%s /s /c \"%s\"", TWG(comspec), command); > + } else { > + /* 95/98/Me calling convention. Long names need to be > converted to short names by the application. */ > + cmd = > (char*)malloc(strlen(command)+strlen(TWG(comspec))+sizeof(" /c ")); > + sprintf(cmd, "%s /c %s", TWG(comspec), command); > + } > if (!CreateProcess(NULL, cmd, &security, &security, > security.bInheritHandle, NORMAL_PRIORITY_CLASS, env, cwd, &startup, > &process)) { > return NULL; > } > > > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > > -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php