diff --git a/src/backends/backend.h b/src/backends/backend.h index 99f0460..e152087 100644 --- a/src/backends/backend.h +++ b/src/backends/backend.h @@ -1,6 +1,8 @@ #include -#define HOST_TOKEN "" +#define TOKEN_ID "" +#define TOKEN_IP "" +#define ID_MAX 32 typedef struct _config cfg_t; diff --git a/src/backends/exec.c b/src/backends/exec.c index 54e4e1e..95996e3 100644 --- a/src/backends/exec.c +++ b/src/backends/exec.c @@ -7,14 +7,13 @@ #include "backend.h" -#define ID_MAX 32 - typedef struct cmd_t { struct cmd_t *next; char *args; /**< stores path of cmd & args, delimited by '\0' */ char **argv; /**< stores array of pointers to args + NULL */ size_t argc; /**< args count */ - size_t pos; /**< index+1 in argv[] where to insert IP address (zero means "no placeholder") */ + size_t pos_ip; /**< index+1 in argv[] where to insert IP address (zero means "no placeholder") */ + size_t pos_id; /**< index+1 in argv[] where to insert IP address (zero means "no placeholder") */ } cmd_t; struct _config { @@ -53,8 +52,10 @@ cmd_from_str(const char *str) { if ((argv = realloc(cmd->argv, sizeof(cmd->argv) * (cmd->argc + 2))) == NULL) goto cleanup; cmd->argv = argv; - if (strcmp(token, HOST_TOKEN) == 0) - cmd->pos = cmd->argc; + if (strcmp(token, TOKEN_ID) == 0) + cmd->pos_id = cmd->argc; + if (strcmp(token, TOKEN_IP) == 0) + cmd->pos_ip = cmd->argc; cmd->argv[cmd->argc] = token; cmd->argc++; } @@ -97,7 +98,7 @@ cmd_list_destroy(cmd_t *list) { } static bool -cmd_list_exec(cmd_t *list, const char *ip, time_t timeout) { +cmd_list_exec(const cfg_t *cfg, cmd_t *list, const char *ip) { int status = 0; pid_t pid; @@ -105,10 +106,12 @@ cmd_list_exec(cmd_t *list, const char *ip, time_t timeout) { pid = fork(); if (pid == 0) { /* child */ - if (ip && cmd->pos) - cmd->argv[cmd->pos - 1] = strdup(ip); - if (timeout) - alarm(timeout); + if (cmd->pos_ip && ip) + cmd->argv[cmd->pos_ip - 1] = strdup(ip); + if (cmd->pos_id) + cmd->argv[cmd->pos_ip - 1] = strdup(cfg->name); + if (cfg->timeout) + alarm(cfg->timeout); execv(cmd->args, cmd->argv); } else if (pid > 0) { /* parent */ @@ -189,7 +192,7 @@ start(cfg_t *cfg) { if (!cfg->start) return true; - return cmd_list_exec(cfg->start, NULL, cfg->timeout); + return cmd_list_exec(cfg, cfg->start, NULL); } bool @@ -199,21 +202,21 @@ stop(cfg_t *cfg) { if (!cfg->stop) return true; - return cmd_list_exec(cfg->stop, NULL, cfg->timeout); + return cmd_list_exec(cfg, cfg->stop, NULL); } bool ban(cfg_t *cfg, const char *ip) { assert(cfg != NULL && ip != NULL); - return cmd_list_exec(cfg->ban, ip, cfg->timeout); + return cmd_list_exec(cfg, cfg->ban, ip); } bool unban(cfg_t *cfg, const char *ip) { assert(cfg != NULL && ip != NULL); - return cmd_list_exec(cfg->unban, ip, cfg->timeout); + return cmd_list_exec(cfg, cfg->unban, ip); } bool @@ -223,7 +226,7 @@ check(cfg_t *cfg, const char *ip) { if (!cfg->check) return false; - return cmd_list_exec(cfg->check, ip, cfg->timeout); + return cmd_list_exec(cfg, cfg->check, ip); } bool