From 53f200ae42779e7b824737a38309e4dd2ff370ae Mon Sep 17 00:00:00 2001 From: Alex 'AdUser' Z Date: Wed, 2 Mar 2016 23:54:56 +1000 Subject: [PATCH] * backends/exec.c: + add cmd_list_exec() + add rest handlers * small fix --- src/backends/exec.c | 76 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/src/backends/exec.c b/src/backends/exec.c index 0692620..a9a6c93 100644 --- a/src/backends/exec.c +++ b/src/backends/exec.c @@ -1,6 +1,8 @@ #include #include #include +#include +#include #include #include "backend.h" @@ -42,7 +44,7 @@ cmd_from_str(const char *str) { goto cleanup; *cmd->argv = argv; if (strcmp(token, HOST_TOKEN) == 0) - cmd->pos = cmd->argc; + cmd->pos = cmd->argc + 1; cmd->argv[cmd->argc] = token; cmd->argc++; } @@ -84,6 +86,33 @@ cmd_list_destroy(cmd_t *list) { } } +static bool +cmd_list_exec(cmd_t *list, const char *ip) { + int status = 0; + pid_t pid; + + for (cmd_t *cmd = list; cmd != NULL; cmd = cmd->next) { + pid = fork(); + if (pid == 0) { + /* child */ + if (ip && cmd->pos) + cmd->argv[cmd->pos - 1] = ip; + execv(cmd->args, cmd->argv); + } else if (pid > 0) { + /* parent */ + waitpid(pid, &status, 0); + if (WIFEXITED(status) && WEXITSTATUS(status) == 0) + continue; + return false; + } else { + /* parent, fork error */ + return false; + } + } + + return true; +} + /* handlers */ cfg_t * create(const char *id) { @@ -136,6 +165,51 @@ ready(cfg_t *cfg) { return false; } +bool +start(cfg_t *cfg) { + assert(cfg != NULL); + + if (!cfg->start) + return true; + + return cmd_list_exec(cfg->start, NULL); +} + +bool +stop(cfg_t *cfg) { + assert(cfg != NULL); + + if (!cfg->stop) + return true; + + return cmd_list_exec(cfg->stop, NULL); +} + +bool +ban(cfg_t *cfg, const char *ip) { + assert(cfg != NULL && ip != NULL); + + return cmd_list_exec(cfg->ban, ip); +} + +bool +unban(cfg_t *cfg, const char *ip) { + assert(cfg != NULL && ip != NULL); + + return cmd_list_exec(cfg->unban, ip); +} + +bool +exists(cfg_t *cfg, const char *ip) { + assert(cfg != NULL && ip != NULL); + + if (!cfg->exists) + return true; + + return cmd_list_exec(cfg->exists, ip); +} + + bool ping(cfg_t *cfg) { return cfg != NULL;