diff --git a/src/backend.c b/src/backend.c index 7463391..bff2917 100644 --- a/src/backend.c +++ b/src/backend.c @@ -4,7 +4,7 @@ #define BACKEND_LIBRARY_PARAM "load" f2b_backend_t * -f2b_backend_create(f2b_config_section_t *config) { +f2b_backend_create(f2b_config_section_t *config, const char *id) { f2b_config_param_t *param = NULL; f2b_backend_t *backend = NULL; int flags = RTLD_NOW | RTLD_LOCAL; @@ -21,39 +21,54 @@ f2b_backend_create(f2b_config_section_t *config) { if ((backend->h = dlopen(param->value, flags)) == NULL) goto cleanup; - if ((*(void **) (&backend->init) = dlsym(backend->h, "init")) == NULL) + if ((*(void **) (&backend->create) = dlsym(backend->h, "create")) == NULL) goto cleanup; - if ((*(void **) (&backend->ready) = dlsym(backend->h, "ready")) == NULL) + if ((*(void **) (&backend->config) = dlsym(backend->h, "config")) == NULL) goto cleanup; - if ((*(void **) (&backend->ban) = dlsym(backend->h, "ban")) == NULL) + if ((*(void **) (&backend->ready) = dlsym(backend->h, "ready")) == NULL) goto cleanup; - if ((*(void **) (&backend->unban) = dlsym(backend->h, "unban")) == NULL) + if ((*(void **) (&backend->start) = dlsym(backend->h, "start")) == NULL) goto cleanup; - if ((*(void **) (&backend->exists) = dlsym(backend->h, "exists")) == NULL) + if ((*(void **) (&backend->stop) = dlsym(backend->h, "stop")) == NULL) + goto cleanup; + if ((*(void **) (&backend->ping) = dlsym(backend->h, "ping")) == NULL) + goto cleanup; + if ((*(void **) (&backend->ban) = dlsym(backend->h, "ban")) == NULL) + goto cleanup; + if ((*(void **) (&backend->unban) = dlsym(backend->h, "unban")) == NULL) + goto cleanup; + if ((*(void **) (&backend->exists) = dlsym(backend->h, "exists")) == NULL) + goto cleanup; + if ((*(void **) (&backend->destroy) = dlsym(backend->h, "destroy")) == NULL) goto cleanup; - if (backend->ready) - return backend; + if ((backend->cfg = backend->create(id)) == NULL) { + f2b_log_msg(log_error, "backend create config failed"); + goto cleanup; + } /* try init */ for (; param != NULL; param = param->next) { if (strcmp(param->name, BACKEND_LIBRARY_PARAM) == 0) continue; - if (!backend->init(param->name, param->value)) { - f2b_log_msg(log_warn, "param pair not accepted by backend '%s': %s=%s", - config->name, param->name, param->value); - } + if (backend->config(backend->cfg, param->name, param->value)) + continue; + f2b_log_msg(log_warn, "param pair not accepted by backend '%s': %s=%s", + config->name, param->name, param->value); } - if (backend->ready) + if (backend->ready(backend->cfg)) return backend; /* still not ready */ f2b_log_msg(log_error, "backend '%s' not fully configured", config->name); cleanup: - if (backend->h) + if (backend->h) { + if (backend->cfg && backend->destroy) + backend->destroy(backend->cfg); dlclose(backend->h); + } free(backend); return NULL; } @@ -61,6 +76,7 @@ f2b_backend_create(f2b_config_section_t *config) { void f2b_backend_destroy(f2b_backend_t *backend) { assert(backend != NULL); + backend->destroy(backend->cfg); dlclose(backend->h); free(backend); } diff --git a/src/backend.h b/src/backend.h index 3edbb11..a767072 100644 --- a/src/backend.h +++ b/src/backend.h @@ -6,14 +6,20 @@ typedef struct f2b_backend_t { void *h; - bool (*init) (const char *key, const char *value); - bool (*ready) (void); - bool (*ban) (const char *ip); - bool (*unban) (const char *ip); - bool (*exists)(const char *ip); + void *cfg; + void *(*create) (const char *id); + bool (*config) (void *cfg, const char *key, const char *value); + bool (*ready) (void *cfg); + bool (*start) (void *cfg); + bool (*stop) (void *cfg); + bool (*ping) (void *cfg); + bool (*ban) (void *cfg, const char *ip); + bool (*unban) (void *cfg, const char *ip); + bool (*exists) (void *cfg, const char *ip); + void (*destroy) (void *cfg); } f2b_backend_t; -f2b_backend_t * f2b_backend_create (f2b_config_section_t *config); +f2b_backend_t * f2b_backend_create (f2b_config_section_t *config, const char *id); void f2b_backend_destroy(f2b_backend_t *backend); #endif /* BACKEND_H_ */