aboutsummaryrefslogtreecommitdiff
path: root/src/common/spawn.cpp
diff options
context:
space:
mode:
authorxiphon <xiphon@protonmail.com>2018-10-01 06:39:37 +0000
committerxiphon <xiphon@protonmail.com>2018-10-02 01:53:27 +0300
commitd5541e44feaa2be10c6a4ffb2746d59bb01a2b26 (patch)
tree3051a9d03be0e5fbfa0dd970f312f7e07636d272 /src/common/spawn.cpp
parentMerge pull request #4333 (diff)
downloadmonero-d5541e44feaa2be10c6a4ffb2746d59bb01a2b26.tar.xz
common: Windows 'spawn' support for tx and block notifications
Diffstat (limited to '')
-rw-r--r--src/common/spawn.cpp (renamed from src/common/exec.cpp)57
1 files changed, 55 insertions, 2 deletions
diff --git a/src/common/exec.cpp b/src/common/spawn.cpp
index 41b8f1378..59f11675c 100644
--- a/src/common/exec.cpp
+++ b/src/common/spawn.cpp
@@ -29,16 +29,68 @@
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
+#ifdef _WIN32
+#include <boost/algorithm/string/join.hpp>
+#include <boost/scope_exit.hpp>
+#include <windows.h>
+#else
#include <sys/wait.h>
+#endif
#include "misc_log_ex.h"
-#include "exec.h"
+#include "spawn.h"
namespace tools
{
-int exec(const char *filename, char * const argv[], bool wait)
+int spawn(const char *filename, const std::vector<std::string>& args, bool wait)
{
+#ifdef _WIN32
+ std::string joined = boost::algorithm::join(args, " ");
+ char *commandLine = !joined.empty() ? &joined[0] : nullptr;
+ STARTUPINFOA si = {};
+ si.cb = sizeof(si);
+ PROCESS_INFORMATION pi;
+ if (!CreateProcessA(filename, commandLine, nullptr, nullptr, false, 0, nullptr, nullptr, &si, &pi))
+ {
+ MERROR("CreateProcess failed. Error code " << GetLastError());
+ return -1;
+ }
+
+ BOOST_SCOPE_EXIT(&pi)
+ {
+ CloseHandle(pi.hThread);
+ CloseHandle(pi.hProcess);
+ }
+ BOOST_SCOPE_EXIT_END
+
+ if (!wait)
+ {
+ return 0;
+ }
+
+ DWORD result = WaitForSingleObject(pi.hProcess, INFINITE);
+ if (result != WAIT_OBJECT_0)
+ {
+ MERROR("WaitForSingleObject failed. Result " << result << ", error code " << GetLastError());
+ return -1;
+ }
+
+ DWORD exitCode;
+ if (!GetExitCodeProcess(pi.hProcess, &exitCode))
+ {
+ MERROR("GetExitCodeProcess failed. Error code " << GetLastError());
+ return -1;
+ }
+
+ MINFO("Child exited with " << exitCode);
+ return static_cast<int>(exitCode);
+#else
+ char **argv = (char**)alloca(sizeof(char*) * (args.size() + 1));
+ for (size_t n = 0; n < args.size(); ++n)
+ argv[n] = (char*)args[n].c_str();
+ argv[args.size()] = NULL;
+
pid_t pid = fork();
if (pid < 0)
{
@@ -83,6 +135,7 @@ int exec(const char *filename, char * const argv[], bool wait)
}
MERROR("Secret passage found");
return -1;
+#endif
}
}