<?php 
 
/* 
 * This file is part of the Symfony package. 
 * 
 * (c) Fabien Potencier <[email protected]> 
 * 
 * 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 <[email protected]> 
 * @author Johannes M. Schmitt <[email protected]> 
 */ 
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) { 
                // 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 = array(''); 
        if ('\\' === DIRECTORY_SEPARATOR) { 
            $pathExt = getenv('PATHEXT'); 
            $suffixes = array_merge($suffixes, $pathExt ? explode(PATH_SEPARATOR, $pathExt) : $this->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; 
    } 
} 
 
 |