diff --git a/src/lib66/module/parse_module.c b/src/lib66/module/parse_module.c index f3b5adb89b4b2d6988f41b196691b0a95ac36325..4fd5d34afac7335d39be5ad78e42551207d31d6f 100644 --- a/src/lib66/module/parse_module.c +++ b/src/lib66/module/parse_module.c @@ -122,6 +122,7 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int int r, insta = -1 ; size_t pos = 0, copylen = 0, len = 0 ; + uint8_t opt_tree = info->opt_tree ; char name[strlen(res->sa.s + res->name) + 1] ; auto_strings(name,res->sa.s + res->name) ; char *src = res->sa.s + res->path.frontend ; @@ -245,6 +246,7 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int sa.len = 0 ; out = 0 ; + info->opt_tree = opt_tree ; char fname[strlen(l + pos)] ; if (!ob_basename(fname, l + pos)) @@ -278,11 +280,18 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int if (!sastr_add_string(&list, n)) log_die_nomem("stralloc") ; + info->opt_tree = 1 ; + info->treename.len = 0 ; + if (!auto_stra(&info->treename, res->sa.s + res->intree)) + log_die_nomem("stralloc") ; + } else { + info->opt_tree = 0 ; if (res->dependencies.ndepends) { - + /** TODO: avoid to increase db size by + * storing dependencies into an array */ size_t len = strlen(res->sa.s + res->dependencies.depends) ; char tmp[len + strlen(fname) + 2] ; auto_strings(tmp, res->sa.s + res->dependencies.depends, " ", fname) ; diff --git a/src/lib66/parse/parse_compute_resolve.c b/src/lib66/parse/parse_compute_resolve.c index d4c24e0121e4095f357386078235d7f7974397e8..54949e31b7042b44f1f738839581b14574c4a5d6 100644 --- a/src/lib66/parse/parse_compute_resolve.c +++ b/src/lib66/parse/parse_compute_resolve.c @@ -440,14 +440,6 @@ void parse_compute_resolve(unsigned int idx, resolve_service_t *ares, unsigned i res->path.home = resolve_add_string(wres, info->base.s) ; - /** Command line precede frontend file which precede the default tree name*/ - if (info->opt_tree) - res->treename = resolve_add_string(wres, info->treename.s) ; - else if (res->intree) - res->treename = resolve_add_string(wres, res->sa.s + res->intree) ; - else - res->treename = resolve_add_string(wres, info->treename.s) ; - /* live */ res->live.livedir = resolve_add_string(wres, info->live.s) ; @@ -466,7 +458,7 @@ void parse_compute_resolve(unsigned int idx, resolve_service_t *ares, unsigned i * * which is a symlink pointing to * - * /var/lib/66/system/treename/servicedirs/svc/service_name + * /var/lib/66/system/servicedirs/svc/service_name * * which is a symlink pointing to: * diff --git a/src/lib66/parse/parse_frontend.c b/src/lib66/parse/parse_frontend.c index a448167455ebaa8bb6a455e519f5ed2b199432cf..c76b7c1cd763aa962dea83c279ca8e33674ea11c 100644 --- a/src/lib66/parse/parse_frontend.c +++ b/src/lib66/parse/parse_frontend.c @@ -87,7 +87,8 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle { log_flow() ; - int insta, r, isparsed ; + int insta, isparsed ; + uint8_t opt_tree_forced = 0 ; size_t svlen = strlen(sv) ; char svname[svlen + 1], svsrc[svlen + 1] ; char atree[SS_MAX_TREENAME + 1] ; @@ -149,46 +150,45 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle if (isparsed == STATE_FLAGS_TRUE && !force) log_warn_return(2, "ignoring service: ", svname, " -- already parsed") ; - if (info->opt_tree) { + { + /** search for the type field*/ + if (!environ_get_val_of_key(&sa, get_key_by_enum(ENUM_KEY_SECTION_MAIN, KEY_MAIN_TYPE))) + log_dieu(LOG_EXIT_SYS, "get field ", get_key_by_enum(ENUM_KEY_SECTION_MAIN, KEY_MAIN_TYPE)," of service: ", svname) ; - r = tree_isvalid(info->base.s, info->treename.s) ; - if (r < 0) - log_dieu(LOG_EXIT_SYS, "check validity of tree: ", info->treename.s) ; + char store[sa.len + 1] ; + auto_strings(store, sa.s) ; - if (!r) { + if (!parse_store_main(&res, store, SECTION_MAIN, KEY_MAIN_TYPE)) + log_dieu(LOG_EXIT_SYS, "store field type of service: ", svname) ; - /** @intree may not exist */ - r = sastr_find(&sa, get_key_by_enum(ENUM_KEY_SECTION_MAIN, KEY_MAIN_INTREE)) ; - if (r == -1) - goto follow ; + sa.len = 0 ; + if (!auto_stra(&sa, file)) + log_die_nomem("stralloc") ; + } + + if (!info->opt_tree) { - if (!environ_get_val_of_key(&sa, get_key_by_enum(ENUM_KEY_SECTION_MAIN, KEY_MAIN_INTREE))) - log_dieu(LOG_EXIT_SYS, "get field intree of service: ", sv) ; + /** search for the intree field. + * This field is not mandatory, do not crash if it not found */ + if (environ_get_val_of_key(&sa, get_key_by_enum(ENUM_KEY_SECTION_MAIN, KEY_MAIN_INTREE))) { - if (!sastr_clean_element(&sa)) - log_dieu(LOG_EXIT_SYS, "clean field intree of service: ", sv) ; + char store[sa.len + 1] ; + auto_strings(store, sa.s) ; - res.intree = resolve_add_string(wres, sa.s) ; + if (!parse_store_main(&res, store, SECTION_MAIN, KEY_MAIN_INTREE)) + log_dieu(LOG_EXIT_SYS, "store field intree of service: ", svname) ; info->treename.len = 0 ; + info->opt_tree = 1 ; + opt_tree_forced = 1 ; sa.len = 0 ; + if (!auto_stra(&info->treename, res.sa.s + res.intree) || !auto_stra(&sa, file)) log_die_nomem("stralloc") ; } } - follow: - - if (!environ_get_val_of_key(&sa, get_key_by_enum(ENUM_KEY_SECTION_MAIN, KEY_MAIN_TYPE))) - log_dieu(LOG_EXIT_SYS, "get field ", get_key_by_enum(ENUM_KEY_SECTION_MAIN, KEY_MAIN_TYPE)," of service: ", svname) ; - - char store[sa.len + 1] ; - auto_strings(store, sa.s) ; - - if (!parse_store_main(&res, store, SECTION_MAIN, KEY_MAIN_TYPE)) - log_dieu(LOG_EXIT_SYS, "store field type of service: ", svname) ; - if (inmodule) { char n[strlen(inmodule) + 1 + strlen(svname) + 1] ; @@ -215,13 +215,9 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle // keep overwrite_conf res.environ.env_overwrite = conf ; - /** try to create the tree if not exist yet with - * the help of the seed files */ - set_treeinfo(info) ; - /** contents of directory should be listed by service_frontend_path * except for module type */ - if (scan_mode(sv,S_IFDIR) == 1 && res.type != TYPE_MODULE) + if (scan_mode(sv, S_IFDIR) == 1 && res.type != TYPE_MODULE) goto freed ; if (!parse_contents(wres, file, svname)) @@ -230,6 +226,15 @@ int parse_frontend(char const *sv, resolve_service_t *ares, unsigned int *aresle if (!parse_mandatory(&res)) log_die(LOG_EXIT_SYS, "some mandatory field is missing for service: ", svname) ; + /** try to create the tree if not exist yet with + * the help of the seed files */ + set_treeinfo(info) ; + + res.treename = resolve_add_string(wres, info->treename.s) ; + + if (opt_tree_forced) + info->opt_tree = 0 ; + /** append res.dependencies.depends list with the optional dependencies list */ if (res.dependencies.noptsdeps) { diff --git a/src/lib66/parse/parse_store_main.c b/src/lib66/parse/parse_store_main.c index 2bb6aafd99dbf75bf3d913704d01eb3cc96eed69..2d9a1be7d2133c4bdb12adfa64281d29981dd220 100644 --- a/src/lib66/parse/parse_store_main.c +++ b/src/lib66/parse/parse_store_main.c @@ -381,6 +381,10 @@ int parse_store_main(resolve_service_t *res, char *store, int idsec, int idkey) case KEY_MAIN_INTREE: + if (res->intree) + /** already passed through here */ + break ; + if (!parse_clean_line(store)) parse_error_return(0, 8, idsec, idkey) ;