diff --git a/src/lib66/resolve.c b/src/lib66/resolve.c index aae4aca3bee2b348e30f880884351458bff6ea94..a575a752ae59e3be95325ddbdd39c85e533a0da9 100644 --- a/src/lib66/resolve.c +++ b/src/lib66/resolve.c @@ -35,6 +35,7 @@ #include <66/parser.h>//resolve need to find stralloc keep #include <66/resolve.h> #include <66/ssexec.h> +#include <66/graph.h> #include <s6/s6-supervise.h> #include <stdio.h> @@ -126,9 +127,7 @@ int ss_resolve_pointo(stralloc *sa,ssexec_t *info,unsigned int type, unsigned in if (where == SS_RESOLVE_LIVE) { if (!stralloc_catb(&tmp,info->live.s,info->live.len - 1) || - !stralloc_cats(&tmp,SS_RESOLVE) || - !stralloc_cats(&tmp,"/") || - !stralloc_cats(&tmp,ownerstr) || + !stralloc_cats(&tmp,SS_STATE) || !stralloc_cats(&tmp,"/") || !stralloc_cats(&tmp,info->treename.s)) goto err ; } @@ -353,6 +352,7 @@ int ss_resolve_pack(stralloc *sa, ss_resolve_t *res) !ss_resolve_add_uint32(sa,res->runat) || !ss_resolve_add_uint32(sa,res->tree) || !ss_resolve_add_uint32(sa,res->treename) || + !ss_resolve_add_uint32(sa,res->resolve) || !ss_resolve_add_uint32(sa,res->exec_run) || !ss_resolve_add_uint32(sa,res->exec_finish) || !ss_resolve_add_uint32(sa,res->type) || @@ -368,10 +368,11 @@ int ss_resolve_pack(stralloc *sa, ss_resolve_t *res) return 1 ; } -int ss_resolve_write(ss_resolve_t *res, char const *dst, char const *name) +int ss_resolve_write(ss_resolve_t *res, char const *dst, char const *name,int both) { stralloc sa = STRALLOC_ZERO ; + stralloc sasrc = STRALLOC_ZERO ; size_t dstlen = strlen(dst) ; size_t namelen = strlen(name) ; @@ -384,17 +385,26 @@ int ss_resolve_write(ss_resolve_t *res, char const *dst, char const *name) tmp[dstlen + SS_RESOLVE_LEN + 1 + namelen] = 0 ; if (!ss_resolve_pack(&sa,res)) goto err ; - if (dir_search(tmp,sa.s,S_IFREG)) + if (!openwritenclose_unsafe(tmp,sa.s,sa.len)) goto err ; + if (both) { - if (!ss_resolve_rmfile(res,dst,name)) goto err ; + /** write in src */ + if (!stralloc_cats(&sasrc,res->sa.s + res->tree)) goto err ; + if (!stralloc_cats(&sasrc,SS_SVDIRS)) goto err ; + if (!stralloc_cats(&sasrc,SS_RESOLVE)) goto err ; + if (!stralloc_cats(&sasrc,"/")) goto err ; + if (!stralloc_cats(&sasrc,name)) goto err ; + if (!stralloc_0(&sasrc)) goto err ; + if (!openwritenclose_unsafe(sasrc.s,sa.s,sa.len)) goto err ; } - if (!openwritenclose_unsafe(tmp,sa.s,sa.len)) goto err ; - + stralloc_free(&sa) ; + stralloc_free(&sasrc) ; return 1 ; err: stralloc_free(&sa) ; + stralloc_free(&sasrc) ; return 0 ; } @@ -445,6 +455,8 @@ int ss_resolve_read(ss_resolve_t *res, char const *src, char const *name) global += 4 ; uint32_unpack_big(sa.s + global,&res->treename) ; global += 4 ; + uint32_unpack_big(sa.s + global,&res->resolve) ; + global += 4 ; uint32_unpack_big(sa.s + global,&res->exec_run) ; global += 4 ; uint32_unpack_big(sa.s + global,&res->exec_finish) ; @@ -543,6 +555,7 @@ int ss_resolve_setlognwrite(ss_resolve_t *sv, char const *dst) //res.deps = ss_resolve_add_string(&res,string + sv->name) ; res.tree = ss_resolve_add_string(&res,string + sv->tree) ; res.treename = ss_resolve_add_string(&res,string + sv->treename) ; + res.resolve = ss_resolve_add_string(&res,string + sv->resolve) ; //res.ndeps = 1 ; res.type = sv->type ; ss_resolve_setflag(&res,SS_FLAGS_RELOAD,sv->reload) ; @@ -569,7 +582,7 @@ int ss_resolve_setlognwrite(ss_resolve_t *sv, char const *dst) ss_resolve_setflag(&res,SS_FLAGS_PID,(uint32_t)status.pid) ; } - if (!ss_resolve_write(&res,dst,res.sa.s + res.name)) + if (!ss_resolve_write(&res,dst,res.sa.s + res.name,SS_SIMPLE)) { strerr_warnwu5sys("write resolve file: ",dst,SS_RESOLVE,"/",res.sa.s + res.name) ; goto err ; @@ -590,6 +603,14 @@ int ss_resolve_setnwrite(ss_resolve_t *res, sv_alltype *services, ssexec_t *info char logreal[namelen + SS_LOG_SUFFIX_LEN + 1] ; char stmp[info->livetree.len + 1 + info->treename.len + SS_SVDIRS_LEN + 1 + namelen + SS_LOG_SUFFIX_LEN + 1] ; + size_t livelen = info->live.len - 1 ; + char resolve[livelen + SS_STATE_LEN + 1 + info->treename.len + 1] ; + memcpy(resolve,info->live.s,livelen) ; + memcpy(resolve + livelen, SS_STATE,SS_STATE_LEN) ; + resolve[livelen+ SS_STATE_LEN] = '/' ; + memcpy(resolve + livelen + SS_STATE_LEN + 1,info->treename.s,info->treename.len) ; + resolve[livelen + SS_STATE_LEN + 1 + info->treename.len] = 0 ; + s6_svstatus_t status = S6_SVSTATUS_ZERO ; @@ -602,6 +623,7 @@ int ss_resolve_setnwrite(ss_resolve_t *res, sv_alltype *services, ssexec_t *info res->tree = ss_resolve_add_string(res,info->tree.s) ; res->treename = ss_resolve_add_string(res,info->treename.s) ; res->live = ss_resolve_add_string(res,info->live.s) ; + res->resolve = ss_resolve_add_string(res,resolve) ; res->src = ss_resolve_add_string(res,keep.s + services->src) ; if (services->type.classic_longrun.run.exec) res->exec_run = ss_resolve_add_string(res,keep.s + services->type.classic_longrun.run.exec) ; @@ -755,7 +777,7 @@ int ss_resolve_setnwrite(ss_resolve_t *res, sv_alltype *services, ssexec_t *info if (!ss_resolve_setlognwrite(res,dst)) goto err ; } - if (!ss_resolve_write(res,dst,res->sa.s + res->name)) + if (!ss_resolve_write(res,dst,res->sa.s + res->name,SS_SIMPLE)) { strerr_warnwu5sys("write resolve file: ",dst,SS_RESOLVE,"/",res->sa.s + res->name) ; goto err ; @@ -790,7 +812,7 @@ int ss_resolve_addlogger(ssexec_t *info,genalloc *ga) stralloc tmp = STRALLOC_ZERO ; genalloc gatmp = GENALLOC_ZERO ; - if (!ss_resolve_pointo(&tmp,info,SS_NOTYPE,SS_RESOLVE_SRC)) + if (!ss_resolve_pointo(&tmp,info,SS_NOTYPE,SS_RESOLVE_LIVE)) goto err ; for (unsigned int i = 0 ; i < genalloc_len(ss_resolve_t,ga) ; i++) @@ -823,7 +845,7 @@ int ss_resolve_addlogger(ssexec_t *info,genalloc *ga) stralloc_free(&tmp) ; return 0 ; } - + void ss_resolve_setflag(ss_resolve_t *res,int flags,int flags_val) { switch (flags) @@ -839,7 +861,7 @@ void ss_resolve_setflag(ss_resolve_t *res,int flags,int flags_val) } } -int ss_resolve_deps(genalloc *tokeep,ss_resolve_t *res, ssexec_t *info) +int ss_resolve_add_deps(genalloc *tokeep,ss_resolve_t *res, ssexec_t *info) { unsigned int i = 0 ; genalloc tmp = GENALLOC_ZERO ; @@ -852,7 +874,7 @@ int ss_resolve_deps(genalloc *tokeep,ss_resolve_t *res, ssexec_t *info) char *name = res->sa.s + res->name ; char *deps = res->sa.s + res->deps ; if (!ss_resolve_cmp(tokeep,name)) - if (!genalloc_append(ss_resolve_t,tokeep,res)) return 0 ; + if (!genalloc_append(ss_resolve_t,tokeep,res)) goto err ; if (res->ndeps) { @@ -861,48 +883,57 @@ int ss_resolve_deps(genalloc *tokeep,ss_resolve_t *res, ssexec_t *info) { ss_resolve_t dres = RESOLVE_ZERO ; - if (!ss_resolve_check(info,gaistr(&tmp,i),SS_RESOLVE_SRC)) return 0 ; - if (!ss_resolve_read(&dres,src,gaistr(&tmp,i))) return 0 ; - if (dres.ndeps) ss_resolve_deps(tokeep,&dres,info) ; + if (!ss_resolve_check(info,gaistr(&tmp,i),SS_RESOLVE_LIVE)) goto err ; + if (!ss_resolve_read(&dres,src,gaistr(&tmp,i))) goto err ; + if (dres.ndeps) ss_resolve_add_deps(tokeep,&dres,info) ; if (!ss_resolve_cmp(tokeep,gaistr(&tmp,i))) - if (!genalloc_append(ss_resolve_t,tokeep,&dres)) return 0 ; + if (!genalloc_append(ss_resolve_t,tokeep,&dres)) goto err ; } } genalloc_deepfree(stralist,&tmp,stra_free) ; return 1 ; + err: + genalloc_deepfree(stralist,&tmp,stra_free) ; + return 0 ; } -int ss_resolve_rdeps(genalloc *tokeep,genalloc *nsv, ss_resolve_t *res,ssexec_t *info) +int ss_resolve_add_rdeps(genalloc *tokeep, ss_resolve_t *res,ssexec_t *info) { genalloc tmp = GENALLOC_ZERO ; + genalloc nsv = GENALLOC_ZERO ; + int type ; char *name = res->sa.s + res->name ; size_t srclen = strlen(res->sa.s + res->tree) ; char src[srclen + SS_SVDIRS_LEN + 1] ; memcpy(src,res->sa.s + res->tree,srclen) ; memcpy(src + srclen, SS_SVDIRS,SS_SVDIRS_LEN) ; src[srclen + SS_SVDIRS_LEN] = 0 ; + if (res->type == CLASSIC) type = 0 ; + else type = 1 ; + if (!graph_type_src(&nsv,src,type)) goto err ; if (!ss_resolve_cmp(tokeep,name)) - if (!genalloc_append(ss_resolve_t,tokeep,res)) return 0 ; - - for (unsigned int i = 0 ; i < genalloc_len(stralist,nsv) ; i++) + if (!genalloc_append(ss_resolve_t,tokeep,res)) goto err ; + + for (unsigned int i = 0 ; i < genalloc_len(stralist,&nsv) ; i++) { genalloc_deepfree(stralist,&tmp,stra_free) ; ss_resolve_t dres = RESOLVE_ZERO ; - char *dname = gaistr(nsv,i) ; + char *dname = gaistr(&nsv,i) ; if (obstr_equal(name,dname)) continue ; - if (!ss_resolve_check(info,dname,SS_RESOLVE_SRC)) return 0 ; - if (!ss_resolve_read(&dres,src,gaistr(nsv,i))) return 0 ; - if (dres.ndeps || (dres.type == BUNDLE && dres.ndeps)) + if (!ss_resolve_check(info,dname,SS_RESOLVE_LIVE)) goto err ; + if (!ss_resolve_read(&dres,src,gaistr(&nsv,i))) goto err ; + if (dres.ndeps || (dres.type == BUNDLE && dres.ndeps) || (res->type == BUNDLE && res->ndeps)) { - if (!clean_val(&tmp,dres.sa.s + dres.deps)) return 0 ; + if (!clean_val(&tmp,dres.sa.s + dres.deps)) goto err ; for (unsigned int j = 0 ; j < genalloc_len(stralist,&tmp) ; j++) { - if (obstr_equal(name,gaistr(&tmp,j))) + if (obstr_equal(name,gaistr(&tmp,j)) || res->type == BUNDLE) { if (!ss_resolve_cmp(tokeep,dname)) { - if (!genalloc_append(ss_resolve_t,tokeep,&dres)) return 0 ; + if (!genalloc_append(ss_resolve_t,tokeep,&dres)) goto err ; + if (!ss_resolve_add_rdeps(tokeep,&dres,info)) goto err ; break ; } } @@ -911,4 +942,7 @@ int ss_resolve_rdeps(genalloc *tokeep,genalloc *nsv, ss_resolve_t *res,ssexec_t } genalloc_deepfree(stralist,&tmp,stra_free) ; return 1 ; + err: + genalloc_deepfree(stralist,&tmp,stra_free) ; + return 0 ; }