diff options
Diffstat (limited to 'src/execute.cc')
-rw-r--r-- | src/execute.cc | 139 |
1 files changed, 19 insertions, 120 deletions
diff --git a/src/execute.cc b/src/execute.cc index 85c1da1..610ccdd 100644 --- a/src/execute.cc +++ b/src/execute.cc @@ -3,17 +3,11 @@ // See accompanying file LICENSE for details. #include "execute.h" -#include <cstring> -#if !defined(_WIN32) #include <unistd.h> +#include <cstring> #include <sys/types.h> #include <sys/wait.h> #include <spawn.h> -#else -#include <processthreadsapi.h> -#include <synchapi.h> -#include <processenv.h> -#endif #include <iostream> /* @@ -24,7 +18,6 @@ https://stackoverflow.com/questions/4259629/what-is-the-difference-between-fork- */ -#if !defined(_WIN32) namespace { int parent_waitpid(pid_t pid) @@ -39,12 +32,10 @@ int parent_waitpid(pid_t pid) return WEXITSTATUS(status); } } // namespace :: -#endif int execute(const std::string& command, const std::vector<std::string>& args, - const std::map<std::string, std::string>& env, - bool verbose, bool terminate) + bool verbose) { std::vector<const char*> argv; argv.push_back(command.data()); @@ -54,138 +45,46 @@ int execute(const std::string& command, } argv.push_back(nullptr); - std::string cmd; - for(const auto& arg : argv) + if(verbose) { - if(arg == nullptr) - { - break; - } - if(!cmd.empty()) + std::string cmd; + for(const auto& arg : argv) { - cmd += " "; + if(arg == nullptr) + { + break; + } + if(!cmd.empty()) + { + cmd += " "; + } + cmd += arg; } - cmd += arg; - } - if(verbose) - { std::cout << cmd << "\n"; } -#if !defined(_WIN32) - #if 1 auto pid = vfork(); if(pid == 0) { - for(const auto& [key, value] : env) - { - setenv(key, value); - } - // TODO: use execvpe to set LD_LIBRARY_PATH execv(command.data(), (char**)argv.data()); std::cout << "Could not execute " << command << ": " << strerror(errno) << "\n"; _exit(1); // execv only returns if an error occurred } - - return parent_waitpid(pid); + auto ret = parent_waitpid(pid); #elif 0 pid_t pid; - const char * envp[] = {nullptr}; // TODO: use this to set LD_LIBRARY_PATH if(posix_spawn(&pid, command.data(), nullptr, nullptr, - (char**)argv.data(), envp)) + (char**)argv.data(), nullptr)) { return 1; } - return parent_waitpid(pid); + auto ret = parent_waitpid(pid); #else - return system(cmd.data()); + auto ret = system(cmd.data()); #endif -#else - std::map<std::string, std::string> new_env; - auto env_strings = GetEnvironmentStrings(); - const char* ptr = env_strings; - std::string key; - std::string value; - bool key_state{true}; - while(true) - { - if(key_state) // searching for key - { - if(*ptr == '\0') - { - break; - } - - if(*ptr != '=') - { - key += *ptr; - } - else - { - key_state = false; - } - } - else - { - if(*ptr != '\0') - { - value += *ptr; - } - else - { - new_env.insert({key, value}); - key = {}; - value = {}; - key_state = true; - } - } - ++ptr; - } - FreeEnvironmentStrings(env_strings); - - // add new env vars (if any) - for(const auto& [key, value] : env) - { - //if(key == "CL" || key == "LINK" || key == "LIB") - { - new_env[key] = value; - } - } - - std::string env_str; - for(const auto& [k,v] : new_env) - { - env_str += k + "=" + v; - env_str += '\0'; - } - env_str += '\0'; - STARTUPINFO si; - PROCESS_INFORMATION pi; - ZeroMemory(&si,sizeof(si)); - si.cb=sizeof(si); - ZeroMemory(&pi,sizeof(pi)); - // TODO: Use SetDllDirectory(...) to set DLL search directory - if(!CreateProcess(nullptr, //"C:/WINDOWS/notepad.exe", - //"notepad.exe c:/readme.txt",0,0,0,0,0,0,&si,&pi)) - (char*)cmd.data(),0,0,0,0,env_str.data(),0,&si,&pi)) - { - return 1; // Could not start process; - } - - if(terminate) - { - ExitProcess(0); - } - // Now 'pi.hProcess' contains the process HANDLE, which you can use to - // wait for it like this: - const DWORD infinite = 0xFFFFFFFF; - WaitForSingleObject(pi.hProcess, infinite); - DWORD exitCode{0}; - GetExitCodeProcess(pi.hProcess, &exitCode); - return exitCode; -#endif + return ret; } |