2015-08-17 17:00:26 -07:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\Process ;
/**
* Generic executable finder .
*
* @ author Fabien Potencier < fabien @ symfony . com >
* @ author Johannes M . Schmitt < schmittjoh @ gmail . com >
*/
class ExecutableFinder
{
private $suffixes = array ( '.exe' , '.bat' , '.cmd' , '.com' );
/**
* Replaces default suffixes of executable .
*
* @ param array $suffixes
*/
public function setSuffixes ( array $suffixes )
{
$this -> suffixes = $suffixes ;
}
/**
* Adds new possible suffix to check for executable .
*
* @ param string $suffix
*/
public function addSuffix ( $suffix )
{
$this -> suffixes [] = $suffix ;
}
/**
* Finds an executable by name .
*
* @ param string $name The executable name ( without the extension )
* @ param string $default The default to return if no executable is found
* @ param array $extraDirs Additional dirs to check into
*
* @ return string The executable path or default value
*/
public function find ( $name , $default = null , array $extraDirs = array ())
{
if ( ini_get ( 'open_basedir' )) {
$searchPath = explode ( PATH_SEPARATOR , ini_get ( 'open_basedir' ));
$dirs = array ();
foreach ( $searchPath as $path ) {
2015-11-17 13:42:33 -08:00
// Silencing against https://bugs.php.net/69240
if ( @ is_dir ( $path )) {
2015-08-17 17:00:26 -07:00
$dirs [] = $path ;
} else {
2017-02-02 16:28:38 -08:00
if ( basename ( $path ) == $name && @ is_executable ( $path )) {
2015-08-17 17:00:26 -07:00
return $path ;
}
}
}
} else {
$dirs = array_merge (
explode ( PATH_SEPARATOR , getenv ( 'PATH' ) ? : getenv ( 'Path' )),
$extraDirs
);
}
$suffixes = array ( '' );
if ( '\\' === DIRECTORY_SEPARATOR ) {
$pathExt = getenv ( 'PATHEXT' );
2017-04-13 15:53:35 +01:00
$suffixes = array_merge ( $suffixes , $pathExt ? explode ( PATH_SEPARATOR , $pathExt ) : $this -> suffixes );
2015-08-17 17:00:26 -07:00
}
foreach ( $suffixes as $suffix ) {
foreach ( $dirs as $dir ) {
2017-02-02 16:28:38 -08:00
if ( @ is_file ( $file = $dir . DIRECTORY_SEPARATOR . $name . $suffix ) && ( '\\' === DIRECTORY_SEPARATOR || is_executable ( $file ))) {
2015-08-17 17:00:26 -07:00
return $file ;
}
}
}
return $default ;
}
}