diff options
author | Bent Bisballe Nyeng <deva@aasimon.org> | 2021-06-13 19:00:13 +0200 |
---|---|---|
committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2021-06-13 19:00:13 +0200 |
commit | 4f923fbdace27f27421bf18dfc9655b73bd68929 (patch) | |
tree | 7bfe332416020e9e70d807b7ca9b7b3c59bb8f1e /execute.cc | |
parent | 19195e2bbdcd7a0db8f84732ce54b1c9d07c006c (diff) |
Move execution code into its own function and use from all tasks.
Diffstat (limited to 'execute.cc')
-rw-r--r-- | execute.cc | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/execute.cc b/execute.cc new file mode 100644 index 0000000..cb96bc5 --- /dev/null +++ b/execute.cc @@ -0,0 +1,76 @@ +#include "execute.h" + +#include <unistd.h> +#include <cstring> +#include <sys/types.h> +#include <sys/wait.h> +#include <spawn.h> +#include <iostream> + +namespace +{ +int parent_waitpid(pid_t pid) +{ + int status; + + if(waitpid(pid, &status, 0) != pid) + { + return 1; + } + + return status; +} +} // namespace :: + +int execute(const std::string& command, + const std::vector<std::string>& args, + bool verbose) +{ + std::vector<const char*> argv; + argv.push_back(command.data()); + for(const auto& arg : args) + { + argv.push_back(arg.data()); + } + argv.push_back(nullptr); + + if(verbose) + { + std::string cmd; + for(const auto& arg : argv) + { + if(arg == nullptr) + { + break; + } + if(!cmd.empty()) + { + cmd += " "; + } + cmd += arg; + } + + std::cout << cmd << "\n"; + } + +#if 1 + auto pid = vfork(); + if(pid == 0) + { + execv(command.data(), (char**)argv.data()); + } + auto ret = parent_waitpid(pid); +#elif 0 + pid_t pid; + if(posix_spawn(&pid, command.data(), nullptr, nullptr, + (char**)argv.data(), nullptr)) + { + return 1; + } + auto ret = parent_waitpid(pid); +#else + auto ret = system(cmd.data()); +#endif + + return ret; +} |