From 4f13bcbd267bd216c5934c3da80e14a832929480 Mon Sep 17 00:00:00 2001 From: obarun <eric@obarun.org> Date: Sun, 18 Jun 2023 00:28:54 +1100 Subject: [PATCH] respect tree and handle logger at enable time --- src/lib66/exec/ssexec_enable.c | 40 +++++++++++++++++++--- src/lib66/service/service_enable_disable.c | 2 -- src/lib66/service/service_switch_tree.c | 5 +-- src/lib66/tree/tree_service_add.c | 15 ++------ src/lib66/tree/tree_service_remove.c | 14 ++++---- 5 files changed, 47 insertions(+), 29 deletions(-) diff --git a/src/lib66/exec/ssexec_enable.c b/src/lib66/exec/ssexec_enable.c index c439302e..5858ec2e 100644 --- a/src/lib66/exec/ssexec_enable.c +++ b/src/lib66/exec/ssexec_enable.c @@ -25,6 +25,7 @@ #include <66/state.h> #include <66/graph.h> #include <66/config.h> +#include <66/enum.h> static void parse_it(char const *name, ssexec_t *info) { @@ -43,11 +44,26 @@ static void parse_it(char const *name, ssexec_t *info) PROG = prog ; } +static void service_resolve_array_write(char const *base, resolve_service_t *ares, uint32_t *indexes, uint32_t lindex) +{ + log_flow() ; + + uint32_t pos = 0 ; + + for (; pos < lindex ; ++pos) { + + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &ares[indexes[pos]]) ; + + if (!resolve_write_g(wres, base, ares[indexes[pos]].sa.s + ares[indexes[pos]].name)) + log_dieu(LOG_EXIT_SYS, "write resolve file of: ", ares[indexes[pos]].sa.s + ares[indexes[pos]].name) ; + } +} + int ssexec_enable(int argc, char const *const *argv, ssexec_t *info) { log_flow() ; - uint32_t flag = 0 ; + uint32_t flag = 0, *indexes = { 0 }, lindex = 0 ; uint8_t start = 0, propagate = 1 ; int n = 0, e = 1 ; size_t pos = 0 ; @@ -117,13 +133,31 @@ int ssexec_enable(int argc, char const *const *argv, ssexec_t *info) service_enable_disable(&graph, aresid, ares, areslen, 1, visit, propagate) ; - if (info->opt_tree) + if (info->opt_tree) { + service_switch_tree(&ares[aresid], info->base.s, info->treename.s) ; + indexes[lindex++] = aresid ; + + if (ares[aresid].logger.want && ares[aresid].type == TYPE_CLASSIC) { + + int logid = service_resolve_array_search(ares, areslen, ares[aresid].sa.s + ares[aresid].logger.name) ; + if (logid < 0) + log_die(LOG_EXIT_USER, "service: ", ares[aresid].sa.s + ares[aresid].logger.name, " not available -- please make a bug report") ; + + service_switch_tree(&ares[logid], info->base.s, info->treename.s) ; + + indexes[lindex++] = logid ; + } + } + if (!stack_add_g(&stk, argv[n])) log_dieu(LOG_EXIT_SYS, "add string") ; + + log_info("Enabled successfully service: ", ares[aresid].sa.s + ares[aresid].name) ; } + service_resolve_array_write(info->base.s, ares, indexes, lindex) ; service_resolve_array_free(ares, areslen) ; graph_free_all(&graph) ; @@ -156,7 +190,5 @@ int ssexec_enable(int argc, char const *const *argv, ssexec_t *info) info->usage = usage ; } - - return e ; } diff --git a/src/lib66/service/service_enable_disable.c b/src/lib66/service/service_enable_disable.c index 653cf3da..822a796f 100644 --- a/src/lib66/service/service_enable_disable.c +++ b/src/lib66/service/service_enable_disable.c @@ -126,7 +126,5 @@ void service_enable_disable(graph_t *g, unsigned int idx, resolve_service_t *are } visit[idx] = VISIT_GRAY ; - - log_info(!action ? "Disabled" : "Enabled"," successfully service: ", res->sa.s + res->name) ; } } diff --git a/src/lib66/service/service_switch_tree.c b/src/lib66/service/service_switch_tree.c index 555cd843..5eac9428 100644 --- a/src/lib66/service/service_switch_tree.c +++ b/src/lib66/service/service_switch_tree.c @@ -33,8 +33,5 @@ void service_switch_tree(resolve_service_t *res, char const *base, char const *t if (!service_resolve_modify_field(res, E_RESOLVE_SERVICE_TREENAME, totreename)) log_dieu(LOG_EXIT_SYS, "modify resolve file of: ", res->sa.s + res->name) ; - if (!resolve_write_g(wres, base, res->sa.s + res->name)) - log_dieu(LOG_EXIT_SYS, "write resolve file of: ", res->sa.s + res->name) ; - free(wres) ; -} \ No newline at end of file +} diff --git a/src/lib66/tree/tree_service_add.c b/src/lib66/tree/tree_service_add.c index c3a2a1e4..64dbc09f 100644 --- a/src/lib66/tree/tree_service_add.c +++ b/src/lib66/tree/tree_service_add.c @@ -22,11 +22,9 @@ void tree_service_add(char const *base, char const *treename, char const *servic { log_flow() ; - int r ; size_t len = strlen(service) ; resolve_tree_t tres = RESOLVE_TREE_ZERO ; resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, &tres) ; - stack_ref pstk = 0 ; _init_stack_(stk, SS_MAX_SERVICE * SS_MAX_SERVICE_NAME + 1 + len + 1) ; @@ -38,14 +36,10 @@ void tree_service_add(char const *base, char const *treename, char const *servic if (!stack_convert_string(&stk, tres.sa.s + tres.contents, strlen(tres.sa.s + tres.contents))) log_dieusys(LOG_EXIT_SYS, "convert string to stack") ; - if (stack_retrieve_element(&stk, service) < 0) { - + if (stack_retrieve_element(&stk, service) < 0) if (!stack_add_g(&stk, service)) log_dieusys(LOG_EXIT_SYS, "add service: ", service, " to tree: ", treename) ; - tres.ncontents++ ; - } - if (!stack_close(&stk)) log_dieusys(LOG_EXIT_SYS, "close stack") ; @@ -54,21 +48,18 @@ void tree_service_add(char const *base, char const *treename, char const *servic if (!stack_add_g(&stk, service)) log_dieu(LOG_EXIT_SYS, "add string to stack") ; - tres.ncontents++ ; - if (!stack_close(&stk)) log_dieusys(LOG_EXIT_SYS, "close stack") ; } + tres.ncontents = stack_count_element(&stk) ; + if (!stack_convert_tostring(&stk)) log_dieu(LOG_EXIT_SYS, "convert stack to string") ; if (!resolve_modify_field(wres, E_RESOLVE_TREE_CONTENTS, stk.s)) log_dieusys(LOG_EXIT_SYS, "modify resolve file of: ", treename) ; - if (!resolve_write_g(wres, base, treename)) - log_dieusys(LOG_EXIT_SYS, "write resolve file of tree: ", treename) ; - resolve_free(wres) ; } diff --git a/src/lib66/tree/tree_service_remove.c b/src/lib66/tree/tree_service_remove.c index 75271456..c7760099 100644 --- a/src/lib66/tree/tree_service_remove.c +++ b/src/lib66/tree/tree_service_remove.c @@ -26,8 +26,6 @@ void tree_service_remove(char const *base, char const *treename, char const *ser resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, &tres) ; char *str = 0 ; - log_trace("modify field contents of resolve tree file: ", treename) ; - if (resolve_read_g(wres, base, treename) <= 0) log_dieusys(LOG_EXIT_SYS, "read resolve file of tree: ", treename) ; @@ -49,15 +47,17 @@ void tree_service_remove(char const *base, char const *treename, char const *ser str = stk.s ; - } else str = "" ; + tres.ncontents = stack_count_element(&stk) ; + + } else { + + tres.ncontents = 0 ; + str = "" ; + } if (!resolve_modify_field(wres, E_RESOLVE_TREE_CONTENTS, str)) log_dieusys(LOG_EXIT_SYS, "modify resolve file of: ", treename) ; - tres.ncontents-- ; - - if (!resolve_write_g(wres, base, treename)) - log_dieusys(LOG_EXIT_SYS, "write resolve file of tree: ", treename) ; } resolve_free(wres) ; -- GitLab