From d8286177768e88800a0330993f0f24c00147e893 Mon Sep 17 00:00:00 2001
From: obarun <eric@obarun.org>
Date: Tue, 12 Mar 2019 20:11:49 +1100
Subject: [PATCH] add ss_resolve_copy,ss_resolve_append,be clean with heap
 memory

---
 src/include/66/resolve.h |   2 +
 src/lib66/resolve.c      | 120 +++++++++++++++++++++++++++++++--------
 2 files changed, 97 insertions(+), 25 deletions(-)

diff --git a/src/include/66/resolve.h b/src/include/66/resolve.h
index 6b5d8152..c57df28c 100644
--- a/src/include/66/resolve.h
+++ b/src/include/66/resolve.h
@@ -97,4 +97,6 @@ extern int ss_resolve_cmp(genalloc *ga,char const *name) ;
 extern void ss_resolve_setflag(ss_resolve_t *res,int flags,int flags_val) ;
 extern int ss_resolve_add_deps(genalloc *tokeep,ss_resolve_t *res, ssexec_t *info) ;
 extern int ss_resolve_add_rdeps(genalloc *tokeep, ss_resolve_t *res,ssexec_t *info) ;
+extern int ss_resolve_copy(ss_resolve_t *dst,ss_resolve_t *res) ;
+extern int ss_resolve_append(genalloc *ga,ss_resolve_t *res) ;
 #endif
diff --git a/src/lib66/resolve.c b/src/lib66/resolve.c
index 135166e1..4d18f170 100644
--- a/src/lib66/resolve.c
+++ b/src/lib66/resolve.c
@@ -566,6 +566,7 @@ int ss_resolve_setlognwrite(ss_resolve_t *sv, char const *dst)
 	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.src = ss_resolve_add_string(&res,string + sv->src) ;
 	//res.ndeps = 1 ;
 	res.type = sv->type ;
 	ss_resolve_setflag(&res,SS_FLAGS_RELOAD,sv->reload) ;
@@ -768,19 +769,21 @@ int ss_resolve_setnwrite(sv_alltype *services, ssexec_t *info, char const *dst)
 		
 		if (!ss_resolve_setlognwrite(&res,dst)) goto err ;
 	}
-	
+	/** may on workdir so a copy with made to source, write it SIMPLE */
 	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 ;
 	}
 	
+	ss_resolve_free(&res) ;
 	stralloc_free(&namedeps) ;
 	stralloc_free(&final) ;
 	stralloc_free(&destlog) ;
 	return 1 ;
 	
 	err:
+		ss_resolve_free(&res) ;
 		stralloc_free(&namedeps) ;
 		stralloc_free(&final) ;
 		stralloc_free(&destlog) ;
@@ -810,30 +813,38 @@ int ss_resolve_add_logger(genalloc *ga,ssexec_t *info)
 	for (unsigned int i = 0 ; i < genalloc_len(ss_resolve_t,ga) ; i++) 
 	{
 		ss_resolve_t res = RESOLVE_ZERO ;
-		char *string = genalloc_s(ss_resolve_t,ga)[i].sa.s ;
-		char *name = string + genalloc_s(ss_resolve_t,ga)[i].name ;
+		ss_resolve_t dres = RESOLVE_ZERO ;
+		if (!ss_resolve_copy(&res,&genalloc_s(ss_resolve_t,ga)[i]))
+		{
+			VERBO1 strerr_warnwu1sys("copy resolve file") ;
+			goto err ;
+		}
+		char *string = res.sa.s ;
+		char *name = string + res.name ;
 		if (!ss_resolve_cmp(&gatmp,name))
 		{
-			if (!genalloc_append(ss_resolve_t,&gatmp,&genalloc_s(ss_resolve_t,ga)[i])) 
+			if (!ss_resolve_append(&gatmp,&res)) 
 				goto err ;
 		
-			if (genalloc_s(ss_resolve_t,ga)[i].logger)
+			if (res.logger)
 			{
-				if (!ss_resolve_read(&res,tmp.s,string + genalloc_s(ss_resolve_t,ga)[i].logger))
+				if (!ss_resolve_read(&dres,tmp.s,string + res.logger))
 					goto err ;
 			
-				if (!genalloc_append(ss_resolve_t,&gatmp,&res)) goto err ;
+				if (!ss_resolve_append(&gatmp,&dres)) goto err ;
 			}
-		}
-		
+		}		
+		ss_resolve_free(&res) ;
+		ss_resolve_free(&dres) ;
 	}
+	genalloc_deepfree(ss_resolve_t,ga,ss_resolve_free) ;
 	if (!genalloc_copy(ss_resolve_t,ga,&gatmp)) goto err ;
-		
-	genalloc_free(ss_resolve_t,&gatmp) ;
+
+	genalloc_deepfree(ss_resolve_t,&gatmp,ss_resolve_free) ;
 	stralloc_free(&tmp) ;
 	return 1 ;
 	err:
-		genalloc_free(ss_resolve_t,&gatmp) ;
+		genalloc_deepfree(ss_resolve_t,&gatmp,ss_resolve_free) ;
 		stralloc_free(&tmp) ;
 		return 0 ;
 }
