#23927 [Opn->Bgs]: System::_parseArgv() fails if there are spaces
| From: | pajoye@php.net | Date: | Tue, 03 Jun 2003 17:28:22 +0000 |
| Subject: | #23927 [Opn->Bgs]: System::_parseArgv() fails if there are spaces | ||
| References: | 1 | Groups: | php.pear.dev |
| Request: | Send a blank email to pear-dev+get-16957@lists.php.net to get a copy of this message | ||
ID: 23927
Updated by: pajoye@php.net
Reported By: greg at chiaraquartet dot net
-Status: Open
+Status: Bogus
Bug Type: PEAR related
Operating System: Windows XP
PHP Version: 4.3.2
New Comment:
Please do not submit the same bug more than once. An existing
bug report already describes this very problem. Even if you feel
that your issue is somewhat different, the resolution is likely
to be the same. Because of this, we hope you add your comments
to the existing bug instead.
Thank you for your interest in PHP.
Spaces are currently not allowed in path, you may use the short names
under win32 (c:/progra~1).
There is BC issue to take care about this problem.
btw, System::_parseArgv() is a private method, I hope you do not rely
on it :)
pierre
Previous Comments:
------------------------------------------------------------------------
[2003-05-31 17:34:57] greg at chiaraquartet dot net
In addition, line 382 of System.php (in System::mktemp()) needs to be:
if (!System::mkDir("-p \"$tmpdir\"")) {
instead of
if (!System::mkDir("-p $tmpdir")) {
after the last applied patch
------------------------------------------------------------------------
[2003-05-31 16:27:55] greg at chiaraquartet dot net
A fix allows quoted arguments, so it would be called with
-t "C:\Web Pages" -d and expand properly.
Here is the diff with System.php:
64a65,93
> $newargv = array();
> $in_quote = false;
> $index = 0;
> foreach($argv as $arg)
> {
> if (!isset($newargv[$index])) {
> $newargv[$index] = '';
> }
> // combine quoted values into 1 string
> if (!$in_quote && $arg{0} == '"') {
> $newargv[$index] = substr($arg,1);
> $in_quote = true;
> } elseif ($in_quote && $arg{strlen($arg) - 1} == '"')
{
> $arg = ' ' . $arg;
> $newargv[$index] .= substr($arg,0,strlen($arg) -
1);
> $in_quote = false;
> $index++;
> } else {
> if ($in_quote) {
> $arg .= ' ';
> }
> $newargv[$index] .= $arg;
> if (!$in_quote) {
> // go to next value if not in a quote
> $index++;
> }
> }
> }
> $argv = $newargv;
and the diff against Packager.php:
119c119
< if (!($tmpdir = System::mktemp('-t '.getcwd().' -d'))) {
---
> if (!($tmpdir = System::mktemp('-t "'.getcwd().'" -d')))
> {
------------------------------------------------------------------------
[2003-05-31 14:17:15] greg at chiaraquartet dot net
the Pear packager attempts to mktemp a directory as a subdirectory of
the current directory. If the current directory has any spaces in its
name (I have C:\Web Pages), then it will fail.
This is because System::mktemp is called with "-t C:\Web Pages -d"
_parseArgv's use of a regexp parses the result into "-t C:\Web" and
"Pages -d"
A better command-line parsing algorithm is in phpDocumentor's Io class,
it allows spaces and simply recognizes the command-line params.
Greg
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=23927&edit=1