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

be clean with heap memory

parent 3f639687
No related branches found
No related tags found
No related merge requests found
......@@ -57,7 +57,7 @@
static unsigned int RELOAD = 0 ;
static unsigned int DEADLINE = 0 ;
static char *SIG = "-U" ;
static stralloc sares = STRALLOC_ZERO ;
static genalloc nclassic = GENALLOC_ZERO ; //resolve_t type
static genalloc nrc = GENALLOC_ZERO ; //resolve_t type
......@@ -74,38 +74,36 @@ int svc_start(ssexec_t *info,genalloc *ga,char const *const *envp)
int svc_sanitize(ssexec_t *info,genalloc *ga, char const *const *envp)
{
unsigned int i = 0 ;
stralloc sares = STRALLOC_ZERO ;
genalloc toreload = GENALLOC_ZERO ; //ss_resolve_t
genalloc toinit = GENALLOC_ZERO ; //ss_resolve_t
ss_resolve_t_ref pres ;
for (unsigned int i = 0; i < genalloc_len(ss_resolve_t,ga) ; i++)
for (; i < genalloc_len(ss_resolve_t,ga) ; i++)
{
pres = &genalloc_s(ss_resolve_t,ga)[i] ;
char *name = pres->sa.s + pres->name ;
if (pres->reload)
ss_resolve_t cp = RESOLVE_ZERO ;
if (!ss_resolve_copy(&cp,&genalloc_s(ss_resolve_t,ga)[i]))
{
VERBO1 strerr_warnwu1sys("copy resolve file") ;
goto err ;
}
char *name = cp.sa.s + cp.name ;
if (cp.reload)
{
if (!genalloc_append(ss_resolve_t,&toreload,pres))
{
VERBO1 strerr_warnwu3x("add: ",name," on genalloc") ;
goto err ;
}
if (!ss_resolve_append(&toreload,&cp)) goto err ;
}
else if (pres->init)
else if (cp.init)
{
if (!genalloc_append(ss_resolve_t,&toinit,pres))
{
VERBO1 strerr_warnwu3x("add: ",name," on genalloc") ;
goto err ;
}
if (!ss_resolve_append(&toinit,&cp)) goto err ;
}
ss_resolve_free(&cp) ;
}
if (genalloc_len(ss_resolve_t,&toreload))
{
if (!svc_unsupervise(info,&toreload,"-D",envp)) goto err ;
genalloc_cat(ss_resolve_t,&toinit,&toreload) ;
if (!genalloc_cat(ss_resolve_t,&toinit,&toreload)) goto err ;
}
if (!ss_resolve_pointo(&sares,info,CLASSIC,SS_RESOLVE_SRC))
{
......@@ -116,27 +114,28 @@ int svc_sanitize(ssexec_t *info,genalloc *ga, char const *const *envp)
{
if (!svc_init(info,sares.s,&toinit))
{
VERBO1 strerr_warnwu1x("iniatiate svc service list") ;
VERBO1 strerr_warnwu1x("iniatiate service list") ;
goto err ;
}
}
stralloc_free(&sares) ;
genalloc_free(ss_resolve_t,&toreload) ;
genalloc_free(ss_resolve_t,&toinit) ;
genalloc_deepfree(ss_resolve_t,&toinit,ss_resolve_free) ;
return 1 ;
err:
stralloc_free(&sares) ;
genalloc_free(ss_resolve_t,&toreload) ;
genalloc_free(ss_resolve_t,&toinit) ;
genalloc_deepfree(ss_resolve_t,&toinit,ss_resolve_free) ;
return 0 ;
}
int rc_sanitize(ssexec_t *info,genalloc *ga, char const *const *envp)
{
stralloc sares = STRALLOC_ZERO ;
genalloc toreload = GENALLOC_ZERO ; //stralist
ss_resolve_t_ref pres ;
char db[info->livetree.len + 1 + info->treename.len + 1] ;
memcpy(db,info->livetree.s,info->livetree.len) ;
......@@ -145,21 +144,24 @@ int rc_sanitize(ssexec_t *info,genalloc *ga, char const *const *envp)
db[info->livetree.len + 1 + info->treename.len] = 0 ;
if (!db_ok(info->livetree.s,info->treename.s))
if (!rc_init(info,ga,envp)) return 0 ;
if (!rc_init(info,ga,envp)) goto err ;
for (unsigned int i = 0; i < genalloc_len(ss_resolve_t,ga) ; i++)
for (unsigned int i = 0 ; i < genalloc_len(ss_resolve_t,ga) ; i++)
{
pres = &genalloc_s(ss_resolve_t,ga)[i] ;
char *name = pres->sa.s + pres->name ;
if (pres->reload)
ss_resolve_t cp = RESOLVE_ZERO ;
if (!ss_resolve_copy(&cp,&genalloc_s(ss_resolve_t,ga)[i]))
{
if (!genalloc_append(ss_resolve_t,&toreload,pres)){
VERBO1 strerr_warnwu3x("add: ",name," on genalloc") ;
goto err ;
}
VERBO1 strerr_warnwu1sys("copy resolve file") ;
goto err ;
}
char *name = cp.sa.s + cp.name ;
if (cp.reload)
{
if (!ss_resolve_append(&toreload,&cp)) goto err ;
}
ss_resolve_free(&cp) ;
}
if (genalloc_len(ss_resolve_t,&toreload))
{
if (!db_switch_to(info,envp,SS_SWBACK))
......@@ -184,7 +186,7 @@ int rc_sanitize(ssexec_t *info,genalloc *ga, char const *const *envp)
VERBO1 strerr_warnwu3x("switch ",info->treename.s," to source") ;
goto err ;
}
if (!rc_send(info,&toreload,"-d",envp))
{
VERBO1 strerr_warnwu1x("stop services") ;
......@@ -192,19 +194,19 @@ int rc_sanitize(ssexec_t *info,genalloc *ga, char const *const *envp)
}
}
genalloc_free(ss_resolve_t,&toreload) ;
genalloc_deepfree(ss_resolve_t,&toreload,ss_resolve_free) ;
stralloc_free(&sares) ;
return 1 ;
err:
genalloc_free(ss_resolve_t,&toreload) ;
genalloc_deepfree(ss_resolve_t,&toreload,ss_resolve_free) ;
stralloc_free(&sares) ;
return 0 ;
}
int rc_start(ssexec_t *info,genalloc *ga,char const *const *envp)
{
char *s = 0 ;
char *s = "-u" ;
int r = db_find_compiled_state(info->livetree.s,info->treename.s) ;
if (r)
{
......@@ -212,8 +214,6 @@ int rc_start(ssexec_t *info,genalloc *ga,char const *const *envp)
strerr_diefu3x(111,"switch: ",info->treename.s," to source") ;
}
if (RELOAD == 1) s = "-r" ;
else s = "-u" ;
if (!rc_send(info,ga,s,envp))
{
VERBO1 strerr_warnwu1x("start services") ;
......@@ -227,12 +227,13 @@ int ssexec_start(int argc, char const *const *argv,char const *const *envp,ssexe
{
// be sure that the global var are set correctly
RELOAD = 0 ;
DEADLINE = 0 ;
SIG = "-U" ;
sares.len = 0 ;
if (info->timeout) DEADLINE = info->timeout ;
int cl, rc, logname ;
stralloc sares = STRALLOC_ZERO ;
genalloc gagen = GENALLOC_ZERO ; //ss_resolve_t
ss_resolve_t_ref pres ;
......@@ -268,13 +269,13 @@ int ssexec_start(int argc, char const *const *argv,char const *const *envp,ssexe
char const *name = *argv ;
ss_resolve_t res = RESOLVE_ZERO ;
if (!ss_resolve_check(info,name,SS_RESOLVE_LIVE)) strerr_dief2x(110,name," is not enabled") ;
else if (!ss_resolve_read(&res,sares.s,name)) strerr_diefu2sys(111,"read resolve file of: ",name) ;
if (!genalloc_append(ss_resolve_t,&gagen,&res)) strerr_diefu3x(111,"add: ",name," on genalloc") ;
if (!ss_resolve_add_deps(&gagen,&res,info)) strerr_diefu2sys(111,"resolve recursive dependencies of: ",name) ;
if (!ss_resolve_read(&res,sares.s,name)) strerr_diefu2sys(111,"read resolve file of: ",name) ;
if (!ss_resolve_add_deps(&gagen,&res,info)) strerr_diefu2sys(111,"resolve dependencies of: ",name) ;
ss_resolve_free(&res) ;
}
stralloc_free(&sares) ;
for(unsigned int i = 0 ; i < genalloc_len(ss_resolve_t,&gagen) ; i++)
{
pres = &genalloc_s(ss_resolve_t,&gagen)[i] ;
......@@ -292,7 +293,7 @@ int ssexec_start(int argc, char const *const *argv,char const *const *envp,ssexe
pres->run = 1 ;
unlink_void(earlier) ;
}
if (obstr_equal(name,SS_MASTER + 1)) goto run ;
if (obstr_equal(name,SS_MASTER + 1)) goto append ;
/** always check if the daemon is present or not into the scandir
* it can be stopped from different manner (crash,66-scandir signal,..)
* without changing the corresponding resolve file */
......@@ -318,25 +319,27 @@ int ssexec_start(int argc, char const *const *argv,char const *const *envp,ssexe
if (logname > 0 && (!ss_resolve_cmp(&gagen,string + pres->logassoc))) strerr_dief1x(111,"-R signal is not allowed to a logger") ;
}
if (RELOAD > 1) pres->reload = 1 ;
if (pres->init)
{
pres->reload = 0 ;
SIG="-U" ;
}
run:
append:
if (pres->type == CLASSIC)
{
if (!genalloc_append(ss_resolve_t,&nclassic,pres)) strerr_diefu3x(111,"add: ",name," on genalloc") ;
if (!ss_resolve_append(&nclassic,pres)) strerr_diefu3x(111,"add: ",name," on genalloc") ;
cl++ ;
}
else
{
if (!genalloc_append(ss_resolve_t,&nrc,pres)) strerr_diefu3x(111,"add: ",name," on genalloc") ;
if (!ss_resolve_append(&nrc,pres)) strerr_diefu3x(111,"add: ",name," on genalloc") ;
rc++;
}
}
genalloc_deepfree(ss_resolve_t,&gagen,ss_resolve_free) ;
if (cl)
{
VERBO2 strerr_warni1x("sanitize classic services list...") ;
......@@ -365,6 +368,6 @@ int ssexec_start(int argc, char const *const *argv,char const *const *envp,ssexe
genalloc_deepfree(ss_resolve_t,&nrc,ss_resolve_free) ;
}
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