From eb7c9f97959e4c074698eea72b7da20d25f19faa Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sat, 18 Sep 2021 15:54:34 +0200 Subject: Initial support for compiling with msvc/cl.exe on windows. --- src/execute.cc | 47 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) (limited to 'src/execute.cc') diff --git a/src/execute.cc b/src/execute.cc index 610ccdd..df22f61 100644 --- a/src/execute.cc +++ b/src/execute.cc @@ -3,11 +3,16 @@ // See accompanying file LICENSE for details. #include "execute.h" -#include #include +#if !defined(_WIN32) +#include #include #include #include +#else +#include +#include +#endif #include /* @@ -18,6 +23,7 @@ https://stackoverflow.com/questions/4259629/what-is-the-difference-between-fork- */ +#if !defined(_WIN32) namespace { int parent_waitpid(pid_t pid) @@ -32,6 +38,7 @@ int parent_waitpid(pid_t pid) return WEXITSTATUS(status); } } // namespace :: +#endif int execute(const std::string& command, const std::vector& args, @@ -45,9 +52,9 @@ int execute(const std::string& command, } argv.push_back(nullptr); + std::string cmd; if(verbose) { - std::string cmd; for(const auto& arg : argv) { if(arg == nullptr) @@ -64,27 +71,53 @@ int execute(const std::string& command, std::cout << cmd << "\n"; } +#if !defined(_WIN32) + #if 1 auto pid = vfork(); if(pid == 0) { + // 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 } - auto ret = parent_waitpid(pid); + + return 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(), nullptr)) + (char**)argv.data(), envp)) { return 1; } - auto ret = parent_waitpid(pid); + return parent_waitpid(pid); #else - auto ret = system(cmd.data()); + return system(cmd.data()); #endif - return ret; +#else + 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,0,0,&si,&pi)) + { + return 1; // Could not start process; + } + + // 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 } -- cgit v1.2.3