diff options
Diffstat (limited to 'server.c')
-rw-r--r-- | server.c | 79 |
1 files changed, 79 insertions, 0 deletions
@@ -3,6 +3,9 @@ #include <arpa/inet.h> #include <unistd.h> #include <inttypes.h> +#include <sys/types.h> +#include <sys/wait.h> +#include <unistd.h> #include "main.h" #include "uring.h" @@ -221,6 +224,82 @@ out: return false; } +static bool +exec_cmd(struct cfg *cfg, struct server *scfg, const char *cmd) +{ + pid_t pid, wpid; + int wstatus; + + if (!cfg || !scfg || !cmd) + return false; + + pid = fork(); + if (pid < 0) { + perror("fork"); + return false; + + } else if (pid > 0) { + do { + wpid = waitpid(pid, &wstatus, 0); + if (wpid < 0) { + perror("waitpid"); + return false; + } + } while (!WIFEXITED(wstatus)); + + fprintf(stderr, "Child %s exited: %i\n", scfg->start_exec, WEXITSTATUS(wstatus)); + if (WEXITSTATUS(wstatus) == 0) + return true; + else + return false; + + } else { + execl(scfg->start_exec, scfg->start_exec, NULL); + perror("execl"); + exit(EXIT_FAILURE); + } +} + +bool +server_start(struct cfg *cfg, struct server *scfg) +{ + if (!cfg || !scfg) + return false; + + switch (scfg->start_method) { + + case SERVER_START_METHOD_EXEC: + + return exec_cmd(cfg, scfg, scfg->start_exec); + + case SERVER_START_METHOD_UNDEFINED: + default: + break; + } + + return false; +} + +bool +server_stop(struct cfg *cfg, struct server *scfg) +{ + if (!cfg || !scfg) + return false; + + switch (scfg->stop_method) { + + case SERVER_STOP_METHOD_EXEC: + + return exec_cmd(cfg, scfg, scfg->stop_exec); + + case SERVER_STOP_METHOD_UNDEFINED: + default: + break; + } + + return false; +} + bool server_commit(struct cfg *cfg, struct server *scfg) { |