diff --git a/sources/logger.c b/sources/logger.c index f5878175..3c33fe04 100644 --- a/sources/logger.c +++ b/sources/logger.c @@ -52,7 +52,7 @@ od_retcode_t od_logger_init(od_logger_t *logger, od_pid_t *pid) static inline void od_logger(void *arg); -#define OD_LOGGER_TASK_CHANNEL_LIMIT 1 << 5 +#define OD_LOGGER_TASK_CHANNEL_LIMIT 1 << 8 od_retcode_t od_logger_load(od_logger_t *logger) { diff --git a/sources/module.c b/sources/module.c index eda00934..4e263ac3 100644 --- a/sources/module.c +++ b/sources/module.c @@ -46,6 +46,9 @@ int od_target_module_add(od_logger_t *logger, od_module_t *modules, handle = od_dlopen(target_module_path); if (!handle) { + od_log(logger, "load_module", NULL, NULL, + "errors while openning %s module: %s", + target_module_path, dlerror()); goto error; } module_ptr = od_load_module(handle); @@ -63,7 +66,7 @@ int od_target_module_add(od_logger_t *logger, od_module_t *modules, strcat(module_ptr->path, target_module_path); if (module_ptr->module_init_cb) { - return module_ptr->module_init_cb(); + return module_ptr->module_init_cb(logger); } return OD_MODULE_CB_OK_RETCODE; diff --git a/sources/module.h b/sources/module.h index 431c2371..c99a58a9 100644 --- a/sources/module.h +++ b/sources/module.h @@ -14,7 +14,7 @@ #define OD_MODULE_CB_FAIL_RETCODE -1 /* init */ -typedef int (*module_init_cb_t)(); +typedef int (*module_init_cb_t)(od_logger_t *logger); /* auth */ typedef int (*client_auth_attempt_cb_t)(od_client_t *c); diff --git a/sources/router.c b/sources/router.c index 0b56c00f..3983ed45 100644 --- a/sources/router.c +++ b/sources/router.c @@ -83,6 +83,7 @@ static inline int od_router_reload_cb(od_route_t *route, void **argv) int od_router_reconfigure(od_router_t *router, od_rules_t *rules) { + od_instance_t *instance = router->global->instance; od_router_lock(router); int updates; @@ -95,9 +96,27 @@ int od_router_reconfigure(od_router_t *router, od_rules_t *rules) if (updates > 0) { od_extention_t *extentions = router->global->extentions; - od_module_t *modules = extentions->modules; - /* reloadcallback */ od_list_t *i; + od_module_t *modules = extentions->modules; + + od_list_foreach(&added, i) + { + od_rule_key_t *rk; + rk = od_container_of(i, od_rule_key_t, link); + od_log(&instance->logger, "reload config", NULL, NULL, + "added rule: %s %s", rk->usr_name, rk->db_name); + } + + od_list_foreach(&deleted, i) + { + od_rule_key_t *rk; + rk = od_container_of(i, od_rule_key_t, link); + od_log(&instance->logger, "reload config", NULL, NULL, + "deleted rule: %s %s", rk->usr_name, + rk->db_name); + } + + /* reloadcallback */ od_list_foreach(&modules->link, i) { od_module_t *module; @@ -111,11 +130,18 @@ int od_router_reconfigure(od_router_t *router, od_rules_t *rules) } } + od_list_foreach(&added, i) + { + od_rule_key_t *rk; + rk = od_container_of(i, od_rule_key_t, link); + od_rule_key_free(rk); + } + od_list_foreach(&deleted, i) { - od_rule_t *rule; - rule = od_container_of(i, od_rule_t, link); - od_rules_rule_free(rule); + od_rule_key_t *rk; + rk = od_container_of(i, od_rule_key_t, link); + od_rule_key_free(rk); } od_route_pool_foreach(&router->route_pool, od_router_reload_cb, diff --git a/sources/rules.c b/sources/rules.c index c0afd506..7bda7fa4 100644 --- a/sources/rules.c +++ b/sources/rules.c @@ -596,8 +596,80 @@ __attribute__((hot)) int od_rules_merge(od_rules_t *rules, od_rules_t *src, count_mark++; } - /* select new rules */ + /* select dropped rules */ od_list_t *n; + od_list_foreach_safe(&rules->rules, i, n) + { + od_rule_t *rule_old; + rule_old = od_container_of(i, od_rule_t, link); + + int ok = 0; + + od_list_t *m; + od_list_t *j; + od_list_foreach_safe(&src->rules, j, m) + { + od_rule_t *rule_new; + rule_new = od_container_of(j, od_rule_t, link); + if (strcmp(rule_old->user_name, rule_new->user_name) == + 0 && + strcmp(rule_old->db_name, rule_new->db_name) == 0) { + ok = 1; + break; + } + } + + if (!ok) { + od_rule_key_t *rk = malloc(sizeof(od_rule_key_t)); + + od_rule_key_init(rk); + + rk->usr_name = strndup(rule_old->user_name, + rule_old->user_name_len); + rk->db_name = strndup(rule_old->db_name, + rule_old->db_name_len); + + od_list_append(deleted, &rk->link); + } + }; + + /* select added rules */ + od_list_foreach_safe(&src->rules, i, n) + { + od_rule_t *rule_new; + rule_new = od_container_of(i, od_rule_t, link); + + int ok = 0; + + od_list_t *m; + od_list_t *j; + od_list_foreach_safe(&rules->rules, j, m) + { + od_rule_t *rule_old; + rule_old = od_container_of(j, od_rule_t, link); + if (strcmp(rule_old->user_name, rule_new->user_name) == + 0 && + strcmp(rule_old->db_name, rule_new->db_name) == 0) { + ok = 1; + break; + } + } + + if (!ok) { + od_rule_key_t *rk = malloc(sizeof(od_rule_key_t)); + + od_rule_key_init(rk); + + rk->usr_name = strndup(rule_new->user_name, + rule_new->user_name_len); + rk->db_name = strndup(rule_new->db_name, + rule_new->db_name_len); + + od_list_append(added, &rk->link); + } + }; + + /* select new rules */ od_list_foreach_safe(&src->rules, i, n) { od_rule_t *rule; @@ -643,9 +715,7 @@ __attribute__((hot)) int od_rules_merge(od_rules_t *rules, od_rules_t *src, rule->obsolete = is_obsolete; if (is_obsolete && rule->refs == 0) { - od_list_unlink(&rule->link); - od_list_init(&rule->link); - od_list_append(deleted, &rule->link); + od_rules_rule_free(rule); count_deleted++; count_mark--; } diff --git a/sources/rules.h b/sources/rules.h index dce8a4ff..ecb4bbda 100644 --- a/sources/rules.h +++ b/sources/rules.h @@ -62,6 +62,27 @@ struct od_rule_auth { od_list_t link; }; +typedef struct od_rule_key od_rule_key_t; + +struct od_rule_key { + char *usr_name; + char *db_name; + + od_list_t link; +}; + +static inline void od_rule_key_init(od_rule_key_t *rk) +{ + od_list_init(&rk->link); +} + +static inline void od_rule_key_free(od_rule_key_t *rk) +{ + od_list_unlink(&rk->link); + + free(rk); +} + struct od_rule { /* versioning */ int mark; @@ -175,9 +196,11 @@ od_rule_storage_t *od_rules_storage_copy(od_rule_storage_t *); void od_rules_storage_free(od_rule_storage_t *); +#ifdef LDAP_FOUND /* ldap endpoint */ od_ldap_endpoint_t *od_rules_ldap_endpoint_add(od_rules_t *rules, od_ldap_endpoint_t *ldap); +#endif /* auth */ od_rule_auth_t *od_rules_auth_add(od_rule_t *);