From: Joel Rosdahl Date: Thu, 16 Apr 2020 19:25:19 +0000 (+0200) Subject: Make win32getshell() return std::string X-Git-Tag: v4.0~547^2~7 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5fb6508b4a2dc0275ee0a7c7b771f56e2ca4d80d;p=thirdparty%2Fccache.git Make win32getshell() return std::string --- diff --git a/src/execute.cpp b/src/execute.cpp index bbd3a6e09..91077c4ac 100644 --- a/src/execute.cpp +++ b/src/execute.cpp @@ -102,7 +102,7 @@ win32argvtos(const char* prefix, const char* const* argv, int* length) return str; } -char* +std::string win32getshell(const char* path) { char* path_env; @@ -125,7 +125,9 @@ win32getshell(const char* path) } } - return sh; + std::string result = sh ? sh : ""; + free(sh); + return result; } void @@ -156,9 +158,9 @@ win32execute(const char* path, STARTUPINFO si; memset(&si, 0x00, sizeof(si)); - char* sh = win32getshell(path); - if (sh) { - path = sh; + std::string sh = win32getshell(path); + if (!sh.empty()) { + path = sh.c_str(); } si.cb = sizeof(STARTUPINFO); @@ -184,7 +186,8 @@ win32execute(const char* path, } int length; - char* args = win32argvtos(sh, argv, &length); + const char* prefix = sh.empty() ? nullptr : sh.c_str(); + char* args = win32argvtos(prefix, argv, &length); const char* ext = strrchr(path, '.'); char full_path_win_ext[MAX_PATH] = {0}; add_exe_ext_if_no_to_fullpath(full_path_win_ext, MAX_PATH, ext, path); diff --git a/src/execute.hpp b/src/execute.hpp index 803128f0e..b06cd2522 100644 --- a/src/execute.hpp +++ b/src/execute.hpp @@ -20,6 +20,8 @@ #include "system.hpp" +#include + struct Context; int execute(const char* const* argv, int fd_out, int fd_err, pid_t* pid); @@ -31,3 +33,17 @@ char* find_executable_in_path(const char* name, void print_command(FILE* fp, const char* const* argv); char* format_command(const char* const* argv); + +#ifdef _WIN32 +char* win32argvtos(const char* prefix, const char* const* argv, int* length); +std::string win32getshell(const char* path); +int win32execute(const char* path, + const char* const* argv, + int doreturn, + int fd_stdout, + int fd_stderr); +void add_exe_ext_if_no_to_fullpath(char* full_path_win_ext, + size_t max_size, + const char* ext, + const char* path); +#endif diff --git a/src/hashutil.cpp b/src/hashutil.cpp index ee0db22bb..86560ddc4 100644 --- a/src/hashutil.cpp +++ b/src/hashutil.cpp @@ -330,13 +330,15 @@ hash_command_output(struct hash* hash, STARTUPINFO si; memset(&si, 0x00, sizeof(si)); - char* path = + char* exe_path = find_executable_in_path(args[0].c_str(), nullptr, getenv("PATH")); - if (!path) { - path = x_strdup(args[0].c_str()); + std::string path = exe_path ? exe_path : ""; + free(exe_path); + if (path.empty()) { + path = args[0]; } - char* sh = win32getshell(path); - if (sh) { + std::string sh = win32getshell(path.c_str()); + if (!sh.empty()) { path = sh; } @@ -354,13 +356,13 @@ hash_command_output(struct hash* hash, char* win32args; if (!cmd) { int length; - win32args = win32argvtos(sh, argv.data(), &length); + const char* prefix = sh.empty() ? nullptr : sh.c_str(); + win32args = win32argvtos(prefix, argv.data(), &length); } else { win32args = (char*)command; // quoted } - BOOL ret = - CreateProcess(path, win32args, NULL, NULL, 1, 0, NULL, NULL, &si, &pi); - free(path); + BOOL ret = CreateProcess( + path.c_str(), win32args, NULL, NULL, 1, 0, NULL, NULL, &si, &pi); CloseHandle(pipe_out[1]); free(win32args); if (!cmd) { diff --git a/src/system.hpp b/src/system.hpp index a4106e26d..0b71cb097 100644 --- a/src/system.hpp +++ b/src/system.hpp @@ -111,17 +111,3 @@ extern char** environ; #ifndef O_BINARY # define O_BINARY 0 #endif - -#ifdef _WIN32 -char* win32argvtos(const char* prefix, const char* const* argv, int* length); -char* win32getshell(const char* path); -int win32execute(const char* path, - const char* const* argv, - int doreturn, - int fd_stdout, - int fd_stderr); -void add_exe_ext_if_no_to_fullpath(char* full_path_win_ext, - size_t max_size, - const char* ext, - const char* path); -#endif