xref: /plugin/combo/vendor/symfony/process/ExecutableFinder.php (revision 83c6863253ba0b92605aa8dceca974358d439aaa)
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