From 23549ca7b8bdb9cf0e60e9f2bbb9e12b4090d7ac Mon Sep 17 00:00:00 2001 From: obarun <eric@obarun.org> Date: Mon, 15 Jun 2020 19:37:33 +1100 Subject: [PATCH] do not try to parse an already parsed service. --- src/lib66/parser_module.c | 56 +++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/src/lib66/parser_module.c b/src/lib66/parser_module.c index 95391a0a..27e89e82 100644 --- a/src/lib66/parser_module.c +++ b/src/lib66/parser_module.c @@ -111,8 +111,10 @@ static int rebuild_list(sv_alltype *sv_before,stralloc *list,stralloc *sv_all_ty } } } - if (!stralloc_catb(sv_all_type,deps_name,strlen(deps_name) + 1)) return 0 ; - if (!stralloc_catb(module_service,deps_name,strlen(deps_name) + 1)) return 0 ; + if (sastr_cmp(sv_all_type,deps_name) == -1) + if (!stralloc_catb(sv_all_type,deps_name,strlen(deps_name) + 1)) return 0 ; + if (sastr_cmp(module_service,deps_name) == -1) + if (!stralloc_catb(module_service,deps_name,strlen(deps_name) + 1)) return 0 ; } return 1 ; @@ -122,10 +124,11 @@ static int rebuild_list(sv_alltype *sv_before,stralloc *list,stralloc *sv_all_ty * return 0 on failure * return 2 on already enabled * @svname do not contents the path of the frontend file*/ + int parse_module(sv_alltype *sv_before,ssexec_t *info,stralloc *parsed_list,stralloc *tree_list, char const *svname,unsigned int *nbsv, stralloc *sasv,uint8_t force,uint8_t conf) { log_trace("start parse process of module: ",svname) ; - int r, err = 1, insta = -1, svtype = -1, from_ext_insta = 0 ; + int r, err = 1, insta = -1, svtype = -1, from_ext_insta = 0, already_parsed = 0 ; size_t pos = 0, id, nid, newlen ; stralloc sdir = STRALLOC_ZERO ; // service dir stralloc list = STRALLOC_ZERO ; @@ -233,13 +236,27 @@ int parse_module(sv_alltype *sv_before,ssexec_t *info,stralloc *parsed_list,stra /** parse all services of the modules */ for (pos = 0 ; pos < list.len ; pos += strlen(list.s + pos) + 1) { - insta = 0, svtype = -1 , from_ext_insta = 0 ; + insta = 0, svtype = -1 , from_ext_insta = 0 , already_parsed = 0 ; char *sv = list.s + pos ; size_t len = strlen(sv) ; char bname[len + 1] ; char *pbname = 0 ; + addonsv.len = 0 ; + if (sastr_cmp(parsed_list,sv) >= 0) + { + /** already parsed ? */ + size_t idx = 0 ; + for (; idx < genalloc_len(sv_alltype,&gasv) ; idx++) + { + char *name = keep.s + genalloc_s(sv_alltype,&gasv)[idx].src ; + if (!strcmp(name,sv)) sv = name ; + break ; + } + already_parsed = 1 ; + } + if (!ob_basename(bname,sv)) log_warnu_return(LOG_EXIT_ZERO,"find basename of: ",sv) ; @@ -258,26 +275,30 @@ int parse_module(sv_alltype *sv_before,ssexec_t *info,stralloc *parsed_list,stra * pass through the classic ss_resolve_src_path() */ pbname = bname ; - int found = 0 ; - size_t len = strlen(permanent_sdir) ; - char tmp[len + SS_MODULE_SERVICE_INSTANCE_LEN + 2] ; - auto_strings(tmp,permanent_sdir,SS_MODULE_SERVICE_INSTANCE + 1,"/") ; + if (!already_parsed) + { + int found = 0 ; + size_t l = strlen(permanent_sdir) ; + char tmp[l + SS_MODULE_SERVICE_INSTANCE_LEN + 2] ; + auto_strings(tmp,permanent_sdir,SS_MODULE_SERVICE_INSTANCE + 1,"/") ; - r = ss_resolve_src(&addonsv,pbname,tmp,&found) ; + r = ss_resolve_src(&addonsv,pbname,tmp,&found) ; - if (r == -1) log_warnusys_return(LOG_EXIT_ZERO,"parse source directory: ",tmp) ; - if (!r) - { - if (ss_resolve_src_path(&addonsv,pbname,info->owner,0) < 1) - log_warnu_return(LOG_EXIT_ZERO,"resolve source path of: ",pbname) ; + if (r == -1) log_warnusys_return(LOG_EXIT_ZERO,"parse source directory: ",tmp) ; + if (!r) + { + if (ss_resolve_src_path(&addonsv,pbname,info->owner,0) < 1) + log_warnu_return(LOG_EXIT_ZERO,"resolve source path of: ",pbname) ; + } + sv = addonsv.s ; } from_ext_insta++ ; - sv = addonsv.s ; len = strlen(sv) ; } - if (!parse_service_before(info,parsed_list,tree_list,sv,nbsv,sasv,force,conf,0,permanent_sdir)) - log_warnu_return(LOG_EXIT_ZERO,"parse: ",sv," from module: ",svname) ; + if (!already_parsed) + if (!parse_service_before(info,parsed_list,tree_list,sv,nbsv,sasv,force,conf,0,permanent_sdir)) + log_warnu_return(LOG_EXIT_ZERO,"parse: ",sv," from module: ",svname) ; char ext_insta[len + 1] ; if (from_ext_insta) { @@ -288,6 +309,7 @@ int parse_module(sv_alltype *sv_before,ssexec_t *info,stralloc *parsed_list,stra ext_insta[newlen] = 0 ; sv = ext_insta ; } + /** we want the configuration file for each service inside * the configuration directory of the module.*/ char *version = keep.s + sv_before->cname.version ; -- GitLab