104fd306cSNickeau<?php 204fd306cSNickeau 304fd306cSNickeau/* 404fd306cSNickeau * This file is part of the Symfony package. 504fd306cSNickeau * 604fd306cSNickeau * (c) Fabien Potencier <fabien@symfony.com> 704fd306cSNickeau * 804fd306cSNickeau * For the full copyright and license information, please view the LICENSE 904fd306cSNickeau * file that was distributed with this source code. 1004fd306cSNickeau */ 1104fd306cSNickeau 1204fd306cSNickeaunamespace Symfony\Component\Process; 1304fd306cSNickeau 1404fd306cSNickeau/** 1504fd306cSNickeau * Generic executable finder. 1604fd306cSNickeau * 1704fd306cSNickeau * @author Fabien Potencier <fabien@symfony.com> 1804fd306cSNickeau * @author Johannes M. Schmitt <schmittjoh@gmail.com> 1904fd306cSNickeau */ 2004fd306cSNickeauclass ExecutableFinder 2104fd306cSNickeau{ 2204fd306cSNickeau private $suffixes = ['.exe', '.bat', '.cmd', '.com']; 2304fd306cSNickeau 2404fd306cSNickeau /** 2504fd306cSNickeau * Replaces default suffixes of executable. 2604fd306cSNickeau */ 2704fd306cSNickeau public function setSuffixes(array $suffixes) 2804fd306cSNickeau { 2904fd306cSNickeau $this->suffixes = $suffixes; 3004fd306cSNickeau } 3104fd306cSNickeau 3204fd306cSNickeau /** 3304fd306cSNickeau * Adds new possible suffix to check for executable. 3404fd306cSNickeau */ 3504fd306cSNickeau public function addSuffix(string $suffix) 3604fd306cSNickeau { 3704fd306cSNickeau $this->suffixes[] = $suffix; 3804fd306cSNickeau } 3904fd306cSNickeau 4004fd306cSNickeau /** 4104fd306cSNickeau * Finds an executable by name. 4204fd306cSNickeau * 4304fd306cSNickeau * @param string $name The executable name (without the extension) 4404fd306cSNickeau * @param string|null $default The default to return if no executable is found 4504fd306cSNickeau * @param array $extraDirs Additional dirs to check into 4604fd306cSNickeau * 4704fd306cSNickeau * @return string|null 4804fd306cSNickeau */ 49*83c68632SNico public function find(string $name, ?string $default = null, array $extraDirs = []) 5004fd306cSNickeau { 51*83c68632SNico if (\ini_get('open_basedir')) { 52*83c68632SNico $searchPath = array_merge(explode(\PATH_SEPARATOR, \ini_get('open_basedir')), $extraDirs); 5304fd306cSNickeau $dirs = []; 5404fd306cSNickeau foreach ($searchPath as $path) { 5504fd306cSNickeau // Silencing against https://bugs.php.net/69240 5604fd306cSNickeau if (@is_dir($path)) { 5704fd306cSNickeau $dirs[] = $path; 5804fd306cSNickeau } else { 5904fd306cSNickeau if (basename($path) == $name && @is_executable($path)) { 6004fd306cSNickeau return $path; 6104fd306cSNickeau } 6204fd306cSNickeau } 6304fd306cSNickeau } 6404fd306cSNickeau } else { 6504fd306cSNickeau $dirs = array_merge( 6604fd306cSNickeau explode(\PATH_SEPARATOR, getenv('PATH') ?: getenv('Path')), 6704fd306cSNickeau $extraDirs 6804fd306cSNickeau ); 6904fd306cSNickeau } 7004fd306cSNickeau 7104fd306cSNickeau $suffixes = ['']; 7204fd306cSNickeau if ('\\' === \DIRECTORY_SEPARATOR) { 7304fd306cSNickeau $pathExt = getenv('PATHEXT'); 7404fd306cSNickeau $suffixes = array_merge($pathExt ? explode(\PATH_SEPARATOR, $pathExt) : $this->suffixes, $suffixes); 7504fd306cSNickeau } 7604fd306cSNickeau foreach ($suffixes as $suffix) { 7704fd306cSNickeau foreach ($dirs as $dir) { 7804fd306cSNickeau if (@is_file($file = $dir.\DIRECTORY_SEPARATOR.$name.$suffix) && ('\\' === \DIRECTORY_SEPARATOR || @is_executable($file))) { 7904fd306cSNickeau return $file; 8004fd306cSNickeau } 8104fd306cSNickeau } 8204fd306cSNickeau } 8304fd306cSNickeau 8404fd306cSNickeau return $default; 8504fd306cSNickeau } 8604fd306cSNickeau} 87