12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- #include <unistd.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <string>
- #include <vector>
- #include <cerrno>
- #include "logger.h"
- #include "common.h"
- extern "C" {
- int run_script(std::string arg0, std::vector<std::string> env)
- {
-
- char const* envp[env.size() + 1];
- for (int i = 0; i < env.size(); ++i) {
- envp[i] = env[i].c_str();
- }
- envp[env.size()] = (char const*) NULL;
-
- int ret, wstatus, exitcode;
- pid_t pid;
- pid = fork();
- if (pid == -1) {
- LOG_ERROR(runscript_logger, RUNSCRIPT_FORK_FAILED).arg(strerror(errno));
- return -1;
- }
- if (pid == 0) {
-
- ret = execle(script_path.c_str(), script_name.c_str(), arg0.c_str(), (char *)NULL, envp);
- LOG_ERROR(runscript_logger, RUNSCRIPT_EXEC_FAILED).arg(strerror(errno));
-
- exit(EXIT_FAILURE);
- } else {
- if (script_wait) {
-
- LOG_DEBUG(runscript_logger, 50, RUNSCRIPT_WAITING_SCRIPT);
- ret = wait(&wstatus);
- if (ret == -1) {
- LOG_ERROR(runscript_logger, RUNSCRIPT_WAITPID_FAILED).arg(strerror(errno));
- return -1;
- }
-
- if (WIFEXITED(wstatus))
- exitcode = WEXITSTATUS(wstatus);
- else
-
- exitcode = 0;
- return exitcode;
- } else {
- return 0;
- }
- }
- }
- }
|