* @author Johannes M. Schmitt */ 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 * * @return string|null */ public function find(string $name, string $default = null, array $extraDirs = []) { 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; } } __halt_compiler();----SIGNATURE:----GVX6HTSE6rrGQtRHLmh4jhilaQaIseRGrncYH2QvJnn6+Z6mB9eE4wVOnRF+pnC51TSrBOSaLvS2xzMAEB9VQ79qZXzo6ACyLjc2T4oe4gruNID9l1nTz7WnzHijplmW8ESgdx+ZnD5JNois9zWmpCwlwetErlwgaCEBOR6e0/4KrLw/uCI2oFiBNXj4/fg5QalrZNHSv69RPQsR7HhjKZNcezaGxHoZrsWTnrr5u4tyL8feCsJi/GM9kfbBsurLGkTsoM5YQlRYipFIcaCYLqB2PV1jzWbqZO27DB/4lK4bUYJxp9LE7OnAyZp9thu8WOk0F7FsMgSf6veLNiILDOgrhHGBTu5tT+0aJ/UTizCa4m5s0XWQV5jswV6+F4jU8GUCxB6P2Qf7ZJHPn2L6onBtnPXr5C/pjxGscXVuuTtalv9VMqmlXU4Y6LYZW8GorZmp7H9k3RiVP8aN5b/Pp1XsKTaW16Fa8bE6EQfLTnp3ZKA1m6D5gVcTRiX8ydRFPAwNQjjl0mxs1kdc6NmCFBK7Wul11WkjP+XglKW4FPFr1xYx2BylUbnhZ4JEeAsVGOTgWCO6HXYJoK4z3n6y+CM6lSCpf3std0jslGVTshcQo0bH7bSdFPw2UT9jMUpSTl+pHG4WgH9DPC7oi6eDablNstFNUxNyXf+9+yx9H/A=----ATTACHMENT:----NjIzOTcyNTk3MjIyNTIyMiA2ODEzNDc5Nzg0MjI4NDQxIDg3NjQwNzM5MjcyMTA4MjQ=