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

ss_resolve_write now write on src and live if asked,fix...

ss_resolve_write now write on src and live if asked,fix ss_resolve_add_{deps,rdeps} function, add resolve field
parent ca832083
Branches
Tags
No related merge requests found
......@@ -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 ;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment