From 2d399c72d6ef85c38222992dd9c0bcf854984a35 Mon Sep 17 00:00:00 2001
From: obarun <eric@obarun.org>
Date: Wed, 14 Jun 2023 23:05:09 +1100
Subject: [PATCH] allow to exclude path from the research

---
 src/include/66/service.h                  |  4 ++--
 src/lib66/exec/ssexec_parse.c             |  3 ++-
 src/lib66/parse/parse_compute_list.c      |  4 +++-
 src/lib66/parse/parse_frontend.c          |  5 +++--
 src/lib66/parse/parse_interdependences.c  |  3 ++-
 src/lib66/service/service_frontend_path.c | 12 +++++++-----
 src/lib66/service/service_frontend_src.c  |  5 ++---
 7 files changed, 21 insertions(+), 15 deletions(-)

diff --git a/src/include/66/service.h b/src/include/66/service.h
index 63af538c..732f9043 100644
--- a/src/include/66/service.h
+++ b/src/include/66/service.h
@@ -303,8 +303,8 @@ extern resolve_field_table_t resolve_service_field_table[] ;
 
 extern int service_cmp_basedir(char const *dir) ;
 extern int service_endof_dir(char const *dir, char const *name) ;
-extern int service_frontend_path(stralloc *sasrc,char const *sv, uid_t owner,char const *directory_forced) ;
-extern int service_frontend_src(stralloc *sasrc, char const *name, char const *src) ;
+extern int service_frontend_path(stralloc *sasrc,char const *sv, uid_t owner,char const *directory_forced, char const **exclude) ;
+extern int service_frontend_src(stralloc *sasrc, char const *name, char const *src, char const **exclude) ;
 extern int service_is_g(char *atree, char const *name, uint32_t flag) ;
 extern void service_resolve_array_free(resolve_service_t *ares, unsigned int areslen) ;
 extern int service_resolve_array_search(resolve_service_t *ares, unsigned int areslen, char const *name) ;
diff --git a/src/lib66/exec/ssexec_parse.c b/src/lib66/exec/ssexec_parse.c
index 774f9775..b252b0aa 100644
--- a/src/lib66/exec/ssexec_parse.c
+++ b/src/lib66/exec/ssexec_parse.c
@@ -86,6 +86,7 @@ int ssexec_parse(int argc, char const *const *argv, ssexec_t *info)
         char bname[namelen + 1] ;
         char dname[namelen + 1] ;
         char const *directory_forced = 0 ;
+        char const *exclude[1] = { 0 } ;
 
         if (argv[0][0] == '/') {
 
@@ -102,7 +103,7 @@ int ssexec_parse(int argc, char const *const *argv, ssexec_t *info)
 
         name_isvalid(sv) ;
 
-        if (!service_frontend_path(&sa, sv, info->owner, directory_forced))
+        if (!service_frontend_path(&sa, sv, info->owner, directory_forced, exclude))
             log_dieu(LOG_EXIT_USER, "find service frontend file of: ", sv) ;
 
         /** need to check all the contents of the stralloc.
diff --git a/src/lib66/parse/parse_compute_list.c b/src/lib66/parse/parse_compute_list.c
index 04c520f3..9e952ca6 100644
--- a/src/lib66/parse/parse_compute_list.c
+++ b/src/lib66/parse/parse_compute_list.c
@@ -38,6 +38,8 @@ int parse_compute_list(resolve_wrapper_t_ref wres, stralloc *sa, uint32_t *res,
     size_t len = sa->len, pos = 0 ;
     size_t nelement = sastr_nelement(sa) ;
     stralloc tmp = STRALLOC_ZERO ;
+    char const *exclude[1] = { 0 } ;
+
     char f[len + nelement + 2] ;
 
     memset(f, 0, len) ;
@@ -51,7 +53,7 @@ int parse_compute_list(resolve_wrapper_t_ref wres, stralloc *sa, uint32_t *res,
 
             tmp.len = 0 ;
 
-            r = service_frontend_path(&tmp, sa->s + pos, getuid(), 0) ;
+            r = service_frontend_path(&tmp, sa->s + pos, getuid(), 0, exclude) ;
             if (r == -1)
                 log_dieu(LOG_EXIT_SYS, "get frontend service file of: ", sa->s + pos) ;
 
diff --git a/src/lib66/parse/parse_frontend.c b/src/lib66/parse/parse_frontend.c
index 6f2c1fa0..31f88b9c 100644
--- a/src/lib66/parse/parse_frontend.c
+++ b/src/lib66/parse/parse_frontend.c
@@ -44,6 +44,7 @@ static void parse_service_instance(stralloc *frontend, char const *svsrc, char c
     log_flow() ;
 
     stralloc sa = STRALLOC_ZERO ;
+    char const *exclude[1] = { 0 } ;
 
     if (!instance_splitname(&sa, sv, insta, SS_INSTANCE_TEMPLATE))
         log_die(LOG_EXIT_SYS, "split instance service of: ", sv) ;
@@ -58,7 +59,7 @@ static void parse_service_instance(stralloc *frontend, char const *svsrc, char c
         /** in module the template service may not exist e.g.
          * module which call another module. In this case
          * follow the classic way */
-        int r = service_frontend_path(&sa, sv, getuid(), 0) ;
+        int r = service_frontend_path(&sa, sv, getuid(), 0, exclude) ;
         if (r < 1)
             log_dieu(LOG_EXIT_SYS, "get frontend service file of: ", sv) ;
 
@@ -135,7 +136,7 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle
         log_trace("read frontend service at: ", sv) ;
 
         if (read_svfile(&sa, svname, svsrc) <= 0)
-            log_dieusys(LOG_EXIT_SYS, "read frontend service at: ", sv) ;
+            log_dieu(LOG_EXIT_SYS, "read frontend service at: ", sv) ;
     }
 
     char file[sa.len + 1] ;
diff --git a/src/lib66/parse/parse_interdependences.c b/src/lib66/parse/parse_interdependences.c
index 8ab6426e..91d3b257 100644
--- a/src/lib66/parse/parse_interdependences.c
+++ b/src/lib66/parse/parse_interdependences.c
@@ -36,6 +36,7 @@ int parse_interdependences(char const *service, char const *list, unsigned int l
     int r, e = 0 ;
     size_t pos = 0, len = 0 ;
     stralloc sa = STRALLOC_ZERO ;
+    char const *exclude[1] = { 0 } ;
 
     if (listlen) {
 
@@ -73,7 +74,7 @@ int parse_interdependences(char const *service, char const *list, unsigned int l
             if (!strcmp(main, name))
                 log_die(LOG_EXIT_USER, "direct cyclic interdependences detected -- ", main, " depends on: ", service, " which depends on: ", main) ;
 
-            r = service_frontend_path(&sa, name, getuid(), forced_directory) ;
+            r = service_frontend_path(&sa, name, getuid(), forced_directory, exclude) ;
             if (r < 1) {
                 log_warnu( "get frontend service file of: ", name) ;
                 goto freed ;
diff --git a/src/lib66/service/service_frontend_path.c b/src/lib66/service/service_frontend_path.c
index b70a4d0d..f96834bb 100644
--- a/src/lib66/service/service_frontend_path.c
+++ b/src/lib66/service/service_frontend_path.c
@@ -24,7 +24,7 @@
 #include <66/constants.h>
 #include <66/service.h>
 
-int service_frontend_path(stralloc *sasrc, char const *sv, uid_t owner, char const *directory_forced)
+int service_frontend_path(stralloc *sasrc, char const *sv, uid_t owner, char const *directory_forced, char const **exclude)
 {
     log_flow() ;
 
@@ -34,11 +34,13 @@ int service_frontend_path(stralloc *sasrc, char const *sv, uid_t owner, char con
 
     if (directory_forced) {
 
+        char const *exclude[1] = { 0 } ;
+
         if (!service_cmp_basedir(directory_forced))
             log_die(LOG_EXIT_USER, "invalid base service directory: ", directory_forced) ;
 
         src = directory_forced ;
-        r = service_frontend_src(sasrc, sv, src) ;
+        r = service_frontend_src(sasrc, sv, src, exclude) ;
         if (r == -1)
             log_dieusys(LOG_EXIT_SYS, "parse source directory: ", src) ;
 
@@ -59,21 +61,21 @@ int service_frontend_path(stralloc *sasrc, char const *sv, uid_t owner, char con
             src = home ;
         }
 
-        r = service_frontend_src(sasrc, sv, src) ;
+        r = service_frontend_src(sasrc, sv, src, exclude) ;
         if (r == -1)
             log_dieusys(LOG_EXIT_SYS, "parse source directory: ", src) ;
 
         if (!r) {
 
             src = SS_SERVICE_ADMDIR ;
-            r = service_frontend_src(sasrc, sv, src) ;
+            r = service_frontend_src(sasrc, sv, src, exclude) ;
             if (r == -1)
                 log_dieusys(LOG_EXIT_SYS, "parse source directory: ", src) ;
 
             if (!r) {
 
                 src = SS_SERVICE_SYSDIR ;
-                r = service_frontend_src(sasrc, sv, src) ;
+                r = service_frontend_src(sasrc, sv, src, exclude) ;
                 if (r == -1)
                     log_dieusys(LOG_EXIT_SYS, "parse source directory: ", src) ;
 
diff --git a/src/lib66/service/service_frontend_src.c b/src/lib66/service/service_frontend_src.c
index c732dd23..f09aacb9 100644
--- a/src/lib66/service/service_frontend_src.c
+++ b/src/lib66/service/service_frontend_src.c
@@ -26,7 +26,7 @@
 #include <66/service.h>
 #include <66/instance.h>
 
-int service_frontend_src(stralloc *sasrc, char const *name, char const *src)
+int service_frontend_src(stralloc *sasrc, char const *name, char const *src, char const **exclude)
 {
     log_flow() ;
 
@@ -34,7 +34,6 @@ int service_frontend_src(stralloc *sasrc, char const *name, char const *src)
     stralloc sa = STRALLOC_ZERO ;
     size_t pos = 0, dpos = 0, pathlen = strlen(src), namelen = strlen(name) ;
     char instaname[strlen(name) + 1] ;
-    char const *exclude[1] = { 0 } ;
 
     char path[pathlen + 1] ;
 
@@ -135,7 +134,7 @@ int service_frontend_src(stralloc *sasrc, char const *name, char const *src)
                     dpos = 0 ;
                     FOREACH_SASTR(&sa, dpos) {
 
-                        r = service_frontend_src(sasrc, sa.s + dpos, dname) ;
+                        r = service_frontend_src(sasrc, sa.s + dpos, dname, exclude) ;
                         if (r < 0)
                             /** system error */
                             goto err ;
-- 
GitLab