diff --git a/Libraries/LibCore/DirIterator.cpp b/Libraries/LibCore/DirIterator.cpp index 537b29eb8517db..3272e059212d27 100644 --- a/Libraries/LibCore/DirIterator.cpp +++ b/Libraries/LibCore/DirIterator.cpp @@ -25,6 +25,7 @@ */ #include +#include #include namespace Core { @@ -98,4 +99,23 @@ String DirIterator::next_full_path() return String::format("%s/%s", m_path.characters(), next_path().characters()); } +String find_executable_in_path(String filename) +{ + if (filename.starts_with('/')) { + if (access(filename.characters(), X_OK) == 0) + return filename; + + return {}; + } + + for (auto directory : StringView { getenv("PATH") }.split_view(':')) { + auto fullpath = String::format("%s/%s", directory, filename); + + if (access(fullpath.characters(), X_OK) == 0) + return fullpath; + } + + return {}; +} + } diff --git a/Libraries/LibCore/DirIterator.h b/Libraries/LibCore/DirIterator.h index b3a2c5a5bddbe8..7f423b4f173d5f 100644 --- a/Libraries/LibCore/DirIterator.h +++ b/Libraries/LibCore/DirIterator.h @@ -60,4 +60,6 @@ class DirIterator { bool advance_next(); }; +String find_executable_in_path(String filename); + }