14#include <system_error>
24int ExecVp(
const char* file,
char*
const argv[])
27 return execvp(file, argv);
29 std::vector<std::string> escaped_args;
30 for (
char*
const* arg_ptr{argv}; *arg_ptr; ++arg_ptr) {
31 subprocess::util::quote_argument(std::string{*arg_ptr}, escaped_args.emplace_back(),
false);
34 std::vector<const char*> new_argv;
35 new_argv.reserve(escaped_args.size() + 1);
36 for (
const auto&
s : escaped_args) new_argv.push_back(
s.c_str());
37 new_argv.push_back(
nullptr);
38 return _execvp(file, new_argv.data());
50 fs::path path{argv0_path};
55 if (!argv0_path.has_parent_path()) {
56 if (
const char* path_env = std::getenv(
"PATH")) {
57 size_t start{0}, end{0};
58 for (std::string_view paths{path_env}; end != std::string_view::npos; start = end + 1) {
59 end = paths.find(
':', start);
60 fs::path candidate = fs::path(paths.substr(start, end - start)) / argv0_path;
61 if (fs::is_regular_file(candidate, ec)) {
70 if (GetModuleFileNameW(
nullptr, module_path,
MAX_PATH) > 0) {
71 path = fs::path{module_path};
static path PathFromString(const std::string &string)
Convert byte string to path object.
int ExecVp(const char *file, char *const argv[])
Cross-platform wrapper for POSIX execvp function.
fs::path GetExePath(std::string_view argv0)
Return path to current executable assuming it was invoked with argv0.