mirror of
https://github.com/symfony/process.git
synced 2026-03-24 07:52:08 +01:00
* 5.4: CS fixes Bump Symfony version to 5.4.11 Update VERSION for 5.4.10 Update CHANGELOG for 5.4.10 Bump Symfony version to 4.4.44 Update VERSION for 4.4.43 Update CONTRIBUTORS for 4.4.43 Update CHANGELOG for 4.4.43
85 lines
2.5 KiB
PHP
85 lines
2.5 KiB
PHP
<?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 = ['.exe', '.bat', '.cmd', '.com'];
|
|
|
|
/**
|
|
* Replaces default suffixes of executable.
|
|
*/
|
|
public function setSuffixes(array $suffixes)
|
|
{
|
|
$this->suffixes = $suffixes;
|
|
}
|
|
|
|
/**
|
|
* Adds new possible suffix to check for executable.
|
|
*/
|
|
public function addSuffix(string $suffix)
|
|
{
|
|
$this->suffixes[] = $suffix;
|
|
}
|
|
|
|
/**
|
|
* Finds an executable by name.
|
|
*
|
|
* @param string $name The executable name (without the extension)
|
|
* @param string|null $default The default to return if no executable is found
|
|
* @param array $extraDirs Additional dirs to check into
|
|
*/
|
|
public function find(string $name, string $default = null, array $extraDirs = []): ?string
|
|
{
|
|
if (\ini_get('open_basedir')) {
|
|
$searchPath = array_merge(explode(\PATH_SEPARATOR, \ini_get('open_basedir')), $extraDirs);
|
|
$dirs = [];
|
|
foreach ($searchPath as $path) {
|
|
// Silencing against https://bugs.php.net/69240
|
|
if (@is_dir($path)) {
|
|
$dirs[] = $path;
|
|
} else {
|
|
if (basename($path) == $name && @is_executable($path)) {
|
|
return $path;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
$dirs = array_merge(
|
|
explode(\PATH_SEPARATOR, getenv('PATH') ?: getenv('Path')),
|
|
$extraDirs
|
|
);
|
|
}
|
|
|
|
$suffixes = [''];
|
|
if ('\\' === \DIRECTORY_SEPARATOR) {
|
|
$pathExt = getenv('PATHEXT');
|
|
$suffixes = array_merge($pathExt ? explode(\PATH_SEPARATOR, $pathExt) : $this->suffixes, $suffixes);
|
|
}
|
|
foreach ($suffixes as $suffix) {
|
|
foreach ($dirs as $dir) {
|
|
if (@is_file($file = $dir.\DIRECTORY_SEPARATOR.$name.$suffix) && ('\\' === \DIRECTORY_SEPARATOR || @is_executable($file))) {
|
|
return $file;
|
|
}
|
|
}
|
|
}
|
|
|
|
return $default;
|
|
}
|
|
}
|