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

frontend from external directory than module is declared outside the module

parent 981b1fc9
No related branches found
No related tags found
No related merge requests found
...@@ -37,58 +37,78 @@ ...@@ -37,58 +37,78 @@
#include <66/parse.h> #include <66/parse.h>
#include <66/sanitize.h> #include <66/sanitize.h>
static void convert_tomodule(resolve_service_t *res, char const *module) static void parse_module_prefix(char *result, stralloc *sa, resolve_service_t *ares, unsigned int areslen, char const *module)
{ {
resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, res) ; log_flow() ;
stralloc sa = STRALLOC_ZERO ;
size_t pos = 0, mlen = strlen(module) ;
if (res->dependencies.ndepends) { int aresid = -1 ;
size_t pos = 0, mlen = strlen(module) ;
if (!sastr_clean_string(&sa, res->sa.s + res->dependencies.depends)) FOREACH_SASTR(sa, pos) {
log_die_nomem("stralloc") ;
size_t len = (mlen + 1 + SS_MAX_TREENAME + 2) * res->dependencies.ndepends ; aresid = service_resolve_array_search(ares, areslen, sa->s + pos) ;
char n[len] ;
memset(n, 0, len) ; if (aresid < 0) {
/** try with the name of the module as prefix */
char tmp[mlen + 1 + strlen(sa->s + pos) + 1] ;
FOREACH_SASTR(&sa, pos) { auto_strings(tmp, module, ":", sa->s + pos) ;
auto_strings(n + strlen(n), module, ":", sa.s + pos, " ") ; aresid = service_resolve_array_search(ares, areslen, tmp) ;
if (aresid < 0)
log_die(LOG_EXIT_USER, "service: ", sa->s + pos, " not available -- please make a bug report") ;
} }
n[strlen(n) - 1] = 0 ; /** check if the dependencies is a external one. In this
* case, the service is not considered as part of the module */
if (ares[aresid].inmodule && (!strcmp(ares[aresid].sa.s + ares[aresid].inmodule, module)))
auto_strings(result + strlen(result), module, ":", sa->s + pos, " ") ;
else
auto_strings(result + strlen(result), sa->s + pos, " ") ;
}
res->dependencies.depends = resolve_add_string(wres, n) ; result[strlen(result) - 1] = 0 ;
}
} static void parse_convert_tomodule(unsigned int idx, resolve_service_t *ares, unsigned int areslen, char const *module)
{
log_flow() ;
if (res->dependencies.nrequiredby) { size_t mlen = strlen(module) ;
resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &ares[idx]) ;
stralloc sa = STRALLOC_ZERO ;
sa.len = 0 ; if (ares[idx].dependencies.ndepends) {
if (!sastr_clean_string(&sa, res->sa.s + res->dependencies.requiredby)) if (!sastr_clean_string(&sa, ares[idx].sa.s + ares[idx].dependencies.depends))
log_die_nomem("stralloc") ; log_die_nomem("stralloc") ;
size_t len = (mlen + 1 + SS_MAX_TREENAME + 2) * res->dependencies.nrequiredby ; size_t len = (mlen + 1 + SS_MAX_TREENAME + 2) * ares[idx].dependencies.ndepends ;
char n[len] ; char n[len] ;
memset(n, 0, len) ; memset(n, 0, len) ;
pos = 0 ; parse_module_prefix(n, &sa, ares, areslen, module) ;
FOREACH_SASTR(&sa, pos) { ares[idx].dependencies.depends = resolve_add_string(wres, n) ;
char n[mlen + 1 + strlen(sa.s + pos) + 1] ; }
auto_strings(n + strlen(n), module, ":", sa.s + pos, " ") ; if (ares[idx].dependencies.nrequiredby) {
}
n[strlen(n) - 1] = 0 ; sa.len = 0 ;
res->dependencies.requiredby = resolve_add_string(wres, n) ; if (!sastr_clean_string(&sa, ares[idx].sa.s + ares[idx].dependencies.requiredby))
log_die_nomem("stralloc") ;
size_t len = (mlen + 1 + SS_MAX_TREENAME + 2) * ares[idx].dependencies.nrequiredby ;
char n[len] ;
memset(n, 0, len) ;
parse_module_prefix(n, &sa, ares, areslen, module) ;
ares[idx].dependencies.requiredby = resolve_add_string(wres, n) ;
} }
...@@ -113,6 +133,8 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int ...@@ -113,6 +133,8 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int
log_trace("parse module: ", name) ; log_trace("parse module: ", name) ;
wres = resolve_set_struct(DATA_SERVICE, res) ;
if (!ob_dirname(dirname, src)) if (!ob_dirname(dirname, src))
log_dieu(LOG_EXIT_SYS, "get directory name of: ", src) ; log_dieu(LOG_EXIT_SYS, "get directory name of: ", src) ;
...@@ -163,7 +185,6 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int ...@@ -163,7 +185,6 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int
} }
log_trace("remove directory: ", copy) ; log_trace("remove directory: ", copy) ;
if (!dir_rm_rf(copy)) if (!dir_rm_rf(copy))
log_dieusys (LOG_EXIT_SYS, "remove: ", copy) ; log_dieusys (LOG_EXIT_SYS, "remove: ", copy) ;
...@@ -212,6 +233,7 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int ...@@ -212,6 +233,7 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int
{ {
/* parse each activated services */ /* parse each activated services */
len = list.len ; len = list.len ;
uint8_t out = 0 ;
char l[len + 1] ; char l[len + 1] ;
stralloc sa = STRALLOC_ZERO ; stralloc sa = STRALLOC_ZERO ;
...@@ -222,7 +244,7 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int ...@@ -222,7 +244,7 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int
for (pos = 0 ; pos < len ; pos += strlen(l + pos) + 1) { for (pos = 0 ; pos < len ; pos += strlen(l + pos) + 1) {
sa.len = 0 ; sa.len = 0 ;
out = 0 ;
char fname[strlen(l + pos)] ; char fname[strlen(l + pos)] ;
if (!ob_basename(fname, l + pos)) if (!ob_basename(fname, l + pos))
...@@ -234,25 +256,47 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int ...@@ -234,25 +256,47 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int
/** Search first inside the frontend directory. /** Search first inside the frontend directory.
* If not found, search in the entire system. */ * If not found, search in the entire system. */
if (!service_frontend_path(&sa, fname, info->owner, copy)) { if (!service_frontend_path(&sa, fname, info->owner, copy)) {
if (!service_frontend_path(&sa, fname, info->owner, 0)) if (!service_frontend_path(&sa, fname, info->owner, 0))
log_dieu(LOG_EXIT_USER, "find service frontend file of: ", fname) ; log_dieu(LOG_EXIT_USER, "find service frontend file of: ", fname) ;
/*if (!hiercopy(sa.s, copy)) out++;
log_dieusys(LOG_EXIT_SYS, "copy: ", sa.s, " to: ", copy) ;
*/
} }
char n[strlen(name) + 1 + strlen(fname) + 1] ; /* The module has no knowledge of services outside of it,
* and the system has no knowledge of services inside the module.
* If a service frontend is not defined inside the module,
* consider it as a typical dependency of the module itself
* and not as part of the module. */
if (!out) {
auto_strings(n, name, ":", fname) ; char n[strlen(name) + 1 + strlen(fname) + 1] ;
if (!sastr_add_string(&list, n)) auto_strings(n, name, ":", fname) ;
log_die_nomem("stralloc") ;
if (!sastr_add_string(&list, n))
log_die_nomem("stralloc") ;
} else {
if (res->dependencies.ndepends) {
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) ;
res->dependencies.depends = resolve_add_string(wres, tmp) ;
} else {
parse_frontend(sa.s, ares, areslen, info, force, conf, copy, fname, name) ; res->dependencies.depends = resolve_add_string(wres, fname) ;
}
res->dependencies.ndepends++ ;
}
parse_frontend(sa.s, ares, areslen, info, force, conf, !out ? copy : 0, fname, !out ? name : 0) ;
} }
stralloc_free(&sa) ; stralloc_free(&sa) ;
...@@ -275,7 +319,7 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int ...@@ -275,7 +319,7 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int
log_die(LOG_EXIT_USER, "service: ", l + pos, " not available -- please make a bug report") ; log_die(LOG_EXIT_USER, "service: ", l + pos, " not available -- please make a bug report") ;
if (ares[aresid].dependencies.ndepends || ares[aresid].dependencies.nrequiredby) if (ares[aresid].dependencies.ndepends || ares[aresid].dependencies.nrequiredby)
convert_tomodule(&ares[aresid], name) ; parse_convert_tomodule(aresid, ares, *areslen, name) ;
if (ares[aresid].logger.want && ares[aresid].type == TYPE_CLASSIC) { if (ares[aresid].logger.want && ares[aresid].type == TYPE_CLASSIC) {
...@@ -292,8 +336,6 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int ...@@ -292,8 +336,6 @@ void parse_module(resolve_service_t *res, resolve_service_t *ares, unsigned int
} }
} }
wres = resolve_set_struct(DATA_SERVICE, res) ;
res->dependencies.contents = parse_compute_list(wres, &list, &res->dependencies.ncontents, 0) ; res->dependencies.contents = parse_compute_list(wres, &list, &res->dependencies.ncontents, 0) ;
free(wres) ; free(wres) ;
......
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