21int ExecVp(
const char* file,
char*
const argv[])
24 return execvp(file, argv);
26 std::vector<std::wstring> escaped_args;
27 std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
28 for (
char*
const* arg_ptr{argv}; *arg_ptr; ++arg_ptr) {
29 subprocess::util::quote_argument(converter.from_bytes(*arg_ptr), escaped_args.emplace_back(),
false);
32 std::vector<const wchar_t*> new_argv;
33 new_argv.reserve(escaped_args.size() + 1);
34 for (
const auto&
s : escaped_args) new_argv.push_back(
s.c_str());
35 new_argv.push_back(
nullptr);
36 return _wexecvp(converter.from_bytes(file).c_str(), new_argv.data());
48 fs::path path{argv0_path};
53 if (!argv0_path.has_parent_path()) {
54 if (
const char* path_env = std::getenv(
"PATH")) {
55 size_t start{0}, end{0};
56 for (std::string_view paths{path_env}; end != std::string_view::npos; start = end + 1) {
57 end = paths.find(
':', start);
58 fs::path candidate = fs::path(paths.substr(start, end - start)) / argv0_path;
59 if (fs::is_regular_file(candidate, ec)) {
68 if (GetModuleFileNameW(
nullptr, module_path,
MAX_PATH) > 0) {
69 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.