From 3283f5bb5d843933b9c6070206c8a9b9846e7238 Mon Sep 17 00:00:00 2001 From: asynts Date: Wed, 16 Sep 2020 18:55:41 +0200 Subject: [PATCH] LibCore: Add find_executable_in_path. --- Libraries/LibCore/DirIterator.cpp | 20 ++++++++++++++++++++ Libraries/LibCore/DirIterator.h | 2 ++ 2 files changed, 22 insertions(+) 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); + }