Alex 'AdUser' Z
9 years ago
4 changed files with 166 additions and 0 deletions
@ -0,0 +1,3 @@
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON) |
||||
|
||||
add_library("f2b_b_exec" SHARED "exec.c") |
@ -0,0 +1,16 @@
|
||||
#include <stdbool.h> |
||||
|
||||
#define HOST_TOKEN "<HOST>" |
||||
|
||||
typedef struct _config cfg_t; |
||||
|
||||
extern cfg_t *create(const char *id); |
||||
extern bool config(cfg_t *c, const char *key, const char *value); |
||||
extern bool ready(cfg_t *c); |
||||
extern bool start(cfg_t *c); |
||||
extern bool stop(cfg_t *c); |
||||
extern bool ping(cfg_t *c); |
||||
extern bool ban(cfg_t *c, const char *ip); |
||||
extern bool unban(cfg_t *c, const char *ip); |
||||
extern bool exists(cfg_t *c, const char *ip); |
||||
extern void destroy(cfg_t *c); |
@ -0,0 +1,145 @@
|
||||
#include <assert.h> |
||||
#include <string.h> |
||||
#include <stdlib.h> |
||||
#include <unistd.h> |
||||
|
||||
#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 in argv[] where to insert IP address */ |
||||
} cmd_t; |
||||
|
||||
struct _config { |
||||
char name[ID_MAX + 1]; |
||||
cmd_t *start; |
||||
cmd_t *stop; |
||||
cmd_t *ban; |
||||
cmd_t *unban; |
||||
cmd_t *exists; |
||||
}; |
||||
|
||||
static cmd_t * |
||||
cmd_from_str(const char *str) { |
||||
cmd_t *cmd = NULL; |
||||
const char *delim = " \t"; |
||||
char *token, *saveptr, *argv; |
||||
|
||||
if ((cmd = calloc(1, sizeof(cmd_t))) == NULL) |
||||
return NULL; |
||||
|
||||
if ((cmd->args = strdup(str)) == NULL) |
||||
goto cleanup; |
||||
|
||||
strtok_r(cmd->args, delim, &saveptr); |
||||
while ((token = strtok_r(NULL, delim, &saveptr)) != NULL) { |
||||
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; |
||||
cmd->argv[cmd->argc] = token; |
||||
cmd->argc++; |
||||
} |
||||
cmd->argv[cmd->argc + 1] = NULL; |
||||
|
||||
return cmd; |
||||
|
||||
cleanup: |
||||
free(cmd->args); |
||||
free(cmd->argv); |
||||
free(cmd); |
||||
return NULL; |
||||
} |
||||
|
||||
static cmd_t * |
||||
cmd_list_append(cmd_t *list, cmd_t *cmd) { |
||||
cmd_t *c = NULL; |
||||
|
||||
assert(cmd != NULL); |
||||
|
||||
if (!list) |
||||
return cmd; |
||||
|
||||
for (c = list; c->next != NULL; c = c->next); |
||||
|
||||
c->next = cmd; |
||||
return list; |
||||
} |
||||
|
||||
static void |
||||
cmd_list_destroy(cmd_t *list) { |
||||
cmd_t *next = NULL; |
||||
|
||||
for (; list != NULL; list = next) { |
||||
next = list->next; |
||||
free(list->args); |
||||
free(list->argv); |
||||
free(list); |
||||
} |
||||
} |
||||
|
||||
/* handlers */ |
||||
cfg_t * |
||||
create(const char *id) { |
||||
cfg_t *cfg = NULL; |
||||
|
||||
assert(id != NULL); |
||||
|
||||
if ((cfg = calloc(1, sizeof(cfg_t))) == NULL) |
||||
return NULL; |
||||
strncpy(cfg->name, id, sizeof(cfg->name)); |
||||
cfg->name[ID_MAX] = '\0'; |
||||
|
||||
return cfg; |
||||
} |
||||
|
||||
#define CREATE_CMD(TYPE) \ |
||||
if (strcmp(key, #TYPE) == 0) { \
|
||||
cmd = cmd_from_str(value); \
|
||||
if (cmd) { \
|
||||
cfg->TYPE = cmd_list_append(cfg->TYPE, cmd); \
|
||||
return true; \
|
||||
} \
|
||||
return false; \
|
||||
} |
||||
|
||||
bool |
||||
config(cfg_t *cfg, const char *key, const char *value) { |
||||
cmd_t *cmd = NULL; |
||||
|
||||
assert(cfg != NULL); |
||||
assert(key != NULL); |
||||
assert(value != NULL); |
||||
|
||||
CREATE_CMD(start) |
||||
CREATE_CMD(stop) |
||||
CREATE_CMD(ban) |
||||
CREATE_CMD(unban) |
||||
CREATE_CMD(exists) |
||||
|
||||
return false; |
||||
} |
||||
|
||||
bool |
||||
ping(cfg_t *cfg) { |
||||
return cfg != NULL; |
||||
} |
||||
|
||||
void |
||||
destroy(cfg_t *cfg) { |
||||
assert(cfg != NULL); |
||||
|
||||
/* free commands */ |
||||
cmd_list_destroy(cfg->start); |
||||
cmd_list_destroy(cfg->stop); |
||||
cmd_list_destroy(cfg->ban); |
||||
cmd_list_destroy(cfg->unban); |
||||
cmd_list_destroy(cfg->exists); |
||||
free(cfg); |
||||
} |
Loading…
Reference in new issue