diff --git a/src/include/66/service.h b/src/include/66/service.h index 741c8a5217c4ca98c7622a36081488ccf36d7a2a..396479bd7352cf558a5cb5440adc88606f74ccee 100644 --- a/src/include/66/service.h +++ b/src/include/66/service.h @@ -53,7 +53,7 @@ enum visit_e } ; -#define SERVICE_STRUCT 0 +#define DATA_SERVICE 0 typedef struct resolve_service_s resolve_service_t, *resolve_service_t_ref ; struct resolve_service_s @@ -68,7 +68,8 @@ struct resolve_service_s uint32_t logreal ; uint32_t logassoc ; uint32_t dstlog ; - uint32_t deps ; // for module -> list of s6-rc service + uint32_t depends ; // for module -> list of s6-rc service + uint32_t requiredby ; uint32_t optsdeps ; //optional dependencies uint32_t extdeps ; //external dependencies uint32_t contents ; // module -> list of s6-rc and s6 service @@ -87,14 +88,15 @@ struct resolve_service_s uint32_t real_exec_finish ; uint32_t type ; - uint32_t ndeps ; + uint32_t ndepends ; + uint32_t nrequiredby ; uint32_t noptsdeps ; uint32_t nextdeps ; uint32_t ncontents ; uint32_t down ; uint32_t disen ;//disable->0,enable->1 } ; -#define RESOLVE_SERVICE_ZERO { 0,STRALLOC_ZERO,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } +#define RESOLVE_SERVICE_ZERO { 0,STRALLOC_ZERO,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } typedef enum resolve_service_enum_e resolve_service_enum_t, *resolve_service_enum_t_ref; enum resolve_service_enum_e @@ -106,7 +108,8 @@ enum resolve_service_enum_e SERVICE_ENUM_LOGREAL, SERVICE_ENUM_LOGASSOC, SERVICE_ENUM_DSTLOG, - SERVICE_ENUM_DEPS, + SERVICE_ENUM_DEPENDS, + SERVICE_ENUM_REQUIREDBY, SERVICE_ENUM_OPTSDEPS, SERVICE_ENUM_EXTDEPS, SERVICE_ENUM_CONTENTS, @@ -124,7 +127,8 @@ enum resolve_service_enum_e SERVICE_ENUM_EXEC_FINISH, SERVICE_ENUM_REAL_EXEC_FINISH, SERVICE_ENUM_TYPE, - SERVICE_ENUM_NDEPS, + SERVICE_ENUM_NDEPENDS, + SERVICE_ENUM_NREQUIREDBY, SERVICE_ENUM_NOPTSDEPS, SERVICE_ENUM_NEXTDEPS, SERVICE_ENUM_NCONTENTS, @@ -158,12 +162,13 @@ extern int service_intree(stralloc *svtree, char const *svname, char const *tree extern int service_read_cdb(cdb *c, resolve_service_t *res) ; extern int service_write_cdb(cdbmaker *c, resolve_service_t *sres) ; extern int service_resolve_copy(resolve_service_t *dst, resolve_service_t *res) ; -extern int service_resolve_sort_bytype(genalloc *gares, stralloc *list, char const *src) ; +extern int service_resolve_sort_bytype(stralloc *list, char const *src) ; extern int service_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const *dst) ; extern int service_resolve_setlognwrite(resolve_service_t *sv, char const *dst) ; +extern int service_resolve_create_master(char const *base, char const *treename) ; extern int service_resolve_write_master(ssexec_t *info, ss_resolve_graph_t *graph, char const *dir, unsigned int reverse) ; extern int service_resolve_modify_field(resolve_service_t *res, resolve_service_enum_t field, char const *data) ; -extern int service_resolve_field_to_sa(stralloc *sa, resolve_service_t *res, resolve_service_enum_t field) ; +extern int service_resolve_field_tosa(stralloc *sa, resolve_service_t *res, resolve_service_enum_t field) ; /** * * obsolete function @@ -176,7 +181,7 @@ extern int service_resolve_add_logger(genalloc *ga,char const *src) ; -/** Graph function */ +/** obsolete Graph function */ extern void ss_resolve_graph_ndeps_free(ss_resolve_graph_ndeps_t *graph) ; extern void ss_resolve_graph_free(ss_resolve_graph_t *graph) ; extern int ss_resolve_graph_src(ss_resolve_graph_t *graph, char const *dir, unsigned int reverse, unsigned int what) ; diff --git a/src/lib66/service.c b/src/lib66/service.c index de5b09e394d3234e2dd466a9d21160038b845222..8109da6408e0b17f1210ff978fa8106fd2fab2bb 100644 --- a/src/lib66/service.c +++ b/src/lib66/service.c @@ -51,7 +51,7 @@ int service_isenabled(char const *sv) stralloc sa = STRALLOC_ZERO ; resolve_service_t res = RESOLVE_SERVICE_ZERO ; - resolve_wrapper_t_ref wres = resolve_set_struct(SERVICE_STRUCT, &res) ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ; size_t newlen = 0, pos = 0 ; int e = -1 ; char const *exclude[3] = { SS_BACKUP + 1, SS_RESOLVE + 1, 0 } ; @@ -129,7 +129,7 @@ int service_isenabledat(stralloc *tree, char const *sv) stralloc sa = STRALLOC_ZERO ; resolve_service_t res = RESOLVE_SERVICE_ZERO ; - resolve_wrapper_t_ref wres = resolve_set_struct(SERVICE_STRUCT, &res) ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ; size_t newlen = 0, pos = 0 ; int e = -1 ; char const *exclude[3] = { SS_BACKUP + 1, SS_RESOLVE + 1, 0 } ; @@ -442,7 +442,8 @@ resolve_service_field_table_t resolve_service_field_table[] = { [SERVICE_ENUM_LOGREAL] = { .field = "logreal" }, [SERVICE_ENUM_LOGASSOC] = { .field = "logassoc" }, [SERVICE_ENUM_DSTLOG] = { .field = "dstlog" }, - [SERVICE_ENUM_DEPS] = { .field = "deps" }, + [SERVICE_ENUM_DEPENDS] = { .field = "depends" }, + [SERVICE_ENUM_REQUIREDBY] = { .field = "requiredby" }, [SERVICE_ENUM_OPTSDEPS] = { .field = "optsdeps" }, [SERVICE_ENUM_EXTDEPS] = { .field = "extdeps" }, [SERVICE_ENUM_CONTENTS] = { .field = "contents" }, @@ -460,7 +461,8 @@ resolve_service_field_table_t resolve_service_field_table[] = { [SERVICE_ENUM_EXEC_FINISH] = { .field = "exec_finish" }, [SERVICE_ENUM_REAL_EXEC_FINISH] = { .field = "real_exec_finish" }, [SERVICE_ENUM_TYPE] = { .field = "type" }, - [SERVICE_ENUM_NDEPS] = { .field = "ndeps" }, + [SERVICE_ENUM_NDEPENDS] = { .field = "ndepends" }, + [SERVICE_ENUM_NREQUIREDBY] = { .field = "nrequiredby" }, [SERVICE_ENUM_NOPTSDEPS] = { .field = "noptsdeps" }, [SERVICE_ENUM_NEXTDEPS] = { .field = "nextdeps" }, [SERVICE_ENUM_NCONTENTS] = { .field = "ncontents" }, @@ -477,7 +479,7 @@ int service_read_cdb(cdb *c, resolve_service_t *res) resolve_wrapper_t_ref wres ; uint32_t x ; - wres = resolve_set_struct(SERVICE_STRUCT, res) ; + wres = resolve_set_struct(DATA_SERVICE, res) ; /* name */ resolve_find_cdb(&tmp,c,"name") ; @@ -507,9 +509,13 @@ int service_read_cdb(cdb *c, resolve_service_t *res) resolve_find_cdb(&tmp,c,"dstlog") ; res->dstlog = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; - /* deps */ - resolve_find_cdb(&tmp,c,"deps") ; - res->deps = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; + /* depends */ + resolve_find_cdb(&tmp,c,"depends") ; + res->depends = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; + + /* requiredby */ + resolve_find_cdb(&tmp,c,"requiredby") ; + res->requiredby = tmp.len ? resolve_add_string(wres,tmp.s) : 0 ; /* optsdeps */ resolve_find_cdb(&tmp,c,"optsdeps") ; @@ -579,9 +585,13 @@ int service_read_cdb(cdb *c, resolve_service_t *res) x = resolve_find_cdb(&tmp,c,"type") ; res->type = x ; - /* ndeps */ - x = resolve_find_cdb(&tmp,c,"ndeps") ; - res->ndeps = x ; + /* ndepends */ + x = resolve_find_cdb(&tmp,c,"ndepends") ; + res->ndepends = x ; + + /* nrequiredby */ + x = resolve_find_cdb(&tmp,c,"nrequiredby") ; + res->nrequiredby = x ; /* noptsdeps */ x = resolve_find_cdb(&tmp,c,"noptsdeps") ; @@ -637,8 +647,11 @@ int service_write_cdb(cdbmaker *c, resolve_service_t *sres) /* dstlog */ !resolve_add_cdb(c,"dstlog",str + sres->dstlog) || + /* depends */ + !resolve_add_cdb(c,"depends",str + sres->depends) || + /* deps */ - !resolve_add_cdb(c,"deps",str + sres->deps) || + !resolve_add_cdb(c,"requiredby",str + sres->requiredby) || /* optsdeps */ !resolve_add_cdb(c,"optsdeps",str + sres->optsdeps) || @@ -694,8 +707,11 @@ int service_write_cdb(cdbmaker *c, resolve_service_t *sres) /* type */ !resolve_add_cdb_uint(c,"type",sres->type) || + /* ndepends */ + !resolve_add_cdb_uint(c,"ndepends",sres->ndepends) || + /* ndeps */ - !resolve_add_cdb_uint(c,"ndeps",sres->ndeps) || + !resolve_add_cdb_uint(c,"ndeps",sres->nrequiredby) || /* noptsdeps */ !resolve_add_cdb_uint(c,"noptsdeps",sres->noptsdeps) || @@ -735,7 +751,8 @@ int service_resolve_copy(resolve_service_t *dst, resolve_service_t *res) dst->logreal = res->logreal ; dst->logassoc = res->logassoc ; dst->dstlog = res->dstlog ; - dst->deps = res->deps ; + dst->depends = res->depends ; + dst->requiredby = res->requiredby ; dst->optsdeps = res->optsdeps ; dst->extdeps = res->extdeps ; dst->contents = res->contents ; @@ -753,7 +770,8 @@ int service_resolve_copy(resolve_service_t *dst, resolve_service_t *res) dst->exec_finish = res->exec_finish ; dst->real_exec_finish = res->real_exec_finish ; dst->type = res->type ; - dst->ndeps = res->ndeps ; + dst->ndepends = res->ndepends ; + dst->nrequiredby = res->nrequiredby ; dst->noptsdeps = res->noptsdeps ; dst->nextdeps = res->nextdeps ; dst->ncontents = res->ncontents ; @@ -763,49 +781,51 @@ int service_resolve_copy(resolve_service_t *dst, resolve_service_t *res) return 1 ; } -int service_resolve_sort_bytype(genalloc *gares, stralloc *list, char const *src) +int service_resolve_sort_bytype(stralloc *list, char const *src) { log_flow() ; - size_t pos = 0 ; + size_t pos = 0, len = list->len ; int e = 0 ; + char tmp[len + 1] ; + + sastr_to_char(tmp, list) ; + resolve_service_t res = RESOLVE_SERVICE_ZERO ; - resolve_wrapper_t_ref wres = resolve_set_struct(SERVICE_STRUCT, &res) ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ; size_t classic_list = 0, module_list = 0 ; - FOREACH_SASTR(list, pos) { + list->len = 0 ; - char *name = list->s + pos ; + for (; pos < len ; pos += strlen(tmp + pos) + 1) { - resolve_service_t cp = RESOLVE_SERVICE_ZERO ; + size_t nlen = strlen(tmp + pos) + 1 ; + char *name = tmp + pos ; if (!resolve_read(wres, src, name)) log_warnu_return(LOG_EXIT_ZERO,"read resolve file of: ", src, name) ; - if (!service_resolve_copy(&cp, &res)) - goto err ; - switch (res.type) { case TYPE_CLASSIC: - if (!genalloc_insertb(resolve_service_t, gares, 0, &cp, 1)) + if (!stralloc_insertb(list, 0, name, strlen(name) + 1)) goto err ; - classic_list++ ; + classic_list += nlen ; module_list = classic_list ; break ; case TYPE_MODULE: - if (!genalloc_insertb(resolve_service_t, gares, classic_list, &cp, 1)) + if (!stralloc_insertb(list, classic_list, name, strlen(name) + 1)) goto err ; - module_list++ ; + module_list += nlen ; break ; @@ -813,7 +833,7 @@ int service_resolve_sort_bytype(genalloc *gares, stralloc *list, char const *src case TYPE_LONGRUN: case TYPE_ONESHOT: - if (!genalloc_insertb(resolve_service_t, gares, module_list, &cp, 1)) + if (!stralloc_insertb(list, module_list, name, strlen(name) + 1)) goto err ; break ; @@ -918,7 +938,7 @@ int service_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const * ss_state_t sta = STATE_ZERO ; resolve_service_t res = RESOLVE_SERVICE_ZERO ; - resolve_wrapper_t_ref wres = resolve_set_struct(SERVICE_STRUCT, &res) ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ; resolve_init(wres) ; @@ -975,7 +995,7 @@ int service_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const * } } - res.ndeps = services->cname.nga ; + res.ndepends = services->cname.nga ; res.noptsdeps = services->cname.nopts ; res.nextdeps = services->cname.next ; res.ncontents = services->cname.ncontents ; @@ -1023,9 +1043,9 @@ int service_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const * } } - if (res.ndeps) + if (res.ndepends) { - id = services->cname.idga, nid = res.ndeps ; + id = services->cname.idga, nid = res.ndepends ; for (;nid; id += strlen(deps.s + id) + 1, nid--) { if (!stralloc_catb(&ndeps,deps.s + id,strlen(deps.s + id)) || @@ -1041,7 +1061,7 @@ int service_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const * goto err ; } - res.deps = resolve_add_string(wres,ndeps.s) ; + res.depends = resolve_add_string(wres,ndeps.s) ; } if (res.noptsdeps) @@ -1162,15 +1182,15 @@ int service_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const * goto err ; } - res.deps = resolve_add_string(wres,ndeps.s) ; + res.depends = resolve_add_string(wres,ndeps.s) ; if (res.type == TYPE_CLASSIC) { - res.ndeps = 1 ; + res.ndepends = 1 ; } else if (res.type == TYPE_LONGRUN) { - res.ndeps += 1 ; + res.ndepends += 1 ; } if (services->type.classic_longrun.log.run.exec >= 0) @@ -1210,7 +1230,7 @@ int service_resolve_setlognwrite(resolve_service_t *sv, char const *dst) ss_state_t sta = STATE_ZERO ; resolve_service_t res = RESOLVE_SERVICE_ZERO ; - resolve_wrapper_t_ref wres = resolve_set_struct(SERVICE_STRUCT, &res) ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ; resolve_init(wres) ; @@ -1232,7 +1252,7 @@ int service_resolve_setlognwrite(resolve_service_t *sv, char const *dst) res.type = sv->type ; res.name = resolve_add_string(wres,str + sv->logger) ; - res.description = resolve_add_string(wres,descrip) ; + res.description = resolve_add_string(wres,str + sv->description) ; res.version = resolve_add_string(wres,str + sv->version) ; res.logreal = resolve_add_string(wres,str + sv->logreal) ; res.logassoc = resolve_add_string(wres,str + sv->name) ; @@ -1291,7 +1311,7 @@ int service_resolve_modify_field(resolve_service_t *res, resolve_service_enum_t uint32_t ifield ; int e = 0 ; - resolve_wrapper_t_ref wres = resolve_set_struct(SERVICE_STRUCT, res) ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, res) ; switch(field) { @@ -1323,8 +1343,12 @@ int service_resolve_modify_field(resolve_service_t *res, resolve_service_enum_t res->dstlog = resolve_add_string(wres,data) ; break ; - case SERVICE_ENUM_DEPS: - res->deps = resolve_add_string(wres,data) ; + case SERVICE_ENUM_DEPENDS: + res->depends = resolve_add_string(wres,data) ; + break ; + + case SERVICE_ENUM_REQUIREDBY: + res->requiredby = resolve_add_string(wres,data) ; break ; case SERVICE_ENUM_OPTSDEPS: @@ -1396,9 +1420,14 @@ int service_resolve_modify_field(resolve_service_t *res, resolve_service_enum_t res->type = ifield ; break ; - case SERVICE_ENUM_NDEPS: + case SERVICE_ENUM_NDEPENDS: + if (!uint0_scan(data, &ifield)) goto err ; + res->ndepends = ifield ; + break ; + + case SERVICE_ENUM_NREQUIREDBY: if (!uint0_scan(data, &ifield)) goto err ; - res->ndeps = ifield ; + res->nrequiredby = ifield ; break ; case SERVICE_ENUM_NOPTSDEPS: @@ -1474,8 +1503,12 @@ int service_resolve_field_to_sa(stralloc *sa, resolve_service_t *res, resolve_se ifield = res->dstlog ; break ; - case SERVICE_ENUM_DEPS: - ifield = res->deps ; + case SERVICE_ENUM_DEPENDS: + ifield = res->depends ; + break ; + + case SERVICE_ENUM_REQUIREDBY: + ifield = res->requiredby ; break ; case SERVICE_ENUM_OPTSDEPS: @@ -1546,8 +1579,12 @@ int service_resolve_field_to_sa(stralloc *sa, resolve_service_t *res, resolve_se ifield = res->type ; break ; - case SERVICE_ENUM_NDEPS: - ifield = res->ndeps ; + case SERVICE_ENUM_NDEPENDS: + ifield = res->ndepends ; + break ; + + case SERVICE_ENUM_NREQUIREDBY: + ifield = res->nrequiredby ; break ; case SERVICE_ENUM_NOPTSDEPS: @@ -1587,28 +1624,28 @@ int service_resolve_add_deps(genalloc *tokeep, resolve_service_t *res, char cons int e = 0 ; size_t pos = 0 ; stralloc tmp = STRALLOC_ZERO ; - resolve_wrapper_t_ref wres = resolve_set_struct(SERVICE_STRUCT, res) ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, res) ; char *name = res->sa.s + res->name ; - char *deps = res->sa.s + res->deps ; - if (!resolve_cmp(tokeep, name, SERVICE_STRUCT) && (!obstr_equal(name,SS_MASTER+1))) + char *deps = res->sa.s + res->depends ; + if (!resolve_cmp(tokeep, name, DATA_SERVICE) && (!obstr_equal(name,SS_MASTER+1))) if (!resolve_append(tokeep,wres)) goto err ; - if (res->ndeps) + if (res->ndepends) { if (!sastr_clean_string(&tmp,deps)) return 0 ; for (;pos < tmp.len ; pos += strlen(tmp.s + pos) + 1) { resolve_service_t dres = RESOLVE_SERVICE_ZERO ; - resolve_wrapper_t_ref dwres = resolve_set_struct(SERVICE_STRUCT, &dres) ; + resolve_wrapper_t_ref dwres = resolve_set_struct(DATA_SERVICE, &dres) ; char *dname = tmp.s + pos ; if (!resolve_check(src,dname)) goto err ; if (!resolve_read(dwres,src,dname)) goto err ; - if (dres.ndeps && !resolve_cmp(tokeep, dname, SERVICE_STRUCT)) + if (dres.ndepends && !resolve_cmp(tokeep, dname, DATA_SERVICE)) { if (!service_resolve_add_deps(tokeep,&dres,src)) goto err ; } - if (!resolve_cmp(tokeep, dname, SERVICE_STRUCT)) + if (!resolve_cmp(tokeep, dname, DATA_SERVICE)) { if (!resolve_append(tokeep,dwres)) goto err ; } @@ -1632,7 +1669,7 @@ int service_resolve_add_rdeps(genalloc *tokeep, resolve_service_t *res, char con stralloc tmp = STRALLOC_ZERO ; stralloc nsv = STRALLOC_ZERO ; ss_state_t sta = STATE_ZERO ; - resolve_wrapper_t_ref wres = resolve_set_struct(SERVICE_STRUCT, res) ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, res) ; char const *exclude[2] = { SS_MASTER + 1, 0 } ; char *name = res->sa.s + res->name ; @@ -1647,23 +1684,23 @@ int service_resolve_add_rdeps(genalloc *tokeep, resolve_service_t *res, char con if (!sastr_dir_get(&nsv,s,exclude,S_IFREG)) goto err ; - if (!resolve_cmp(tokeep, name, SERVICE_STRUCT) && (!obstr_equal(name,SS_MASTER+1))) + if (!resolve_cmp(tokeep, name, DATA_SERVICE) && (!obstr_equal(name,SS_MASTER+1))) { if (!resolve_append(tokeep,wres)) goto err ; } - if ((res->type == TYPE_BUNDLE || res->type == TYPE_MODULE) && res->ndeps) + if ((res->type == TYPE_BUNDLE || res->type == TYPE_MODULE) && res->ndepends) { - uint32_t deps = res->type == TYPE_MODULE ? res->contents : res->deps ; + uint32_t deps = res->type == TYPE_MODULE ? res->contents : res->depends ; if (!sastr_clean_string(&tmp,res->sa.s + deps)) goto err ; resolve_service_t dres = RESOLVE_SERVICE_ZERO ; - resolve_wrapper_t_ref dwres = resolve_set_struct(SERVICE_STRUCT, &dres) ; + resolve_wrapper_t_ref dwres = resolve_set_struct(DATA_SERVICE, &dres) ; for (; a < tmp.len ; a += strlen(tmp.s + a) + 1) { char *name = tmp.s + a ; if (!resolve_check(src,name)) goto err ; if (!resolve_read(dwres,src,name)) goto err ; if (dres.type == TYPE_CLASSIC) continue ; - if (!resolve_cmp(tokeep, name, SERVICE_STRUCT)) + if (!resolve_cmp(tokeep, name, DATA_SERVICE)) { if (!resolve_append(tokeep,dwres)) goto err ; if (!service_resolve_add_rdeps(tokeep,&dres,src)) goto err ; @@ -1676,7 +1713,7 @@ int service_resolve_add_rdeps(genalloc *tokeep, resolve_service_t *res, char con int dtype = 0 ; tmp.len = 0 ; resolve_service_t dres = RESOLVE_SERVICE_ZERO ; - resolve_wrapper_t_ref dwres = resolve_set_struct(SERVICE_STRUCT, &dres) ; + resolve_wrapper_t_ref dwres = resolve_set_struct(DATA_SERVICE, &dres) ; char *dname = nsv.s + b ; if (obstr_equal(name,dname)) { resolve_free(wres) ; continue ; } if (!resolve_check(src,dname)) goto err ; @@ -1691,13 +1728,13 @@ int service_resolve_add_rdeps(genalloc *tokeep, resolve_service_t *res, char con if (dtype != type || (!dres.disen && !sta.unsupervise)){ resolve_free(dwres) ; continue ; } } else if (dtype != type || (!dres.disen)){ resolve_free(dwres) ; continue ; } - if (dres.type == TYPE_BUNDLE && !dres.ndeps){ resolve_free(dwres) ; continue ; } + if (dres.type == TYPE_BUNDLE && !dres.ndepends){ resolve_free(dwres) ; continue ; } - if (!resolve_cmp(tokeep, dname, SERVICE_STRUCT)) + if (!resolve_cmp(tokeep, dname, DATA_SERVICE)) { - if (dres.ndeps)// || (dres.type == TYPE_BUNDLE && dres.ndeps) || ) + if (dres.ndepends)// || (dres.type == TYPE_BUNDLE && dres.ndepends) || ) { - if (!sastr_clean_string(&tmp,dres.sa.s + dres.deps)) goto err ; + if (!sastr_clean_string(&tmp,dres.sa.s + dres.depends)) goto err ; /** we must check every service inside the module to not add as * rdeps a service declared inside the module. * eg. @@ -1743,14 +1780,14 @@ int service_resolve_add_logger(genalloc *ga,char const *src) for (; i < genalloc_len(resolve_service_t,ga) ; i++) { resolve_service_t res = RESOLVE_SERVICE_ZERO ; - resolve_wrapper_t_ref wres = resolve_set_struct(SERVICE_STRUCT, &res) ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ; resolve_service_t dres = RESOLVE_SERVICE_ZERO ; - resolve_wrapper_t_ref dwres = resolve_set_struct(SERVICE_STRUCT, &dres) ; + resolve_wrapper_t_ref dwres = resolve_set_struct(DATA_SERVICE, &dres) ; if (!service_resolve_copy(&res,&genalloc_s(resolve_service_t,ga)[i])) goto err ; char *string = res.sa.s ; char *name = string + res.name ; - if (!resolve_cmp(&gatmp, name, SERVICE_STRUCT)) + if (!resolve_cmp(&gatmp, name, DATA_SERVICE)) { if (!resolve_append(&gatmp,wres)) goto err ; @@ -1760,21 +1797,53 @@ int service_resolve_add_logger(genalloc *ga,char const *src) if (!resolve_check(src,string + res.logger)) goto err ; if (!resolve_read(dwres,src,string + res.logger)) goto err ; - if (!resolve_cmp(&gatmp, string + res.logger, SERVICE_STRUCT)) + if (!resolve_cmp(&gatmp, string + res.logger, DATA_SERVICE)) if (!resolve_append(&gatmp,dwres)) goto err ; } } resolve_free(wres) ; resolve_free(dwres) ; } - resolve_deep_free(SERVICE_STRUCT, ga) ; + resolve_deep_free(DATA_SERVICE, ga) ; if (!genalloc_copy(resolve_service_t,ga,&gatmp)) goto err ; e = 1 ; err: genalloc_free(resolve_service_t,&gatmp) ; - resolve_deep_free(SERVICE_STRUCT, &gatmp) ; + resolve_deep_free(DATA_SERVICE, &gatmp) ; + return e ; +} + +int service_resolve_create_master(char const *base, char const *treename) +{ + int e = 0 ; + size_t baselen = strlen(base), treelen = strlen(treename) ; + resolve_service_t res = RESOLVE_SERVICE_ZERO ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ; + char dst[baselen + SS_SYSTEM_LEN + 1 + treelen + SS_SVDIRS_LEN + 1] ; + + auto_strings(dst, base, SS_SYSTEM, "/", treename) ; + + resolve_init(wres) ; + + res.name = resolve_add_string(wres, SS_MASTER + 1) ; + res.description = resolve_add_string(wres, "inner bundle - do not use it") ; + res.tree = resolve_add_string(wres, dst) ; + res.treename = resolve_add_string(wres, treename) ; + res.type = TYPE_BUNDLE ; + res.disen = 1 ; + + auto_strings(dst + baselen + SS_SYSTEM_LEN + 1 + treelen, SS_SVDIRS) ; + + log_trace("write resolve file of inner bundle") ; + if (!resolve_write(wres, dst, SS_MASTER + 1)) + goto err ; + + e = 1 ; + + err: + resolve_free(wres) ; return e ; } @@ -1792,7 +1861,7 @@ int service_resolve_write_master(ssexec_t *info, ss_resolve_graph_t *graph,char stralloc inres = STRALLOC_ZERO ; stralloc gain = STRALLOC_ZERO ; resolve_service_t res = RESOLVE_SERVICE_ZERO ; - resolve_wrapper_t_ref wres = resolve_set_struct(SERVICE_STRUCT, &res) ; + resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, &res) ; size_t dirlen = strlen(dir) ; @@ -1853,8 +1922,8 @@ int service_resolve_write_master(ssexec_t *info, ss_resolve_graph_t *graph,char res.tree = resolve_add_string(wres,info->tree.s) ; res.live = resolve_add_string(wres,info->live.s) ; res.type = TYPE_BUNDLE ; - res.deps = resolve_add_string(wres,inres.s) ; - res.ndeps = genalloc_len(resolve_service_t,&graph->sorted) ; + res.depends = resolve_add_string(wres,inres.s) ; + res.ndepends = genalloc_len(resolve_service_t,&graph->sorted) ; res.runat = resolve_add_string(wres,runat) ; res.state = resolve_add_string(wres,state) ;