@@ -853,6 +864,50 @@ void ss_resolve_setflag(ss_resolve_t *res,int flags,int flags_val)
 	}
 }
 
+int ss_resolve_copy(ss_resolve_t *dst,ss_resolve_t *res)
+{
+	size_t len = res->sa.len - 1 ;
+	dst->salen = res->salen ;
+	if (!stralloc_catb(&dst->sa,res->sa.s,len)) return 0 ;
+	dst->name = res->name ;
+	dst->description = res->description ;
+	dst->logger = res->logger ;
+	dst->logreal = res->logreal ;
+	dst->logassoc = res->logassoc ;
+	dst->dstlog = res->dstlog ;
+	dst->deps = res->deps ;
+	dst->src = res->src ;
+	dst->live = res->live ;
+	dst->runat = res->runat ;
+	dst->tree = res->tree ;
+	dst->treename = res->treename ;
+	dst->resolve = res->resolve ;
+	dst->exec_run = res->exec_run ;
+	dst->exec_finish = res->exec_finish ;
+	dst->type = res->type ;
+	dst->ndeps = res->ndeps ;
+	dst->reload = res->reload ;
+	dst->disen = res->disen ;
+	dst->init = res->init ;
+	dst->unsupervise = res->unsupervise ;
+	dst->down = res->down ;
+	dst->run = res->run ;
+	dst->pid = res->pid ;
+	if (!stralloc_0(&dst->sa)) return 0 ;
+	return 1 ;
+}
+
+int ss_resolve_append(genalloc *ga,ss_resolve_t *res)
+{
+	ss_resolve_t cp = RESOLVE_ZERO ;
+	if (!ss_resolve_copy(&cp,res)) goto err ;
+	if (!genalloc_append(ss_resolve_t,ga,&cp)) goto err ;
+	return 1 ;
+	err:
+		ss_resolve_free(&cp) ;
+		return 0 ;
+}
+
 int ss_resolve_add_deps(genalloc *tokeep,ss_resolve_t *res, ssexec_t *info)
 {
 	unsigned int i = 0 ;
@@ -866,7 +921,9 @@ int ss_resolve_add_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)) goto err ;
+	{
+		if (!ss_resolve_append(tokeep,res)) goto err ;
+	}
 	
 	if (res->ndeps)
 	{
@@ -877,10 +934,15 @@ int ss_resolve_add_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_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 (dres.ndeps)
+			{
+				if (!ss_resolve_add_deps(tokeep,&dres,info)) goto err ;
+			}
 			if (!ss_resolve_cmp(tokeep,gaistr(&tmp,i)))
-				if (!genalloc_append(ss_resolve_t,tokeep,&dres)) goto err ;
+			{
+				if (!ss_resolve_append(tokeep,&dres)) goto err ;
+			}
+			ss_resolve_free(&dres) ;
 		}
 	}
 	genalloc_deepfree(stralist,&tmp,stra_free) ;
@@ -904,8 +966,11 @@ int ss_resolve_add_rdeps(genalloc *tokeep, ss_resolve_t *res,ssexec_t *info)
 	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)) goto err ;
+	{
+		if (!ss_resolve_append(tokeep,res)) goto err ;
+	}
 	
 	for (unsigned int i = 0 ; i < genalloc_len(stralist,&nsv) ; i++)
 	{
@@ -915,26 +980,31 @@ int ss_resolve_add_rdeps(genalloc *tokeep, ss_resolve_t *res,ssexec_t *info)
 		if (obstr_equal(name,dname)) continue ;
 		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 (!ss_resolve_cmp(tokeep,dname))
 		{
-			if (!clean_val(&tmp,dres.sa.s + dres.deps)) goto err ;
-			for (unsigned int j = 0 ; j < genalloc_len(stralist,&tmp) ; j++)
+			if (dres.ndeps || (dres.type == BUNDLE && dres.ndeps) || (res->type == BUNDLE && res->ndeps))
 			{
-				if (obstr_equal(name,gaistr(&tmp,j)) || res->type == BUNDLE)
+				if (!clean_val(&tmp,dres.sa.s + dres.deps)) goto err ;
+				for (unsigned int j = 0 ; j < genalloc_len(stralist,&tmp) ; j++)
 				{
-					if (!ss_resolve_cmp(tokeep,dname))
+					if (obstr_equal(name,gaistr(&tmp,j)) || res->type == BUNDLE)
 					{
-						if (!genalloc_append(ss_resolve_t,tokeep,&dres)) goto err ;
-						if (!ss_resolve_add_rdeps(tokeep,&dres,info)) goto err ;
-						break ;
+							if (!ss_resolve_append(tokeep,&dres)) goto err ;
+							if (!ss_resolve_add_rdeps(tokeep,&dres,info)) goto err ;
+							break ;
 					}
 				}
 			}
 		}
+		ss_resolve_free(&dres) ;
 	}
+
 	genalloc_deepfree(stralist,&tmp,stra_free) ;
+	genalloc_deepfree(stralist,&nsv,stra_free) ;
 	return 1 ;
 	err:
 		genalloc_deepfree(stralist,&tmp,stra_free) ;
+		genalloc_deepfree(stralist,&nsv,stra_free) ;
 		return 0 ;
 }
+
-- 
GitLab