diff options
author | Bent Bisballe Nyeng <deva@aasimon.org> | 2023-01-20 08:37:29 +0100 |
---|---|---|
committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2023-01-20 09:02:45 +0100 |
commit | a5585150f0ff8d27ddd22792f521f1374a3eedd8 (patch) | |
tree | 3bb442e835502d452ebe5137ad7fca5f5156bb5f /src/util.cc | |
parent | 3cbadb8f5c55020ece96fab0fc8f4f51da01888e (diff) |
Add env to execute function.
Diffstat (limited to 'src/util.cc')
-rw-r--r-- | src/util.cc | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/util.cc b/src/util.cc index fe16471..db5a5f6 100644 --- a/src/util.cc +++ b/src/util.cc @@ -167,3 +167,82 @@ std::string esc(const std::string& in) } return out; } + +std::vector<std::string> get_paths() +{ + std::vector<std::string> paths; + + std::string path_env = std::getenv("PATH"); + +#ifdef _WIN32 + const char sep{';'}; +#else + const char sep{':'}; +#endif + + std::stringstream ss(path_env); + std::string path; + while (std::getline(ss, path, sep)) + { + paths.push_back(path); + } + + return paths; +} + +bool check_executable(const std::filesystem::path& prog) +{ + auto perms = std::filesystem::status(prog).permissions(); + + if((perms & std::filesystem::perms::owner_exec) != std::filesystem::perms::none) + { + return true; + } + + if((perms & std::filesystem::perms::group_exec) != std::filesystem::perms::none) + { + return true; + } + + if((perms & std::filesystem::perms::others_exec) != std::filesystem::perms::none) + { + return true; + } + + return false; +} + +std::string locate(const std::string& prog, + const std::vector<std::string>& paths, + const std::string& arch) +{ + std::string program = prog; + if(!arch.empty()) + { + program = arch + "-" + prog; + } + + // first check if arch contains an absolute path to prog + if(std::filesystem::exists(program)) + { + if(check_executable(program)) + { + return program; + } + } + + for(const auto& path_str : paths) + { + std::filesystem::path path(path_str); + auto prog_path = path / program; + if(std::filesystem::exists(prog_path)) + { + if(check_executable(prog_path)) + { + return prog_path.string(); + } + } + } + + return {}; +} |