Skip to content
Snippets Groups Projects
Commit 0b34e228 authored by Eric Vidal's avatar Eric Vidal :speech_balloon:
Browse files

respect treename for each service. Also, service inside a module get the same tree name

parent 060e2358
No related branches found
No related tags found
No related merge requests found
......@@ -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) ;
......
......@@ -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:
*
......
......@@ -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) {
......
......@@ -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) ;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment