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