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

rewrite rc_init

parent fbd878af
No related branches found
No related tags found
No related merge requests found
......@@ -19,7 +19,7 @@
#include <skalibs/genalloc.h>
extern int rc_init(ssexec_t *info, genalloc *ga, char const *const *envp) ;
extern int rc_init(ssexec_t *info, char const *const *envp) ;
extern int rc_send(ssexec_t *info,genalloc *ga,char const *sig,char const *const *envp) ;
extern int rc_unsupervise(ssexec_t *info, genalloc *ga,char const *sig,char const *const *envp) ;
......
......@@ -18,6 +18,7 @@
#include <stdlib.h>
#include <oblibs/error2.h>
#include <oblibs/string.h>
#include <skalibs/genalloc.h>
#include <skalibs/djbunix.h>
......@@ -29,41 +30,60 @@
#include <s6-rc/config.h>
int rc_init(ssexec_t *info,genalloc *ga, char const *const *envp)
/**@Return 1 on success
* @Return 2 on empty database
* @Return 0 on fail */
int rc_init(ssexec_t *info, char const *const *envp)
{
int writein,wstat ;
int writein, wstat, empty = 0 ;
pid_t pid ;
stralloc src = STRALLOC_ZERO ;
stralloc sares = STRALLOC_ZERO ;
ss_resolve_t res = RESOLVE_ZERO ;
genalloc gasvc = GENALLOC_ZERO ; //stralist type
genalloc gares = GENALLOC_ZERO ; //ss_resolve_t type
if (!access(info->tree.s,W_OK)) writein = SS_DOUBLE ;
else writein = SS_SIMPLE ;
char svdir[info->tree.len + SS_SVDIRS_LEN + SS_DB_LEN + 1 + info->treename.len + 1] ;
char ltree[info->livetree.len + 1 + info->treename.len + 1] ;
char prefix[info->treename.len + 1 + 1] ;
char tt[UINT32_FMT] ;
char const *newargv[12] ;
unsigned int m = 0 ;
if (!ss_resolve_pointo(&sares,info,SS_NOTYPE,SS_RESOLVE_SRC))
{ VERBO1 strerr_warnwu1x("set revolve pointer to source") ; goto err ; }
if (!ss_resolve_check(sares.s,SS_MASTER +1)) { VERBO1 strerr_warnwu1x("find inner bundle -- please make a bug report") ; goto err ; }
if (!ss_resolve_read(&res,sares.s,SS_MASTER + 1)) { VERBO1 strerr_warnwu1sys("read resolve file of inner bundle") ; goto err ; }
if (!res.ndeps)
{
VERBO1 strerr_warni2x("Initialization aborted -- no atomic services into tree: ",info->treename.s) ;
empty = 1 ;
goto end ;
}
if (!ss_resolve_create_live(info)) { VERBO1 strerr_warnwu1sys("create live state") ; goto err ; }
memcpy(svdir,info->tree.s,info->tree.len) ;
memcpy(svdir + info->tree.len ,SS_SVDIRS ,SS_SVDIRS_LEN) ;
memcpy(svdir + info->tree.len + SS_SVDIRS_LEN,SS_DB,SS_DB_LEN) ;
memcpy(svdir + info->tree.len + SS_SVDIRS_LEN + SS_DB_LEN, "/", 1) ;
memcpy(svdir + info->tree.len + SS_SVDIRS_LEN + SS_DB_LEN + 1, info->treename.s,info->treename.len) ;
svdir[info->tree.len + SS_SVDIRS_LEN + SS_DB_LEN + 1 + info->treename.len] = 0 ;
char ltree[info->livetree.len + 1 + info->treename.len + 1] ;
memcpy(ltree,info->livetree.s,info->livetree.len) ;
ltree[info->livetree.len] = '/' ;
memcpy(ltree + info->livetree.len + 1, info->treename.s, info->treename.len) ;
ltree[info->livetree.len + 1 + info->treename.len] = 0 ;
char prefix[info->treename.len + 1 + 1] ;
memcpy(prefix,info->treename.s,info->treename.len) ;
memcpy(prefix + info->treename.len, "-",1) ;
prefix[info->treename.len + 1] = 0 ;
char tt[UINT32_FMT] ;
tt[uint32_fmt(tt,info->timeout)] = 0 ;
char const *newargv[12] ;
unsigned int m = 0 ;
newargv[m++] = S6RC_BINPREFIX "s6-rc-init" ;
newargv[m++] = "-l" ;
newargv[m++] = ltree ;
......@@ -83,30 +103,51 @@ int rc_init(ssexec_t *info,genalloc *ga, char const *const *envp)
if (waitpid_nointr(pid,&wstat, 0) < 0)
{ strerr_warnwu2sys("wait for ",newargv[0]) ; goto err ; }
if (wstat) { strerr_warnwu2x("init db of tree: ",info->treename.s) ; goto err ; }
if (wstat) { VERBO1 strerr_warnwu2x("init db of tree: ",info->treename.s) ; goto err ; }
if (!clean_val(&gasvc,res.sa.s + res.deps)) { VERBO1 strerr_warnwu1sys("clean dependencies of inner bundle") ; goto err ; }
if (!ss_resolve_pointo(&src,info,SS_NOTYPE,SS_RESOLVE_LIVE))
{ strerr_warnwu1x("set revolve pointer to live") ; goto err ; }
if (!ss_resolve_pointo(&sares,info,SS_NOTYPE,SS_RESOLVE_LIVE))
{ VERBO1 strerr_warnwu1x("set revolve pointer to live") ; goto err ; }
for (unsigned int i = 0 ; i < genalloc_len(ss_resolve_t,ga) ; i++)
for (unsigned int i = 0 ; i < genalloc_len(stralist,&gasvc) ; i++)
{
char *name = gaistr(&gasvc,i) ;
ss_resolve_t tmp = RESOLVE_ZERO ;
if (!ss_resolve_check(sares.s,name)){ VERBO1 strerr_warnw2sys("unknow service: ",name) ; goto err ; }
if (!ss_resolve_read(&tmp,sares.s,name)) { VERBO1 strerr_warnwu2sys("read resolve file of: ",name) ; goto err ; }
if (!ss_resolve_add_deps(&gares,&tmp,sares.s)) { VERBO1 strerr_warnwu2sys("resolve dependencies of: ",name) ; goto err ; }
ss_resolve_free(&tmp) ;
}
for (unsigned int i = 0 ; i < genalloc_len(ss_resolve_t,&gares) ; i++)
{
char const *string = genalloc_s(ss_resolve_t,ga)[i].sa.s ;
char const *name = string + genalloc_s(ss_resolve_t,ga)[i].name ;
ss_resolve_setflag(&genalloc_s(ss_resolve_t,ga)[i],SS_FLAGS_INIT,SS_FLAGS_FALSE) ;
char const *string = genalloc_s(ss_resolve_t,&gares)[i].sa.s ;
char const *name = string + genalloc_s(ss_resolve_t,&gares)[i].name ;
if (obstr_equal(name,SS_MASTER+1)) continue ;
ss_resolve_setflag(&genalloc_s(ss_resolve_t,&gares)[i],SS_FLAGS_INIT,SS_FLAGS_FALSE) ;
ss_resolve_setflag(&genalloc_s(ss_resolve_t,&gares)[i],SS_FLAGS_RUN,SS_FLAGS_TRUE) ;
VERBO2 strerr_warni2x("Write resolve file of: ",name) ;
if (!ss_resolve_write(&genalloc_s(ss_resolve_t,ga)[i],src.s,name,writein))
{ VERBO1 strerr_diefu2sys(111,"write resolve file of: ",name) ; goto err ; }
if (!ss_resolve_write(&genalloc_s(ss_resolve_t,&gares)[i],sares.s,name,writein))
{ VERBO1 strerr_warnwu2sys("write resolve file of: ",name) ; goto err ; }
VERBO1 strerr_warni2x("Initiated successfully: ",name) ;
VERBO1 strerr_warni2x("Initialized successfully: ",name) ;
}
VERBO2 strerr_warnt2x("reload scandir: ",info->scandir.s) ;
if (scandir_send_signal(info->scandir.s,"an") <= 0) goto err ;
stralloc_free(&src) ;
return 1 ;
end:
genalloc_deepfree(ss_resolve_t,&gares,ss_resolve_free) ;
genalloc_deepfree(stralist,&gasvc,stra_free) ;
ss_resolve_free(&res) ;
stralloc_free(&sares) ;
return empty ? 2 : 1 ;
err:
stralloc_free(&src) ;
genalloc_deepfree(ss_resolve_t,&gares,ss_resolve_free) ;
genalloc_deepfree(stralist,&gasvc,stra_free) ;
ss_resolve_free(&res) ;
stralloc_free(&sares) ;
return 0 ;
}
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