From a2ce3efab253d2401bec487fd51f62a6db559f22 Mon Sep 17 00:00:00 2001
From: obarun <eric@obarun.org>
Date: Sat, 11 Mar 2023 02:31:21 +1100
Subject: [PATCH] make it flexible to switch between dependencies and
 requiredby service

---
 src/lib66/parse/parse_dependencies.c | 44 ++++++++++------------------
 1 file changed, 15 insertions(+), 29 deletions(-)

diff --git a/src/lib66/parse/parse_dependencies.c b/src/lib66/parse/parse_dependencies.c
index 7fb5cbf1..a2424cf8 100644
--- a/src/lib66/parse/parse_dependencies.c
+++ b/src/lib66/parse/parse_dependencies.c
@@ -27,20 +27,22 @@
 #include <66/ssexec.h>
 #include <66/utils.h>
 #include <66/constants.h>
+#include <66/instance.h>
 
-int parse_dependencies(resolve_service_t *res, resolve_service_t *ares, unsigned int *areslen, ssexec_t *info, uint8_t force, uint8_t conf, char const *forced_directory, char const *main)
+int parse_dependencies(resolve_service_t *res, resolve_service_t *ares, unsigned int *areslen, ssexec_t *info, uint8_t force, uint8_t conf, char const *forced_directory, char const *main, uint8_t requiredby)
 {
     log_flow() ;
 
+    uint32_t deps = !requiredby ? res->dependencies.ndepends : res->dependencies.nrequiredby ;
+    uint32_t data = !requiredby ? res->dependencies.depends : res->dependencies.requiredby ;
     size_t pos = 0, len = 0 ;
     int r, e = 0 ;
     unsigned int residx = 0 ;
     stralloc sa = STRALLOC_ZERO ;
-    char *current = res->sa.s + res->name ;
 
-    if (res->dependencies.ndepends) {
+    if (deps) {
 
-        if (!sastr_clean_string(&sa, res->sa.s + res->dependencies.depends)) {
+        if (!sastr_clean_string(&sa, res->sa.s + data)) {
             log_warnu("clean the string") ;
             goto freed ;
         }
@@ -54,49 +56,33 @@ int parse_dependencies(resolve_service_t *res, resolve_service_t *ares, unsigned
         for (; pos < len ; pos += strlen(t + pos) + 1) {
 
             sa.len = 0 ;
-            char name[strlen(t + pos) + 1] ;
-            char ainsta[strlen(t + pos) + 1] ;
+            char const *name = t + pos ;
+            char ainsta[strlen(name) + 1] ;
             int insta = -1 ;
 
-            log_trace("parse dependencies: ", t + pos, " of service: ", res->sa.s + res->name) ;
+            log_trace("parse ", !requiredby ? "dependencies " : "requiredby ", name, " of service: ", res->sa.s + res->name) ;
 
-            insta = instance_check(t + pos) ;
+            insta = instance_check(name) ;
 
             if (insta > 0) {
 
-                if (!instance_splitname(&sa, t + pos, insta, SS_INSTANCE_TEMPLATE))
-                    log_die(LOG_EXIT_SYS, "split instance service of: ", t + pos) ;
-
-                auto_strings(name, sa.s) ;
-                sa.len = 0 ;
-
-                if (!instance_splitname(&sa, t + pos, insta, SS_INSTANCE_NAME))
-                    log_die(LOG_EXIT_SYS, "split instance service of: ", t + pos) ;
+                if (!instance_splitname(&sa, name, insta, SS_INSTANCE_NAME))
+                    log_die(LOG_EXIT_SYS, "split instance service of: ", name) ;
 
                 auto_strings(ainsta, sa.s) ;
                 sa.len = 0 ;
-
-            } else {
-
-                auto_strings(name, t + pos) ;
             }
 
             if (!strcmp(main, name))
-                log_die(LOG_EXIT_USER, "direct cyclic dependencies detected -- ", main, " depends on: ", current, " which depends on: ", main) ;
+                log_die(LOG_EXIT_USER, "direct cyclic dependencies detected -- ", main, " depends on: ", res->sa.s + res->name, " which depends on: ", main) ;
 
 
             r = service_frontend_path(&sa, name, getuid(), forced_directory) ;
             if (r < 1) {
-                log_warnu( "get frontend service file of: ", t + pos) ;
+                log_warnu( "get frontend service file of: ", name) ;
                 goto freed ;
             }
 
-            if (insta > 0) {
-                sa.len-- ;
-                if (!stralloc_catb(&sa, ainsta, strlen(ainsta)))
-                    log_die_nomem("stralloc") ;
-            }
-
             if (!stralloc_0(&sa))
                 log_die_nomem("stralloc") ;
 
@@ -105,7 +91,7 @@ int parse_dependencies(resolve_service_t *res, resolve_service_t *ares, unsigned
         }
 
     } else
-        log_trace("no dependencies found for: ", res->sa.s + res->name) ;
+        log_trace("no ", !requiredby ? "dependencies" : "requiredby", " found for: ", res->sa.s + res->name) ;
 
     e = 1 ;
 
-- 
GitLab