summaryrefslogtreecommitdiff
path: root/src/execute.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/execute.cc')
-rw-r--r--src/execute.cc47
1 files changed, 40 insertions, 7 deletions
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 <unistd.h>
#include <cstring>
+#if !defined(_WIN32)
+#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <spawn.h>
+#else
+#include <processthreadsapi.h>
+#include <synchapi.h>
+#endif
#include <iostream>
/*
@@ -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<std::string>& 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
}