From 25bf1031c171779cebae3aa2e5c413a55c8a1d5a Mon Sep 17 00:00:00 2001
From: obarun <eric@obarun.org>
Date: Sun, 24 Feb 2019 03:32:22 +1100
Subject: [PATCH] rewrite with ss_resolve_s struct

---
 src/lib66/ssexec_disable.c | 446 +++++++++++++++------------------
 src/lib66/ssexec_enable.c  | 188 +++++++-------
 src/lib66/ssexec_start.c   | 120 ++-------
 src/lib66/ssexec_stop.c    | 501 +++++++++++++++----------------------
 4 files changed, 522 insertions(+), 733 deletions(-)

diff --git a/src/lib66/ssexec_disable.c b/src/lib66/ssexec_disable.c
index 79c5bb4c..bb698c42 100644
--- a/src/lib66/ssexec_disable.c
+++ b/src/lib66/ssexec_disable.c
@@ -39,10 +39,10 @@
 #include <66/db.h>
 #include <66/backup.h>
 #include <66/graph.h>
+#include <66/resolve.h>
+#include <66/svc.h>
 
-//#include <stdio.h>
-
-static stralloc saresolve = STRALLOC_ZERO ;
+#include <stdio.h>
 
 static void cleanup(char const *dst)
 {
@@ -50,148 +50,178 @@ static void cleanup(char const *dst)
 	rm_rf(dst) ;
 	errno = e ;
 }
-
-int find_logger(genalloc *ga, char const *name, char const *src)
+int svc_remove(genalloc *tostop,ss_resolve_t *res, char const *src)
 {
-	stralloc sa = STRALLOC_ZERO ;
-	if (resolve_read(&sa,src,name,"logger"))
+	char *name = res->sa.s + res->name ;
+	size_t namelen = strlen(name) ;
+	size_t srclen = strlen(src) ; 
+	
+	char dst[srclen + SS_SVC_LEN + 1 + namelen + 1] ;
+	memcpy(dst,src,srclen) ;
+	memcpy(dst + srclen, SS_SVC, SS_SVC_LEN) ;
+	dst[srclen + SS_SVC_LEN]  =  '/' ;
+	memcpy(dst + srclen + SS_SVC_LEN + 1, name, namelen) ;
+	dst[srclen + SS_SVC_LEN + 1 + namelen] = 0 ;
+		
+	VERBO1 strerr_warni3x("Removing: ",name," directory service") ;
+	if (rm_rf(dst) < 0)
+	{
+		VERBO1 strerr_warnwu2sys("remove: ", dst) ;
+		return 0 ;
+	}
+	/** modify the resolve file for 66-stop*/
+	res->disen = 0 ;
+	res->reload = 0 ;
+	res->init = 0 ;
+	res->unsupervise = 1 ;
+	VERBO2 strerr_warni2x("Write resolve file of: ",name) ;
+	if (!ss_resolve_write(res,src,name)) 
 	{
-		if (!stra_add(ga,sa.s))
+		VERBO1 strerr_warnwu2sys("write resolve file of: ",name) ;
+		return 0 ;
+	}
+	/** if a logger is associated modify the resolve for it */
+	if (res->logger) 
+	{
+		VERBO2 strerr_warni2x("Write logger resolve file of: ",name) ;
+		if (!ss_resolve_setlognwrite(res,src))
 		{
-			stralloc_free(&sa) ;
+			VERBO1 strerr_warnwu2sys("write logger resolve file of: ",name) ;
 			return 0 ;
 		}
+		if (!stra_add(tostop,res->sa.s + res->logger)) retstralloc(0,"main") ;
 	}
-	stralloc_free(&sa) ;
+	
 	return 1 ;
 }
 
-int remove_sv(genalloc *toremove, char const *name, char const *src, unsigned int type)
+int rc_remove(genalloc *toremove, ss_resolve_t *res, char const *src)
 {
-	int r ;
-
-	size_t namelen = strlen(name) ;
-	size_t srclen = strlen(src) ;
+	int r, logname ;
+	char *name = res->sa.s + res->name ;
 	size_t newlen ;
 		
-	/** classic service */
-	if (type == CLASSIC)
-	{
-		char dst[srclen + SS_SVC_LEN + 1 + namelen + 1] ;
-		memcpy(dst,src,srclen) ;
-		memcpy(dst + srclen, SS_SVC, SS_SVC_LEN) ;
-		dst[srclen + SS_SVC_LEN]  =  '/' ;
-		memcpy(dst + srclen + SS_SVC_LEN + 1, name, namelen) ;
-		dst[srclen + SS_SVC_LEN + 1 + namelen] = 0 ;
-		
-		VERBO3 strerr_warnt3x("Removing ",dst + srclen + 1," service ... ") ;
-		if (rm_rf(dst) < 0)
-		{
-			VERBO3 strerr_warnwu2sys("remove: ", dst) ;
-			return 0 ;
-		}
-				
-		return 1 ;
-	}
-	
 	stralloc sa = STRALLOC_ZERO ;
-	genalloc gatmp = GENALLOC_ZERO ;// type stralist
-	
+			
+	ss_resolve_t dres = RESOLVE_ZERO ;
+		
 	graph_t g = GRAPH_ZERO ;
 	stralloc sagraph = STRALLOC_ZERO ;
 	genalloc tokeep = GENALLOC_ZERO ;
 	
-	/** rc services */
+	/** build dependencies graph*/
+	r = graph_type_src(&tokeep,src,1) ;
+	if (r <= 0)
 	{
-		/** build dependencies graph*/
-		r = graph_type_src(&tokeep,src,1) ;
-		if (r <= 0)
-		{
-			strerr_warnwu2x("resolve source of graph for tree: ",src) ;
-			goto err ;
-		}
-		if (!graph_build(&g,&sagraph,&tokeep,src))
-		{
-			strerr_warnwu1x("make dependencies graph") ;
-			goto err ;
-		}
+		VERBO1 strerr_warnwu2x("resolve source of graph for tree: ",src) ;
+		goto err ;
+	}
+	if (!graph_build(&g,&sagraph,&tokeep,src))
+	{
+		VERBO1 strerr_warnwu1x("make dependencies graph") ;
+		goto err ;
+	}
 	
+	r = graph_rdepends(toremove,&g,name,src) ;
+	if (!r) 
+	{
+		VERBO1 strerr_warnwu2x("find services depending for: ",name) ;
+		goto err ;
+	}
+	if(r == 2) VERBO2 strerr_warnt2x("any services depends of: ",name) ;
+	
+	if (!stra_cmp(toremove,name))
+	{
 		if (!stra_add(toremove,name)) 
 		{	 
-			VERBO3 strerr_warnwu3x("add: ",name," as dependency to remove") ;
+			VERBO1 strerr_warnwu3x("add: ",name," as dependency to remove") ;
 			goto err ;
 		}
-		
-		r = graph_rdepends(toremove,&g,name,src) ;
-		if (!r) 
+	}
+	if (!stralloc_cats(&sa,src)) retstralloc(0,"remove_sv") ;
+	if (!stralloc_cats(&sa,SS_DB SS_SRC)) retstralloc(0,"remove_sv") ;
+	if (!stralloc_cats(&sa, "/")) retstralloc(0,"remove_sv") ;
+	newlen = sa.len ;
+	genalloc_reverse(stralist,toremove) ;		
+	for (unsigned int i = 0; i < genalloc_len(stralist,toremove); i++)
+	{
+		ss_resolve_init(&dres) ;
+		logname = 0 ;
+		char *dname = gaistr(toremove,i) ;
+		logname = get_rstrlen_until(dname,SS_LOG_SUFFIX) ;
+		sa.len = newlen ;
+		if (!stralloc_cats(&sa,dname)) retstralloc(0,"remove_sv") ;
+		if (!stralloc_0(&sa)) retstralloc(0,"remove_sv") ;
+		VERBO1 strerr_warni3x("Removing: ",dname," directory service") ;
+		if (rm_rf(sa.s) < 0)
 		{
-			VERBO3 strerr_warnwu2x("find services depending for: ",name) ;
+			VERBO1 strerr_warnwu2sys("remove: ", sa.s) ;
 			goto err ;
 		}
-		if(r == 2) VERBO3 strerr_warnt2x("any services don't depends of: ",name) ;
-		
-		if (!stralloc_catb(&sa,src,srclen)) retstralloc(0,"remove_sv") ;
-		if (!stralloc_cats(&sa,SS_DB SS_SRC)) retstralloc(0,"remove_sv") ;
-		if (!stralloc_cats(&sa, "/")) retstralloc(0,"remove_sv") ;
-		newlen = sa.len ;
-		if (genalloc_len(stralist,toremove))
-			if (!find_logger(toremove,name,src)) goto err ;
-			
-		for (unsigned int i = 0; i < genalloc_len(stralist,toremove); i++)
+		/** do not pass in case of logger, it's already done */
+		if (logname <= 0)
 		{
-			sa.len = newlen ;
-			if (!stralloc_cats(&sa,gaistr(toremove,i))) retstralloc(0,"remove_sv") ;
-			if (!stralloc_0(&sa)) retstralloc(0,"remove_sv") ;
-			VERBO3 strerr_warnt3x("Removing ",sa.s + srclen + 1," service ...") ;
-			if (rm_rf(sa.s) < 0)
+			if (!ss_resolve_read(&dres,src,dname))
 			{
-				VERBO3 strerr_warnwu2sys("remove: ", sa.s) ;
+				VERBO1 strerr_warnwu2sys("read resolve file of: ",dname) ;
 				goto err ;
 			}
-		}
-
+			dres.disen = 0 ;
+			dres.reload = 0 ;
+			dres.init = 0 ;
+			dres.unsupervise = 1 ;
+			VERBO2 strerr_warni2x("Write resolve file of: ",dname) ;
+			if (!ss_resolve_write(&dres,src,dname)) 
+			{
+				VERBO1 strerr_warnwu2sys("write resolve file of: ",dname) ;
+				goto err ;
+			}
+			if (dres.logger) 
+			{
+				VERBO2 strerr_warni2x("Write logger resolve file of: ",dname) ;
+				if (!ss_resolve_setlognwrite(&dres,src))
+				{
+					VERBO1 strerr_warnwu2sys("write logger resolve file of: ",dname) ;
+					goto err ;
+				}
+			}
+		}			
 	}
 	
-	genalloc_free(vertex_graph_t,&g.stack) ;
-	genalloc_free(vertex_graph_t,&g.vertex) ;
+	graph_free(&g) ;
 	stralloc_free(&sagraph) ;
+	genalloc_deepfree(stralist,&tokeep,stra_free) ;
 	stralloc_free(&sa) ;
-	genalloc_deepfree(stralist,&gatmp,stra_free) ;
-	
+	ss_resolve_free(&dres) ;
 	return 1 ;
 	
 	err:
-		genalloc_free(vertex_graph_t,&g.stack) ;
-		genalloc_free(vertex_graph_t,&g.vertex) ;
+		graph_free(&g) ;
 		stralloc_free(&sagraph) ;
+		genalloc_deepfree(stralist,&tokeep,stra_free) ;
 		stralloc_free(&sa) ;
-		genalloc_deepfree(stralist,&gatmp,stra_free) ;
+		ss_resolve_free(&dres) ;
 		return 0 ;
 }
 
 int ssexec_disable(int argc, char const *const *argv,char const *const *envp,ssexec_t *info)
 {
-	// be sure that the global var are set correctly
-	saresolve = stralloc_zero ;
-	
-	int r,rb ;
+	int r, logname ;
 	unsigned int nlongrun, nclassic, stop ;
 	
-	
 	stralloc workdir = STRALLOC_ZERO ;
 	
-	genalloc ganlong = GENALLOC_ZERO ; //name of longrun service, type stralist
-	genalloc ganclassic = GENALLOC_ZERO ; //name of classic service, stralist
-	genalloc gadepstoremove = GENALLOC_ZERO ;
+	genalloc tostop = GENALLOC_ZERO ;//stralist
+	
+	ss_resolve_t res = RESOLVE_ZERO ;
 	
 	graph_t g = GRAPH_ZERO ;
 	stralloc sagraph = STRALLOC_ZERO ;
 	genalloc tokeep = GENALLOC_ZERO ;
 	genalloc master = GENALLOC_ZERO ;
+		
+	r = nclassic = nlongrun = stop = logname = 0 ;
 	
-	r = nclassic = nlongrun = stop = 0 ;
-	
-	//PROG = "66-disable" ;	
 	{
 		subgetopt_t l = SUBGETOPT_ZERO ;
 
@@ -210,146 +240,101 @@ int ssexec_disable(int argc, char const *const *argv,char const *const *envp,sse
 	}
 	
 	if (argc < 1) exitusage(usage_disable) ;
-	
-	if (!tree_copy(&workdir,info->tree.s,info->treename)) strerr_diefu1sys(111,"create tmp working directory") ;
+	/******* TODO les sortie sont pas bonne
+	 *  en cas de crash il te faut enlever le workdir */
+	if (!tree_copy(&workdir,info->tree.s,info->treename.s)) strerr_diefu1sys(111,"create tmp working directory") ;
 	
 	{
-		stralloc type = STRALLOC_ZERO ;
-		
+				
 		for(;*argv;argv++)
 		{
-			if (!resolve_pointo(&saresolve,info,0,SS_RESOLVE_SRC))
+			char const *name = *argv ;
+			logname = 0 ;
+			if (obstr_equal(name,SS_MASTER + 1))
 			{
-				cleanup(workdir.s) ;
-				strerr_diefu1x(111,"set revolve pointer to source") ;
+					cleanup(workdir.s) ;
+					strerr_dief1x(110,"nice try peon") ;
 			}
-			rb = resolve_read(&type,saresolve.s,*argv,"remove") ;
-			if (rb) 
+			ss_resolve_init(&res) ;
+			logname = get_rstrlen_until(name,SS_LOG_SUFFIX) ;
+			if (logname > 0)
 			{
-				strerr_warni2x(*argv,": is already disabled") ;
-				continue ;
+					cleanup(workdir.s) ;
+					strerr_dief1x(110,"logger detected - disabling is not allowed") ;
 			}
-			
-			rb = resolve_read(&type,saresolve.s,*argv,"type") ;
-			if (rb < -1)
+			if (!ss_resolve_check(info,name,SS_RESOLVE_SRC))
 			{
-				cleanup(workdir.s) ;
-				strerr_dief2x(111,"invalid .resolve directory: ",saresolve.s) ;
+					cleanup(workdir.s) ;
+					strerr_dief2x(110,name," is not enabled") ;
 			}
-			if (rb <= 0)
+			if (!ss_resolve_read(&res,workdir.s,name))
 			{
 				cleanup(workdir.s) ;
-				strerr_dief2x(111,*argv,": is not enabled") ;
+				strerr_diefu2sys(111,"read resolve file of: ",name) ;
 			}
 			
-			if (get_enumbyid(type.s,key_enum_el) == CLASSIC)
+			if (!res.disen)
 			{
-				if (!stra_add(&ganclassic,*argv)) retstralloc(111,"main") ;
+				strerr_warni2x(name,": is already disabled") ;
+				continue ;
+			}
+			
+			if (res.type == CLASSIC)
+			{
+				if (!svc_remove(&tostop,&res,workdir.s))
+				{
+					cleanup(workdir.s) ;
+					strerr_diefu3sys(111,"remove",name," directory service") ;
+				}
+				if (!stra_add(&tostop,name))
+				{
+					cleanup(workdir.s) ;
+					retstralloc(111,"main") ;
+				}
 				nclassic++ ;
-			}					
-			if (get_enumbyid(type.s,key_enum_el) >= BUNDLE)
+			}	
+			else if (res.type >= BUNDLE)
 			{
-				if (!stra_add(&ganlong,*argv)) retstralloc(111,"main") ;
+				if (!stra_cmp(&tostop,name))
+				{
+					if (!rc_remove(&tostop,&res,workdir.s))
+					{
+						cleanup(workdir.s) ;
+						strerr_diefu2x(111,"disable: ",name) ;
+					}
+				}
 				nlongrun++ ;
 			}
 		}
-		stralloc_free(&type) ;
 	}
-
+	ss_resolve_free(&res) ;
+	
 	if (nclassic)
 	{
-		VERBO2 strerr_warni1x("remove svc services ... ") ;
-		for (unsigned int i = 0 ; i < genalloc_len(stralist,&ganclassic) ; i++)
-		{
-			char *name = gaistr(&ganclassic,i) ;
-			
-			if (!remove_sv(&gadepstoremove,name,workdir.s,CLASSIC))
-			{
-				cleanup(workdir.s) ;
-				strerr_diefu2x(111,"disable: ",name) ;
-			}
-			
-			/** modify the resolve file for 66-stop*/
-			if (!resolve_write(workdir.s,gaistr(&ganclassic,i),"remove","",1))
-			{
-				cleanup(workdir.s) ;
-				strerr_diefu2sys(111,"write resolve file: remove for service: ",gaistr(&ganclassic,i)) ;
-			}
-		}
-		char type[UINT_FMT] ;
-		size_t typelen = uint_fmt(type, CLASSIC) ;
-		type[typelen] = 0 ;
-		size_t cmdlen ;
-		char cmd[typelen + 6 + 1] ;
-		memcpy(cmd,"-t",2) ;
-		memcpy(cmd + 2,type,typelen) ;
-		cmdlen = 2 + typelen ;
-		memcpy(cmd + cmdlen," -b",3) ;
-		cmd[cmdlen + 3] = 0 ;
-		r = backup_cmd_switcher(VERBOSITY,cmd,info) ;
-		if (r < 0)
+		if (!svc_switch_to(info,SS_SWBACK)) 
 		{
 			cleanup(workdir.s) ;
-			strerr_diefu2sys(111,"find origin of tree: ",info->treename) ;
+			strerr_diefu1sys(111,"switch classic service to backup") ;
 		}
-		// point to origin
-		if (!r)
-		{
-			stralloc sv = STRALLOC_ZERO ;
-			VERBO2 strerr_warni2x("make backup of tree: ",info->treename) ;
-			if (!backup_make_new(info,CLASSIC))
-			{
-				cleanup(workdir.s) ;
-				strerr_diefu2sys(111,"make a backup of db: ",info->treename) ;
-			}
-			memcpy(cmd + cmdlen," -s1",4) ;
-			cmd[cmdlen + 4] = 0 ;
-			r = backup_cmd_switcher(VERBOSITY,cmd,info) ;
-			if (r < 0)
-			{
-				cleanup(workdir.s) ;
-				strerr_diefu3sys(111,"switch current db: ",info->treename," to source") ;
-			}
-			/** creer le fichier torelaod*/
-			stralloc_free(&sv) ;
-		}
-		gadepstoremove = genalloc_zero ;
+		
 	}
 	
 	if (nlongrun)
 	{	
 		
-		VERBO2 strerr_warni1x("remove rc services ... ") ;
-		for (unsigned int i = 0 ; i < genalloc_len(stralist,&ganlong) ; i++)
-		{
-			char *name = gaistr(&ganlong,i) ;
-			
-			if (!remove_sv(&gadepstoremove,name,workdir.s,LONGRUN))
-			{
-				cleanup(workdir.s) ;
-				strerr_diefu2x(111,"disable: ",name) ;
-			}
-		}
-
-		for (unsigned int i = 0 ; i < genalloc_len(stralist,&gadepstoremove) ; i++ )
-		{
-			// modify the resolve file for 66-stop*/
-			if (!resolve_write(workdir.s,gaistr(&gadepstoremove,i),"remove","",1))
-			{
-				cleanup(workdir.s) ;
-				strerr_diefu2sys(111,"write resolve file: remove for service: ",gaistr(&gadepstoremove,i)) ;
-			}
-		}
-		
 		r = graph_type_src(&tokeep,workdir.s,1) ;
 		if (!r)
 		{
 			cleanup(workdir.s) ;
-			strerr_diefu2x(111,"resolve source of graph for tree: ",info->treename) ;
+			strerr_diefu2x(111,"resolve source of graph for tree: ",info->treename.s) ;
 		}
 		if (r < 0)
 		{
-			if (!stra_add(&master,"")) retstralloc(111,"main") ;
+			if (!stra_add(&master,""))
+			{
+				cleanup(workdir.s) ;
+				retstralloc(111,"main") ;
+			}
 		}
 		else 
 		{
@@ -358,11 +343,12 @@ int ssexec_disable(int argc, char const *const *argv,char const *const *envp,sse
 				cleanup(workdir.s) ;
 				strerr_diefu1x(111,"make dependencies graph") ;
 			}
-			if (!graph_sort(&g))
+			if (graph_sort(&g) < 0)
 			{
 				cleanup(workdir.s) ;
 				strerr_dief1x(111,"cyclic graph detected") ;
 			}
+			
 			if (!graph_master(&master,&g))
 			{
 				cleanup(workdir.s) ;
@@ -370,24 +356,23 @@ int ssexec_disable(int argc, char const *const *argv,char const *const *envp,sse
 			}
 		}
 		
-		
-		if (!db_write_contents(&master,SS_MASTER + 1,workdir.s))
+		if (!db_write_master(info,&master,workdir.s))
 		{
 			cleanup(workdir.s) ;
 			strerr_diefu2x(111,"update bundle: ", SS_MASTER) ;
 		}
 			
-		if (!db_compile(workdir.s,info->tree.s, info->treename,envp))
+		if (!db_compile(workdir.s,info->tree.s, info->treename.s,envp))
 		{
 			cleanup(workdir.s) ;
-			strerr_diefu4x(111,"compile ",workdir.s,"/",info->treename) ; 
+			strerr_diefu4x(111,"compile ",workdir.s,"/",info->treename.s) ; 
 		}
 		
 		/** this is an important part, we call s6-rc-update here */
 		if (!db_switch_to(info,envp,SS_SWBACK))
 		{
 			cleanup(workdir.s) ;
-			strerr_diefu3x(111,"switch ",info->treename," to backup") ;
+			strerr_diefu3x(111,"switch ",info->treename.s," to backup") ;
 		}
 		
 	}
@@ -399,62 +384,45 @@ int ssexec_disable(int argc, char const *const *argv,char const *const *envp,sse
 	}
 	
 	cleanup(workdir.s) ;
-	workdir = stralloc_zero ;
-	
-	for (int i = 0 ; i < genalloc_len(stralist,&ganclassic) ; i++)
-	{
-		if (!resolve_pointo(&saresolve,info,0,SS_RESOLVE_SRC))
-			strerr_diefu1x(111,"set revolve pointer to source") ;
-		
-		if (resolve_read(&workdir,saresolve.s,gaistr(&ganclassic,i),"remove")) 
-			if (!resolve_remove(saresolve.s,gaistr(&ganclassic,i),"reload"))
-				strerr_diefu3sys(111,"delete resolve file",saresolve.s,"/reload") ;
-	}
+	workdir.len = 0 ;
 	
-	for (int i = 0 ; i < genalloc_len(stralist,&ganlong) ; i++)
-	{
-		if (!resolve_pointo(&saresolve,info,0,SS_RESOLVE_SRC))
-			strerr_diefu1x(111,"set revolve pointer to source") ;
-		
-		if (resolve_read(&workdir,saresolve.s,gaistr(&ganlong,i),"remove")) 
-			if (!resolve_remove(saresolve.s,gaistr(&ganlong,i),"reload"))
-				strerr_diefu3sys(111,"delete resolve file",saresolve.s,"/reload") ;
-	}
+	stralloc_free(&workdir) ;
+	/** graph allocation */
+	graph_free(&g) ;
+	stralloc_free(&sagraph) ;	
+	genalloc_deepfree(stralist,&master,stra_free) ;
+	genalloc_deepfree(stralist,&tokeep,stra_free) ;
 	
-	if (stop && ((nclassic) || (nlongrun)))
+	if (stop && genalloc_len(stralist,&tostop))
 	{
-		int nargc = 3 + genalloc_len(stralist,&ganclassic) + genalloc_len(stralist,&ganlong) ;
+		for (unsigned int i = 0 ; i < genalloc_len(stralist,&tostop) ; i++)
+		{
+			char *name = gaistr(&tostop,i) ;
+			int logname = get_rstrlen_until(name,SS_LOG_SUFFIX) ;
+			if (logname > 0) 
+				if (!stra_remove(&tostop,name)) strerr_diefu1sys(111,"logger from the list to stop") ;
+		}	
+		int nargc = 3 + genalloc_len(stralist,&tostop) ;
 		char const *newargv[nargc] ;
 		unsigned int m = 0 ;
 		
 		newargv[m++] = "fake_name" ;
 		newargv[m++] = "-u" ;
-		/** classic */
-		for (unsigned int i = 0 ; i<genalloc_len(stralist,&ganclassic); i++)
-			newargv[m++] = gaistr(&ganclassic,i) ;
-		/** rc */
-		for (unsigned int i = 0 ; i<genalloc_len(stralist,&ganlong); i++)
-			newargv[m++] = gaistr(&ganlong,i) ;
+		
+		for (unsigned int i = 0 ; i < genalloc_len(stralist,&tostop); i++)
+			newargv[m++] = gaistr(&tostop,i) ;
 		
 		newargv[m++] = 0 ;
 		
 		if (ssexec_stop(nargc,newargv,envp,info))
+		{
+			genalloc_deepfree(stralist,&tostop,stra_free) ;
 			return 111 ;
-		
+		}
 	}
 	
-	stralloc_free(&workdir) ;
-	genalloc_deepfree(stralist,&ganlong,stra_free) ;
-	genalloc_deepfree(stralist,&ganclassic,stra_free) ;
-	genalloc_deepfree(stralist,&gadepstoremove,stra_free) ;
+	genalloc_deepfree(stralist,&tostop,stra_free) ;
 		
-	/** graph stuff */
-	genalloc_free(vertex_graph_t,&g.stack) ;
-	genalloc_free(vertex_graph_t,&g.vertex) ;
-	stralloc_free(&sagraph) ;	
-	genalloc_deepfree(stralist,&master,stra_free) ;
-	genalloc_deepfree(stralist,&tokeep,stra_free) ;
-	
 	return 0 ;		
 }
 	
diff --git a/src/lib66/ssexec_enable.c b/src/lib66/ssexec_enable.c
index 55ddd7e6..e127a14c 100644
--- a/src/lib66/ssexec_enable.c
+++ b/src/lib66/ssexec_enable.c
@@ -41,6 +41,8 @@
 #include <66/backup.h>
 #include <66/svc.h>
 #include <66/graph.h>
+#include <66/resolve.h>
+#include <66/ssexec.h>
 
 //#include <stdio.h>
 
@@ -49,7 +51,7 @@ static unsigned int FORCE = 0 ;
 static void cleanup(char const *dst)
 {
 	int e = errno ;
-	rm_rf(dst) ;
+	//rm_rf(dst) ;
 	errno = e ;
 }
 
@@ -57,7 +59,8 @@ static int start_parser(char const *src,char const *svname,char const *tree, uns
 {
 	stralloc sasv = STRALLOC_ZERO ;
 	
-	if (!parse_service_before(src,svname,tree,nbsv,&sasv,FORCE)) strerr_dief4x(111,"invalid service file: ",src,"/",svname) ;
+	if (!parse_service_before(src,svname,tree,nbsv,&sasv,FORCE))
+		strerr_dief3x(111,"invalid service file: ",src,svname) ;
 	
 	stralloc_free(&sasv) ;
 	
@@ -75,12 +78,13 @@ int ssexec_enable(int argc, char const *const *argv,char const *const *envp,ssex
 	char const *src ;
 	
 	stralloc home = STRALLOC_ZERO ;
-	stralloc workdir = STRALLOC_ZERO ;//working dir directory
+	stralloc workdir = STRALLOC_ZERO ;
 	stralloc sasrc = STRALLOC_ZERO ;
-	stralloc saresolve = STRALLOC_ZERO ;
+	stralloc sares = STRALLOC_ZERO ;
 	genalloc gasrc = GENALLOC_ZERO ; //type diuint32
-	genalloc ganlong = GENALLOC_ZERO ; // type stralist
-	genalloc ganclassic = GENALLOC_ZERO ; // name of classic service, type stralist
+	genalloc tostart = GENALLOC_ZERO ; // type stralist
+	
+	ss_resolve_t res = RESOLVE_ZERO ;
 	
 	graph_t g = GRAPH_ZERO ;
 	stralloc sagraph = STRALLOC_ZERO ;
@@ -98,8 +102,7 @@ int ssexec_enable(int argc, char const *const *argv,char const *const *envp,ssex
 		home.len-- ;
 		src = home.s ;
 	}
-	
-	//PROG = "66-enable" ;
+		
 	{
 		subgetopt_t l = SUBGETOPT_ZERO ;
 
@@ -120,65 +123,91 @@ int ssexec_enable(int argc, char const *const *argv,char const *const *envp,ssex
 	
 	if (argc < 1) exitusage(usage_enable) ;
 	
+	
+	if (!ss_resolve_pointo(&sares,info,SS_NOTYPE,SS_RESOLVE_SRC)) strerr_diefu1sys(111,"set revolve pointer to source") ;
+	
 	for(;*argv;argv++)
 	{
+		ss_resolve_t_ref pres = &res ;
+		if (ss_resolve_check(info,*argv,SS_RESOLVE_SRC))
+		{
+			if (!ss_resolve_read(pres,sares.s,*argv)) strerr_diefu2sys(111,"read resolve file of: ",*argv) ;
+			if (res.disen && !FORCE)
+			{
+				VERBO1 strerr_warnw3x("ignoring: ",*argv," service: already enabled") ;
+				ss_resolve_free(pres) ;
+				continue ;
+			}
+		}
 		unsigned int found = 0 ;
-		if (!resolve_src(&gasrc,&sasrc,*argv,src,&found))
+		if (!ss_resolve_src(&gasrc,&sasrc,*argv,src,&found))
 		{
 			src = SS_SERVICE_PACKDIR ;
-			if (!resolve_src(&gasrc,&sasrc,*argv,src,&found))
-				strerr_diefu2x(111,"resolve source of service file: ",*argv) ;
+			if (!ss_resolve_src(&gasrc,&sasrc,*argv,src,&found))
+				strerr_dief2sys(110,"unknow service: ",*argv) ;
 		}
+		
 	}
+	ss_resolve_free(&res) ;
+	stralloc_free(&sares) ;
+	if (!genalloc_len(diuint32,&gasrc)) goto freed ;
 	
 	for (unsigned int i = 0 ; i < genalloc_len(diuint32,&gasrc) ; i++)
 		start_parser(sasrc.s + genalloc_s(diuint32,&gasrc)[i].right,sasrc.s + genalloc_s(diuint32,&gasrc)[i].left,info->tree.s,&nbsv) ;
-	
-	sv_alltype svblob[nbsv] ;
-	
-	for (int i = 0;i < nbsv;i++)
-		svblob[i] =  genalloc_s(sv_alltype,&gasv)[i] ;
-	
-	sv_db before = {
-		.services = svblob, 
-		.nsv = nbsv ,
-		.string = keep.s ,
-		.stringlen = keep.len ,
-		.ndeps = genalloc_len(unsigned int,&gadeps) 
-	} ;
-	
+		
 	{
-		if (!tree_copy(&workdir,info->tree.s,info->treename)) strerr_diefu1sys(111,"create tmp working directory") ;
-		for (unsigned int i = 0; i < before.nsv; i++)
+		
+		if (!tree_copy(&workdir,info->tree.s,info->treename.s)) strerr_diefu1sys(111,"create tmp working directory") ;
+		
+		for (unsigned int i = 0; i < genalloc_len(sv_alltype,&gasv); i++)
 		{
-			r = write_services(&before.services[i], workdir.s,FORCE) ;
+			ss_resolve_t res = RESOLVE_ZERO ;
+			ss_resolve_init(&res) ;
+			sv_alltype_ref sv = &genalloc_s(sv_alltype,&gasv)[i] ;
+			r = write_services(sv, workdir.s,FORCE) ;
 			if (!r)
 			{
 				cleanup(workdir.s) ;
-				strerr_diefu2x(111,"write service: ",keep.s+before.services[i].cname.name) ;
+				strerr_diefu2x(111,"write service: ",keep.s+sv->cname.name) ;
 			}
 			if (r > 1) continue ; //service already added
 			
-			if (before.services[i].cname.itype > CLASSIC)
+			if (sv->cname.itype > CLASSIC)
 			{
-				if (!stra_add(&ganlong,keep.s + before.services[i].cname.name)) retstralloc(111,"main") ;
+				if (!stra_add(&tostart,keep.s + sv->cname.name))
+				{
+					cleanup(workdir.s) ;
+					retstralloc(111,"main") ;
+				}
 				nlongrun++ ;
 			}
-			else if (before.services[i].cname.itype == CLASSIC) 
+			else if (sv->cname.itype == CLASSIC) 
 			{
-				if (!stra_add(&ganclassic,keep.s + before.services[i].cname.name)) retstralloc(111,"main") ;
+				if (!stra_add(&tostart,keep.s + sv->cname.name))
+				{
+					cleanup(workdir.s) ;
+					retstralloc(111,"main") ;
+				}
 				nclassic++ ;
 			}
+			VERBO2 strerr_warni2x("write resolve file of: ",keep.s + sv->cname.name) ;
+			if (!ss_resolve_setnwrite(&res,sv,info,workdir.s))
+			{
+				cleanup(workdir.s) ;
+				strerr_diefu2x(111,"write revolve file for: ",keep.s + sv->cname.name) ;
+			}
+			ss_resolve_free(&res) ;
 		}
 		
 	}
 	
+
 	if (nclassic)
 	{
 		if (!svc_switch_to(info,SS_SWBACK))
 		{
 			cleanup(workdir.s) ;
-			strerr_diefu3x(111,"switch ",info->treename," to backup") ;
+			strerr_diefu3x(111,"switch ",info->treename.s," to backup") ;
 		}	
 	}
 	
@@ -188,7 +217,7 @@ int ssexec_enable(int argc, char const *const *argv,char const *const *envp,ssex
 		if (!r)
 		{
 			cleanup(workdir.s) ;
-			strerr_diefu2x(111,"resolve source of graph for tree: ",info->treename) ;
+			strerr_diefu2x(111,"resolve source of graph for tree: ",info->treename.s) ;
 		}
 		if (r < 0)
 		{
@@ -201,35 +230,36 @@ int ssexec_enable(int argc, char const *const *argv,char const *const *envp,ssex
 				cleanup(workdir.s) ;
 				strerr_diefu1x(111,"make dependencies graph") ;
 			}
-			if (!graph_sort(&g))
+			if (graph_sort(&g) < 0)
 			{
 				cleanup(workdir.s) ;
 				strerr_dief1x(111,"cyclic graph detected") ;
 			}
+			
 			if (!graph_master(&master,&g))
 			{
 				cleanup(workdir.s) ;
 				strerr_dief1x(111,"find master service") ;
 			}
 		}
-
-		if (!db_write_contents(&master,SS_MASTER + 1,workdir.s))
+		genalloc_reverse(stralist,&master) ;
+		if (!db_write_master(info,&master,workdir.s))
 		{
 			cleanup(workdir.s) ;
-			strerr_diefu2x(111,"update bundle: ", SS_MASTER + 1) ;
+			strerr_diefu2sys(111,"update bundle: ", SS_MASTER + 1) ;
 		}
 				
-		if (!db_compile(workdir.s,info->tree.s,info->treename,envp))
+		if (!db_compile(workdir.s,info->tree.s,info->treename.s,envp))
 		{
 				cleanup(workdir.s) ;
-				strerr_diefu4x(111,"compile ",workdir.s,"/",info->treename) ;
+				strerr_diefu4x(111,"compile ",workdir.s,"/",info->treename.s) ;
 		}
 		
 		/** this is an important part, we call s6-rc-update here */
 		if (!db_switch_to(info,envp,SS_SWBACK))
 		{
 			cleanup(workdir.s) ;
-			strerr_diefu3x(111,"switch ",info->treename," to backup") ;
+			strerr_diefu3x(111,"switch ",info->treename.s," to backup") ;
 		}		
 	}
 
@@ -240,67 +270,43 @@ int ssexec_enable(int argc, char const *const *argv,char const *const *envp,ssex
 	}
 	
 	cleanup(workdir.s) ;
-	workdir = stralloc_zero ;
 	
-	for (int i = 0 ; i < genalloc_len(stralist,&ganclassic) ; i++)
-	{
-		if (!resolve_pointo(&saresolve,info,0,SS_RESOLVE_SRC))
-			strerr_diefu1x(111,"set revolve pointer to source") ;
-		
-		if (resolve_read(&workdir,saresolve.s,gaistr(&ganclassic,i),"remove")) 
-			if (!resolve_remove(saresolve.s,gaistr(&ganclassic,i),"remove"))
-				strerr_diefu3sys(111,"delete resolve file",saresolve.s,"/remove") ;
-	}
-	
-	for (int i = 0 ; i < genalloc_len(stralist,&ganlong) ; i++)
-	{
-		if (!resolve_pointo(&saresolve,info,0,SS_RESOLVE_SRC))
-			strerr_diefu1x(111,"set revolve pointer to source") ;
-		
-		if (resolve_read(&workdir,saresolve.s,gaistr(&ganlong,i),"remove")) 
-			if (!resolve_remove(saresolve.s,gaistr(&ganlong,i),"remove"))
-				strerr_diefu3sys(111,"delete resolve file",saresolve.s,"/remove") ;
-	}
-				
-	if (start && ((nclassic) || (nlongrun)))
+	freed:
+	/** parser allocation*/
+	freed_parser() ;
+	/** inner allocation */
+	stralloc_free(&home) ;
+	stralloc_free(&workdir) ;
+	stralloc_free(&sasrc) ;
+	genalloc_free(diuint32,&gasrc) ;
+	/** graph allocation */
+	graph_free(&g) ;
+	genalloc_deepfree(stralist,&master,stra_free) ;
+	stralloc_free(&sagraph) ;
+	genalloc_deepfree(stralist,&tokeep,stra_free) ;
+			
+	if (start && genalloc_len(stralist,&tostart))
 	{
-		int nargc = 2 + genalloc_len(stralist,&ganclassic) + genalloc_len(stralist,&ganlong) ;
+		int nargc = 2 + genalloc_len(stralist,&tostart) ;
 		char const *newargv[nargc] ;
 		unsigned int m = 0 ;
 		
 		newargv[m++] = "fake_name" ;
-		/** classic */
-		for (unsigned int i = 0 ; i<genalloc_len(stralist,&ganclassic); i++)
-			newargv[m++] = gaistr(&ganclassic,i) ;
-		/** rc */
-		for (unsigned int i = 0 ; i<genalloc_len(stralist,&ganlong); i++)
-			newargv[m++] = gaistr(&ganlong,i) ;
+		
+		for (unsigned int i = 0 ; i < genalloc_len(stralist,&tostart); i++)
+			newargv[m++] = gaistr(&tostart,i) ;
 		
 		newargv[m++] = 0 ;
 		
 		if (ssexec_start(nargc,newargv,envp,info))
+		{
+			genalloc_deepfree(stralist,&tostart,stra_free) ;
 			return 111 ;
+		}
 		
 	}
 	
-	
-	/** general allocation*/
-	freed_parser() ;
-	/** inner allocation */
-	stralloc_free(&home) ;
-	stralloc_free(&workdir) ;
-	stralloc_free(&sasrc) ;
-	stralloc_free(&saresolve) ;
-	genalloc_free(sv_src_t,&gasrc) ;
-	genalloc_deepfree(stralist,&ganclassic,stra_free) ;
-	genalloc_deepfree(stralist,&ganlong,stra_free) ;
-	
-	/** graph stuff */
-	genalloc_free(vertex_graph_t,&g.stack) ;
-	genalloc_free(vertex_graph_t,&g.vertex) ;
-	genalloc_deepfree(stralist,&master,stra_free) ;
-	stralloc_free(&sagraph) ;
-	genalloc_deepfree(stralist,&tokeep,stra_free) ;
-	
-	return 0 ;		
+	genalloc_deepfree(stralist,&tostart,stra_free) ;
+		
+	return 0 ;
 }
diff --git a/src/lib66/ssexec_start.c b/src/lib66/ssexec_start.c
index d19c0d08..078bf028 100644
--- a/src/lib66/ssexec_start.c
+++ b/src/lib66/ssexec_start.c
@@ -50,6 +50,7 @@
 #include <66/svc.h>
 #include <66/ssexec.h>
 #include <66/resolve.h>
+#include <66/rc.h>
 
 #include <stdio.h>
 
@@ -60,27 +61,6 @@ static stralloc sares = STRALLOC_ZERO ;
 static genalloc nclassic = GENALLOC_ZERO ; //resolve_t type
 static genalloc nrc = GENALLOC_ZERO ; //resolve_t type
 
-int svc_send(ssexec_t *info,genalloc *ga,char const *sig,char const *const *envp)
-{
-	unsigned int i = 0 ;
-	int nargc = 3 + genalloc_len(ss_resolve_t,ga) ;
-	char const *newargv[nargc] ;
-	unsigned int m = 0 ;
-	
-	newargv[m++] = "fake_name" ;
-	newargv[m++] = sig ;
-	
-	for (; i < genalloc_len(ss_resolve_t,ga) ; i++) 
-		newargv[m++] = genalloc_s(ss_resolve_t,ga)[i].sa.s + genalloc_s(ss_resolve_t,ga)[i].name ;
-	
-	newargv[m++] = 0 ;
-
-	if (ssexec_svctl(nargc,newargv,envp,info))
-		return 0 ;
-	
-	return 1 ;
-}
-
 int svc_shutnremove(ssexec_t *info, genalloc *ga, char const *sig,char const *const *envp)
 {
 	if (!svc_send(info,ga,sig,envp))
@@ -92,7 +72,7 @@ int svc_shutnremove(ssexec_t *info, genalloc *ga, char const *sig,char const *co
 	for (unsigned int i = 0 ; i < genalloc_len(ss_resolve_t,ga) ; i++) 
 	{
 		char const *string = genalloc_s(ss_resolve_t,ga)[i].sa.s ;
-		VERBO1 strerr_warnt2x("Delete: ", string + genalloc_s(ss_resolve_t,ga)[i].runat) ;
+		VERBO1 strerr_warni2x("Delete: ", string + genalloc_s(ss_resolve_t,ga)[i].runat) ;
 		if (rm_rf(string + genalloc_s(ss_resolve_t,ga)[i].runat) < 0)
 		{
 			VERBO1 strerr_warnwu2sys("delete: ",string + genalloc_s(ss_resolve_t,ga)[i].runat) ;
@@ -130,22 +110,22 @@ int svc_start(ssexec_t *info,genalloc *ga,char const *const *envp)
 		genalloc_s(ss_resolve_t,ga)[i].unsupervise = 0 ;
 		if (!s6_svstatus_read(string + genalloc_s(ss_resolve_t,ga)[i].runat,&status))
 		{ 
-			VERBO3 strerr_warnwu2sys("read status of: ",name) ;
+			VERBO1 strerr_warnwu2sys("read status of: ",name) ;
 			return 0 ;
 		}
 		genalloc_s(ss_resolve_t,ga)[i].pid = status.pid ;
-		VERBO2 strerr_warnt2x("Write resolve file of: ",name) ;
+		VERBO2 strerr_warni2x("Write resolve file of: ",name) ;
 		if (!ss_resolve_write(&genalloc_s(ss_resolve_t,ga)[i],sares.s,name))
 		{
-			VERBO3 strerr_warnwu2sys("write resolve file of: ",name) ;
+			VERBO1 strerr_warnwu2sys("write resolve file of: ",name) ;
 			return 0 ;
 		}
 		if (genalloc_s(ss_resolve_t,ga)[i].logger)
 		{
-			VERBO2 strerr_warnt2x("Write logger resolve file of: ",name) ;
+			VERBO2 strerr_warni2x("Write logger resolve file of: ",name) ;
 			if (!ss_resolve_setlognwrite(&genalloc_s(ss_resolve_t,ga)[i],sares.s))
 			{
-				VERBO2 strerr_warnwu2sys("write logger resolve file of: ",name) ;
+				VERBO1 strerr_warnwu2sys("write logger resolve file of: ",name) ;
 				return 0 ;
 			}
 		}
@@ -220,36 +200,6 @@ int svc_sanitize(ssexec_t *info,genalloc *ga, char const *const *envp)
 		return 0 ;
 }
 
-int rc_init(ssexec_t *info, char const *const *envp)
-{
-	int r ;
-	
-	int nargc = 4 ;
-	char const *newargv[nargc] ;
-	unsigned int m = 0 ;
-	
-	newargv[m++] = "fake_name" ;
-	newargv[m++] = "-d" ;
-	newargv[m++] = info->treename.s ;
-	newargv[m++] = 0 ;
-				
-	if (ssexec_init(nargc,newargv,envp,info))
-	{
-		VERBO1 strerr_warnwu2x("init rc services for tree: ",info->treename.s) ;
-		return 0 ;
-	}
-	
-	VERBO1 strerr_warnt2x("reload scandir: ",info->scandir.s) ;
-	r = s6_svc_writectl(info->scandir.s, S6_SVSCAN_CTLDIR, "an", 2) ;
-	if (r < 0)
-	{
-		VERBO1 strerr_warnw3sys("something is wrong with the ",info->scandir.s, "/" S6_SVSCAN_CTLDIR " directory. errno reported") ;
-		return 0 ;
-	}
-	
-	return 1 ;
-}
-
 int rc_sanitize(ssexec_t *info,genalloc *ga, char const *const *envp)
 {
 	genalloc toreload = GENALLOC_ZERO ; //stralist
@@ -278,7 +228,7 @@ int rc_sanitize(ssexec_t *info,genalloc *ga, char const *const *envp)
 			}
 		}
 	}
-	if (genalloc_len(stralist,&toreload))
+	if (genalloc_len(ss_resolve_t,&toreload))
 	{		
 		if (!db_switch_to(info,envp,SS_SWBACK))
 		{
@@ -303,21 +253,9 @@ int rc_sanitize(ssexec_t *info,genalloc *ga, char const *const *envp)
 			goto err ;
 		}
 		
-		int nargc = 3 + genalloc_len(ss_resolve_t,&toreload) ;
-		char const *newargv[nargc] ;
-		unsigned int m = 0 ;
-		
-		newargv[m++] = "fake_name" ;
-		newargv[m++] = "-d" ;
-
-		for (unsigned int i = 0; i < genalloc_len(ss_resolve_t,&toreload) ; i++)
-			newargv[m++] = genalloc_s(ss_resolve_t,&toreload)[i].sa.s + genalloc_s(ss_resolve_t,&toreload)[i].name ;
-				
-		newargv[m++] = 0 ;
-			
-		if (ssexec_dbctl(nargc,newargv,envp,info))
+		if (!rc_send(info,&toreload,"-d",envp))
 		{
-			VERBO1 strerr_warnwu1x("bring down service list") ;
+			VERBO1 strerr_warnwu1x("bring down services") ;
 			goto err ;
 		}
 	}
@@ -335,7 +273,7 @@ int rc_sanitize(ssexec_t *info,genalloc *ga, char const *const *envp)
 int rc_start(ssexec_t *info,genalloc *ga,char const *const *envp)
 {
 	s6_svstatus_t status = S6_SVSTATUS_ZERO ;
-	
+	char *s = 0 ;
 	int r = db_find_compiled_state(info->livetree.s,info->treename.s) ;
 	if (r)
 	{
@@ -344,28 +282,14 @@ int rc_start(ssexec_t *info,genalloc *ga,char const *const *envp)
 	}
 	/** reverse to start first the logger */
 	genalloc_reverse(ss_resolve_t,ga) ;
-	
-	int nargc = 3 + genalloc_len(ss_resolve_t,ga) ;
-	char const *newargv[nargc] ;
-	unsigned int m = 0 ;
-	
-	newargv[m++] = "fake_name" ;
-	if (RELOAD == 1) 
-		newargv[m++] = "-r" ;
-	else
-		newargv[m++] = "-u" ;
-		
-	for (unsigned int i = 0; i < genalloc_len(ss_resolve_t,ga) ; i++)
-		newargv[m++] = genalloc_s(ss_resolve_t,ga)[i].sa.s + genalloc_s(ss_resolve_t,ga)[i].name ;
-
-	newargv[m++] = 0 ;
-	
-	if (ssexec_dbctl(nargc,newargv,envp,info))
+	if (RELOAD == 1) s = "-r" ;
+	else s = "-u" ;
+	if (!rc_send(info,ga,s,envp))
 	{
-		VERBO3 strerr_warnwu1x("bring up service list") ;
+		VERBO1 strerr_warnwu1x("bring down services") ;
 		return 0 ;
 	}
-		
+	
 	if (!ss_resolve_pointo(&sares,info,SS_NOTYPE,SS_RESOLVE_SRC))
 	{
 		VERBO1 strerr_warnwu1sys("set revolve pointer to source") ;
@@ -385,23 +309,23 @@ int rc_start(ssexec_t *info,genalloc *ga,char const *const *envp)
 		{
 			if (!s6_svstatus_read(string + genalloc_s(ss_resolve_t,ga)[i].runat,&status))
 			{ 
-				VERBO3 strerr_warnwu2sys("read status of: ",name) ;
+				VERBO1 strerr_warnwu2sys("read status of: ",name) ;
 				return 0 ;
 			}
 			genalloc_s(ss_resolve_t,ga)[i].pid = status.pid ;
 		}
-		VERBO2 strerr_warnt2x("Write resolve file of: ",name) ;
+		VERBO2 strerr_warni2x("Write resolve file of: ",name) ;
 		if (!ss_resolve_write(&genalloc_s(ss_resolve_t,ga)[i],sares.s,name))
 		{
-			VERBO3 strerr_warnwu2sys("write resolve file of: ",name) ;
+			VERBO1 strerr_warnwu2sys("write resolve file of: ",name) ;
 			return 0 ;
 		}
 		if (genalloc_s(ss_resolve_t,ga)[i].logger) 
 		{
-			VERBO2 strerr_warnt2x("Write logger resolve file of: ",name) ;
+			VERBO2 strerr_warni2x("Write logger resolve file of: ",name) ;
 			if (!ss_resolve_setlognwrite(&genalloc_s(ss_resolve_t,ga)[i],sares.s))
 			{
-				VERBO2 strerr_warnwu2sys("write logger resolve file of: ",name) ;
+				VERBO1 strerr_warnwu2sys("write logger resolve file of: ",name) ;
 				return 0 ;
 			}
 		}
@@ -449,7 +373,7 @@ int ssexec_start(int argc, char const *const *argv,char const *const *envp,ssexe
 	if (info->timeout) DEADLINE = info->timeout ;
 	
 	if ((scandir_ok(info->scandir.s)) !=1 ) strerr_dief3sys(111,"scandir: ", info->scandir.s," is not running") ;
-	
+
 	{
 		if (!ss_resolve_pointo(&sares,info,SS_NOTYPE,SS_RESOLVE_SRC)) strerr_diefu1sys(111,"set revolve pointer to source") ;
 		
diff --git a/src/lib66/ssexec_stop.c b/src/lib66/ssexec_stop.c
index ed341383..731f8b73 100644
--- a/src/lib66/ssexec_stop.c
+++ b/src/lib66/ssexec_stop.c
@@ -43,8 +43,10 @@
 #include <66/constants.h>
 #include <66/enum.h>
 #include <66/svc.h>
+#include <66/rc.h>
 #include <66/backup.h>
 #include <66/ssexec.h>
+#include <66/resolve.h>
 
 #include <stdio.h>
 
@@ -52,279 +54,193 @@
 static unsigned int DEADLINE = 0 ;
 static unsigned int UNSUP = 0 ;
 static char *SIG = "-D" ;
-static stralloc saresolve = STRALLOC_ZERO ;
-genalloc gatoremove = GENALLOC_ZERO ;//stralist
-genalloc gaunsup = GENALLOC_ZERO ; //stralist
+static stralloc sares = STRALLOC_ZERO ;
+static genalloc nclassic = GENALLOC_ZERO ;//ss_resolve_t
+static genalloc nrc = GENALLOC_ZERO ;//ss_resolve_t
 
-int svc_release(ssexec_t *info)
+int svc_down(ssexec_t *info,genalloc *ga,char const *const *envp)
 {
-	if (genalloc_len(stralist,&gaunsup))
-	{
-		for (unsigned int i = 0; i < genalloc_len(stralist,&gaunsup); i++)
-		{
-			char const *svname = gaistr(&gaunsup,i) ;
-			size_t svnamelen = gaistrlen(&gaunsup,i) ;
-	
-			char rm[info->scandir.len + 1 + svnamelen + 1] ;
-			memcpy(rm,info->scandir.s,info->scandir.len) ;
-			rm[info->scandir.len] = '/' ;
-			memcpy(rm + info->scandir.len + 1, svname,svnamelen) ;
-			rm[info->scandir.len + 1 + svnamelen] = 0 ;
-			VERBO3 strerr_warnt2x("unsupervise: ",rm) ;
-			if (rm_rf(rm) < 0)
-			{
-				VERBO3 strerr_warnwu2sys("delete directory: ",rm) ;
-				return 0 ;
-			}
-		}
-	}
+	genalloc tounsup = GENALLOC_ZERO ; //stralist
 	
-	if (!resolve_pointo(&saresolve,info,0,SS_RESOLVE_SRC))
-	{
-		VERBO3 strerr_warnwu1x("set revolve pointer to source") ;
-		return 0 ;
-	}
+	ss_resolve_t_ref pres ;
 	
-	if (genalloc_len(stralist,&gatoremove))
+	for (unsigned int i = 0; i < genalloc_len(ss_resolve_t,ga) ; i++)
 	{
-		for (unsigned int i = 0; i < genalloc_len(stralist,&gatoremove); i++)
-		{
-			char const *svname = gaistr(&gatoremove,i) ;
-			
-			if (!resolve_remove_service(saresolve.s,svname))
+		pres = &genalloc_s(ss_resolve_t,ga)[i] ;
+		char *name = pres->sa.s + pres->name ; 
+		if (pres->unsupervise) 
+		{	
+			if (!genalloc_append(ss_resolve_t,&tounsup,pres))
 			{
-				VERBO3 strerr_warnwu4sys("delete resolve service file: ",saresolve.s,"/.resolve/",svname) ;
-				return 0 ;
+				VERBO1 strerr_warnwu3x("add: ",name," on genalloc") ;
+				goto err ;
 			}
 		}
 	}
 	
-	return 1 ;
-}
-
-int svc_down(ssexec_t *info,genalloc *ga,char const *const *envp)
-{
-	genalloc tot = GENALLOC_ZERO ; //stralist
-		
-	for (unsigned int i = 0 ; i < genalloc_len(svstat_t,ga) ; i++) 
+	if (genalloc_len(ss_resolve_t,&tounsup))
 	{
-		char const *svname = genalloc_s(svstat_t,ga)[i].name ;
-		int torm = genalloc_s(svstat_t,ga)[i].remove ;
-		int unsup = genalloc_s(svstat_t,ga)[i].unsupervise ;
-		
-		if (!stra_add(&tot,svname))
+		UNSUP = 1 ;
+		if (!svc_shutnremove(info,&tounsup,SIG,envp)) return 0 ;
+		if (!ss_resolve_pointo(&sares,info,SS_NOTYPE,SS_RESOLVE_SRC))
 		{
-			VERBO3 strerr_warnwu3x("add: ",svname," as service to shutdown") ;
-			return 0 ;
+			VERBO1 strerr_warnwu1sys("set revolve pointer to source") ;
+			goto err ;
 		}
-		
-		/** need to remove?*/
-		if (torm)
+		for (unsigned int i = 0 ; i < genalloc_len(ss_resolve_t,&tounsup) ; i++)
 		{
-			if (!stra_add(&gatoremove,svname))
+			char const *string = genalloc_s(ss_resolve_t,&tounsup)[i].sa.s ;
+			char const *name = string + genalloc_s(ss_resolve_t,&tounsup)[i].name  ;
+			int logname = get_rstrlen_until(name,SS_LOG_SUFFIX) ;
+			if (logname > 0) continue ;
+			VERBO2 strerr_warni2x("Removing resolve file of: ",name) ;
+			if (!ss_resolve_rmfile(&genalloc_s(ss_resolve_t,&tounsup)[i],sares.s,name))
 			{
-				VERBO3 strerr_warnwu3x("add: ",svname," as service to delete") ;
-				return 0 ;
+				VERBO1 strerr_warnwu2sys("remove resolve file of: ",name) ;
+				goto err ;
 			}
 		}
-		/** unsupervise */
-		if (unsup)
-		{
-			if (!stra_add(&gaunsup,svname))
-			{
-				VERBO3 strerr_warnwu3x("add: ",svname," as service to unsupervise") ;
-				return 0 ;
-			}
-		}
-		/** logger */
-		if (!resolve_pointo(&saresolve,info,0,SS_RESOLVE_SRC))
+	}
+	else
+	{
+		if (!svc_send(info,ga,SIG,envp))
 		{
-			VERBO3 strerr_warnwu1x("set revolve pointer to source") ;
-			return 0 ;
+			VERBO1 strerr_warnwu1x("bring down services") ;
+			goto err ;
 		}
-		if (resolve_read(&saresolve,saresolve.s,svname,"logger"))
+				
+		if (!ss_resolve_pointo(&sares,info,SS_NOTYPE,SS_RESOLVE_SRC)) strerr_diefu1sys(111,"set revolve pointer to source") ;
+		for (unsigned int i = 0; i < genalloc_len(ss_resolve_t,ga) ; i++)
 		{
-			if (!stra_add(&tot,saresolve.s))
+			char *string = genalloc_s(ss_resolve_t,ga)[i].sa.s ;
+			char *name = string + genalloc_s(ss_resolve_t,ga)[i].name ;
+			genalloc_s(ss_resolve_t,ga)[i].reload = 0 ;
+			genalloc_s(ss_resolve_t,ga)[i].init = 0 ;
+			genalloc_s(ss_resolve_t,ga)[i].run = 1 ;
+			genalloc_s(ss_resolve_t,ga)[i].unsupervise = 0 ;
+			genalloc_s(ss_resolve_t,ga)[i].pid = 0 ;
+			VERBO2 strerr_warni2x("Write resolve file of: ",name) ;
+			if (!ss_resolve_write(&genalloc_s(ss_resolve_t,ga)[i],sares.s,name))
 			{
-				VERBO3 strerr_warnwu3x("add: ",saresolve.s," as service to shutdown") ;
-				return 0 ;
-			}
-			if (torm)
-			{
-				if (!stra_add(&gatoremove,saresolve.s))
-				{
-					VERBO3 strerr_warnwu3x("add logger of: ",saresolve.s," as service to delete") ;
-					return 0 ;
-				}
+				VERBO1 strerr_warnwu2sys("write resolve file of: ",name) ;
+				goto err ;
 			}
-			if (unsup)
+			if (genalloc_s(ss_resolve_t,ga)[i].logger)
 			{
-				if (!stra_add(&gaunsup,svname))
+				VERBO2 strerr_warni2x("Write logger resolve file of: ",name) ;
+				if (!ss_resolve_setlognwrite(&genalloc_s(ss_resolve_t,ga)[i],sares.s))
 				{
-					VERBO3 strerr_warnwu3x("add: ",saresolve.s," as service to unsupervise") ;
-					return 0 ;
+					VERBO1 strerr_warnwu2sys("write logger resolve file of: ",name) ;
+					goto err ;
 				}
 			}
 		}
 	}
-	int nargc = 3 + genalloc_len(stralist,&tot) ;
-	char const *newargv[nargc] ;
-	unsigned int m = 0 ;
-
-	newargv[m++] = "fake_name" ;
-	newargv[m++] = SIG ;
-	for (unsigned int i = 0 ; i < genalloc_len(stralist,&tot) ; i++) 
-		newargv[m++] = gaistr(&tot,i) ;
-	
-	newargv[m++] = 0 ;
-	
-	if (ssexec_svctl(nargc,newargv,envp,info))
-	{
-		VERBO3 strerr_warnwu1x("shutdown list of services") ;
-		return 0 ;
-	}
-		
-	if (!resolve_pointo(&saresolve,info,0,SS_RESOLVE_SRC))
-	{
-		VERBO3 strerr_warnwu1x("set revolve pointer to source") ;
-		return 0 ;
-	}
-	for (unsigned int i = 0; i < genalloc_len(svstat_t,ga) ; i++)
-	{
-		VERBO3 strerr_warnt2x("delete remove resolve file for: ",genalloc_s(svstat_t,ga)[i].name) ;
-		if (!resolve_remove(saresolve.s,genalloc_s(svstat_t,ga)[i].name,"remove"))
-		{
-			VERBO3 strerr_warnwu3sys("delete resolve file",saresolve.s,"/remove") ;
-			return 0 ;
-		}
-	}
-	
-	genalloc_deepfree(stralist,&tot,stra_free) ;
 	
+	genalloc_free(ss_resolve_t,&tounsup) ;
 	return 1 ;
-	
+	err: 
+		genalloc_free(ss_resolve_t,&tounsup) ;
+		return 0 ;
 }
-int rc_release(ssexec_t *info)
-{
 
-	if (!resolve_pointo(&saresolve,info,0,SS_RESOLVE_SRC))
-	{
-		VERBO3 strerr_warnwu1x("set revolve pointer to source") ;
-		return 0 ;
-	}
-	if (genalloc_len(stralist,&gatoremove))
+
+int rc_down(ssexec_t *info,genalloc *ga,char const *const *envp)
+{
+	genalloc tounsup = GENALLOC_ZERO ; //stralist
+	
+	ss_resolve_t_ref pres ;
+	
+	for (unsigned int i = 0; i < genalloc_len(ss_resolve_t,ga) ; i++)
 	{
-		for (unsigned int i = 0; i < genalloc_len(stralist,&gatoremove); i++)
-		{
-			char const *svname = gaistr(&gatoremove,i) ;
-			
-			if (!resolve_remove_service(saresolve.s,svname))
+		pres = &genalloc_s(ss_resolve_t,ga)[i] ;
+		char *name = pres->sa.s + pres->name ; 
+		if (pres->unsupervise) 
+		{	
+			if (!genalloc_append(ss_resolve_t,&tounsup,pres))
 			{
-				VERBO3 strerr_warnwu4sys("delete resolve service file: ",saresolve.s,"/.resolve/",svname) ;
-				return 0 ;
+				VERBO1 strerr_warnwu3x("add: ",name," on genalloc") ;
+				goto err ;
 			}
 		}
 	}
-	
-	return 1 ;
-}
-
-int rc_down(ssexec_t *info,genalloc *ga,char const *const *envp)
-{
-	size_t treenamelen = strlen(info->treename) ;
-	
-	genalloc tot = GENALLOC_ZERO ; //stralist
-
-	for (unsigned int i = 0 ; i < genalloc_len(svstat_t,ga) ; i++) 
+	if (genalloc_len(ss_resolve_t,&tounsup))
 	{
-		
-		char const *svname = genalloc_s(svstat_t,ga)[i].name ;
-		int torm = genalloc_s(svstat_t,ga)[i].remove ;
-		
-		if (!stra_add(&tot,svname))
+		UNSUP = 1 ;
+		if (!rc_send(info,&tounsup,"-d",envp))
 		{
-			VERBO3 strerr_warnwu3x("add: ",svname," as service to shutdown") ;
-			return 0 ;
+			VERBO1 strerr_warnwu1x("bring down services") ;
+			goto err ;
 		}
-		
-		/** need to remove?*/
-		if (torm)
+		if (!db_switch_to(info,envp,SS_SWSRC))
+		{
+			VERBO1 strerr_warnwu3x("switch ",info->treename.s," to backup") ;
+			goto err ;
+		}
+		if (!ss_resolve_pointo(&sares,info,SS_NOTYPE,SS_RESOLVE_SRC))
 		{
-			if (!stra_add(&gatoremove,svname))
+			VERBO1 strerr_warnwu1sys("set revolve pointer to source") ;
+			goto err ;
+		}
+		for (unsigned int i = 0 ; i < genalloc_len(ss_resolve_t,&tounsup) ; i++)
+		{
+			char const *string = genalloc_s(ss_resolve_t,&tounsup)[i].sa.s ;
+			char const *name = string + genalloc_s(ss_resolve_t,&tounsup)[i].name  ;
+			int logname = get_rstrlen_until(name,SS_LOG_SUFFIX) ;
+			if (logname > 0) continue ;
+			VERBO2 strerr_warni2x("Removing resolve file of: ",name) ;
+			if (!ss_resolve_rmfile(&genalloc_s(ss_resolve_t,&tounsup)[i],sares.s,name))
 			{
-				VERBO3 strerr_warnwu3x("add: ",svname," as service to delete") ;
-				return 0 ;
+				VERBO1 strerr_warnwu2sys("remove resolve file of: ",name) ;
+				goto err ;
 			}
 		}
-		/** logger */
-		if (!resolve_pointo(&saresolve,info,0,SS_RESOLVE_SRC))
+	}
+	else
+	{	
+		if (!rc_send(info,ga,"-d",envp))
+		{
+			VERBO1 strerr_warnwu1x("bring down services") ;
+			goto err ;
+		}
+		
+		if (!ss_resolve_pointo(&sares,info,SS_NOTYPE,SS_RESOLVE_SRC))
 		{
-			VERBO3 strerr_warnwu1x("set revolve pointer to source") ;
-			return 0 ;
+			VERBO1 strerr_warnwu1sys("set revolve pointer to source") ;
+			goto err ;
 		}
-		if (resolve_read(&saresolve,saresolve.s,svname,"logger"))
+		for (unsigned int i = 0; i < genalloc_len(ss_resolve_t,ga) ; i++)
 		{
-			if (!stra_add(&tot,saresolve.s))
+			char *string = genalloc_s(ss_resolve_t,ga)[i].sa.s ;
+			char *name = string + genalloc_s(ss_resolve_t,ga)[i].name ;
+			
+			genalloc_s(ss_resolve_t,ga)[i].reload = 0 ;
+			genalloc_s(ss_resolve_t,ga)[i].init = 0 ;
+			genalloc_s(ss_resolve_t,ga)[i].run = 1 ;
+			genalloc_s(ss_resolve_t,ga)[i].unsupervise = 0 ;
+			genalloc_s(ss_resolve_t,ga)[i].pid = 0 ;
+			VERBO2 strerr_warni2x("Write resolve file of: ",name) ;
+			if (!ss_resolve_write(&genalloc_s(ss_resolve_t,ga)[i],sares.s,name))
 			{
-				VERBO3 strerr_warnwu3x("add: ",saresolve.s," as service to shutdown") ;
-				return 0 ;
+				VERBO1 strerr_warnwu2sys("write resolve file of: ",name) ;
+				goto err ;
 			}
-			if (torm)
+			if (genalloc_s(ss_resolve_t,ga)[i].logger)
 			{
-				if (!stra_add(&gatoremove,saresolve.s))
+				VERBO2 strerr_warni2x("Write logger resolve file of: ",name) ;
+				if (!ss_resolve_setlognwrite(&genalloc_s(ss_resolve_t,ga)[i],sares.s))
 				{
-					VERBO3 strerr_warnwu3x("add logger of: ",saresolve.s," as service to delete") ;
-					return 0 ;
+					VERBO1 strerr_warnwu2sys("write logger resolve file of: ",name) ;
+					goto err ;
 				}
 			}
 		}
 	}
-	
-	char db[info->livetree.len + 1 + treenamelen + 1] ;
-	memcpy(db,info->livetree.s,info->livetree.len) ;
-	db[info->livetree.len] = '/' ;
-	memcpy(db + info->livetree.len + 1, info->treename, treenamelen) ;
-	db[info->livetree.len + 1 + treenamelen] = 0 ;
-	
-	if (!db_ok(info->livetree.s, info->treename))
-		strerr_dief2x(111,db," is not initialized") ;
-		
-	int nargc = 3 + genalloc_len(stralist,&tot) ;
-	char const *newargv[nargc] ;
-	unsigned int m = 0 ;
-	
-	newargv[m++] = "fake_name" ;
-	newargv[m++] = "-d" ;
-	
-	for (unsigned int i = 0; i < genalloc_len(stralist,&tot) ; i++)
-			newargv[m++] = gaistr(&tot,i) ;
-		
-	newargv[m++] = 0 ;
-	
-	if (ssexec_dbctl(nargc,newargv,envp,info))
-	{
-		VERBO3 strerr_warnwu1x("bring down service list") ;
-		return 0 ;
-	}
-	
-	if (!resolve_pointo(&saresolve,info,0,SS_RESOLVE_SRC))
-	{
-		VERBO3 strerr_warnwu1x("set revolve pointer to source") ;
-		return 0 ;
-	}
-	for (unsigned int i = 0; i < genalloc_len(svstat_t,ga) ; i++)
-	{
-		VERBO3 strerr_warnt2x("delete remove resolve file for: ",genalloc_s(svstat_t,ga)[i].name) ;
-		if (!resolve_remove(saresolve.s,genalloc_s(svstat_t,ga)[i].name,"remove"))
-		{
-			VERBO3 strerr_warnwu3sys("delete resolve file",saresolve.s,"/remove") ;
-			return 0 ;
-		}
-	}
-
-	genalloc_deepfree(stralist,&tot,stra_free) ;
-	
+	genalloc_free(ss_resolve_t,&tounsup) ;
 	return 1 ;
+	err: 
+		genalloc_free(ss_resolve_t,&tounsup) ;
+		return 0 ;
 }
 
 int ssexec_stop(int argc, char const *const *argv,char const *const *envp,ssexec_t *info)
@@ -333,20 +249,14 @@ int ssexec_stop(int argc, char const *const *argv,char const *const *envp,ssexec
 	DEADLINE = 0 ;
 	UNSUP = 0 ;
 	SIG = "-D" ;
-	saresolve = stralloc_zero ;
-	gatoremove = genalloc_zero ;//stralist
-	gaunsup = genalloc_zero ; //stralist
-
-	int r, rb, sigopt ;
-		
-	stralloc svok = STRALLOC_ZERO ;
+	sares.len = 0 ;
 	
-	genalloc nclassic = GENALLOC_ZERO ;
-	genalloc nrc = GENALLOC_ZERO ;
-	
-	sigopt = 0 ;
+	int cl, rc, sigopt, mainunsup ;
+			
+	ss_resolve_t_ref pres ;
+
+	cl = rc = sigopt = mainunsup = 0 ;
 	
-	//PROG = "66-stop" ;
 	{
 		subgetopt_t l = SUBGETOPT_ZERO ;
 
@@ -358,7 +268,7 @@ int ssexec_stop(int argc, char const *const *argv,char const *const *envp,ssexec
 
 			switch (opt)
 			{
-				case 'u' :	UNSUP = 1 ; break ;
+				case 'u' :	UNSUP = 1 ; mainunsup = 1 ; break ;
 				case 'X' :	if (sigopt) exitusage(usage_stop) ; sigopt = 1 ; SIG = "-X" ; break ;
 				case 'K' :	if (sigopt) exitusage(usage_stop) ; sigopt = 1 ; SIG = "-K" ; break ;
 				default : exitusage(usage_stop) ; 
@@ -373,113 +283,94 @@ int ssexec_stop(int argc, char const *const *argv,char const *const *envp,ssexec
 	
 	if ((scandir_ok(info->scandir.s)) !=1 ) strerr_dief3sys(111,"scandir: ", info->scandir.s," is not running") ;
 	
-	if (!stralloc_catb(&svok,info->scandir.s,info->scandir.len)) retstralloc(111,"main") ; 
-	if (!stralloc_cats(&svok,"/")) retstralloc(111,"main") ; 
-	size_t svoklen = svok.len ;
-	
 	{
-		stralloc type = STRALLOC_ZERO ;
-		svstat_t svsrc = SVSTAT_ZERO ;
+		if (!ss_resolve_pointo(&sares,info,SS_NOTYPE,SS_RESOLVE_SRC)) strerr_diefu1sys(111,"set revolve pointer to source") ;
 		
 		for(;*argv;argv++)
 		{
-			svsrc.type = 0 ;
-			svsrc.name = 0 ;
-			svsrc.namelen = 0 ;
-			svsrc.remove = 0 ;
-			svsrc.unsupervise = 0 ;
-			svok.len = svoklen ;
+			char const *name = *argv ;
+			
+			ss_resolve_t res = RESOLVE_ZERO ;
+			pres = &res ;
+			if (!ss_resolve_check(info,name,SS_RESOLVE_SRC)) 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 (!resolve_pointo(&saresolve,info,0,SS_RESOLVE_SRC))
-				strerr_diefu1x(111,"set revolve pointer to source") ;
-			rb = resolve_read(&type,saresolve.s,*argv,"type") ;
-			if (rb < -1) strerr_dief2x(111,"invalid .resolve directory: ",saresolve.s) ;
-			if (rb < 0)
+			int logname = get_rstrlen_until(name,SS_LOG_SUFFIX) ;
+			
+			if (obstr_equal(name,SS_MASTER + 1)) goto run ;
+			/** special case, enabling->starting->stopping->disabling
+			 * make an orphan service.
+			 * check if it's the case and force to stop it*/
+			if (!res.run) strerr_dief2x(110,name," : is not running, try 66-start before") ;
+			if (logname > 0)
 			{
-				if (!resolve_pointo(&saresolve,info,0,SS_RESOLVE_BACK))
-					strerr_diefu1x(111,"set revolve pointer to backup") ;
-				r = resolve_read(&type,saresolve.s,*argv,"type") ;
-				if (r < -1) strerr_diefu2sys(111,"invalid .resolve directory: ",saresolve.s) ; 
-				if (r > 0) svsrc.remove = 1 ;
-				if (r <= 0) strerr_dief2x(111,*argv,": is not enabled") ;
+				if (UNSUP)
+				{
+					strerr_warnw1x("logger detected - ignoring unsupervise request") ;
+				}
+				res.unsupervise = 0 ;
 			}
-			if (rb > 0)
+			
+			if (UNSUP && res.type >= BUNDLE && !res.unsupervise)
 			{
-				svsrc.type = get_enumbyid(type.s,key_enum_el) ;
-				svsrc.name = *argv ;
-				svsrc.namelen = strlen(*argv) ;
-				r = resolve_read(&type,saresolve.s,*argv,"remove") ;
-				if (r < -1) strerr_diefu2sys(111,"invalid .resolve directory: ",saresolve.s) ;
-				if (r > 0) svsrc.remove = 1 ;
-			/*	if (!resolve_pointo(&saresolve,info,0,SS_RESOLVE_BACK))
-					strerr_diefu1x(111,"set revolve pointer to backup") ;
-				r = resolve_read(&type,saresolve.s,*argv,"type") ;
-				if (r <= 0 && !UNSUP) strerr_dief3x(111,"service: ",*argv," is not running, you can only start it") ;*/
+				strerr_warnw2x(get_keybyid(res.type)," detected - ignoring unsupervise request") ;
+				res.unsupervise = 0 ;
+				UNSUP = 0 ;
 			}
-			if (svsrc.type == CLASSIC)
+				
+			if (UNSUP) res.unsupervise = 1 ;
+						
+			run:
+			if (res.type == CLASSIC)
 			{
-				if (!stralloc_cats(&svok,*argv)) retstralloc(111,"main") ; 
-				if (!stralloc_0(&svok)) retstralloc(111,"main") ; 
-				r = s6_svc_ok(svok.s) ;
-				if (r < 0) strerr_diefu2sys(111,"check ", svok.s) ;
-				//if (!r)	svsrc.remove = 1 ;
-				if (!r) strerr_dief3x(111,"service: ",*argv," is not running, you can only start it") ;
-			}
-			
-			if (UNSUP) svsrc.unsupervise = 1 ;
-			if (svsrc.remove) svsrc.unsupervise = 1 ;
-			
-			if (svsrc.type == CLASSIC)
-			{
-				if (!genalloc_append(svstat_t,&nclassic,&svsrc)) strerr_diefu3x(111,"add: ",*argv," on genalloc") ;				
+				if (!genalloc_append(ss_resolve_t,&nclassic,&res)) strerr_diefu3x(111,"add: ",name," on genalloc") ;
+				if (!ss_resolve_setlognwrite(&res,sares.s)) strerr_diefu2sys(111,"set logger of: ",name) ;
+				if (!ss_resolve_addlogger(info,&nclassic)) strerr_diefu2sys(111,"add logger of: ",name) ;
+				cl++ ;
 			}
 			else
 			{
-				if (!genalloc_append(svstat_t,&nrc,&svsrc)) strerr_diefu3x(111,"add: ",*argv," on genalloc") ;
+				if (!genalloc_append(ss_resolve_t,&nrc,&res)) strerr_diefu3x(111,"add: ",name," on genalloc") ;
+				if (!ss_resolve_setlognwrite(&res,sares.s)) strerr_diefu2sys(111,"set logger of: ",name) ;
+				if (!ss_resolve_addlogger(info,&nrc)) strerr_diefu2sys(111,"add logger of: ",name) ;
+				rc++;
 			}
 		}
-		stralloc_free(&type) ;
-		stralloc_free(&svok) ;
+		stralloc_free(&sares) ;
 	}
-	
+	if (!cl && !rc) ss_resolve_free(pres) ;
 	/** rc work */
-	if (genalloc_len(svstat_t,&nrc))
+	if (rc)
 	{
-		VERBO2 strerr_warni1x("stop rc services ...") ;
+		VERBO1 strerr_warni1x("stop atomic services ...") ;
 		if (!rc_down(info,&nrc,envp))
-			strerr_diefu1x(111,"update rc services") ;
-		VERBO2 strerr_warni1x("release rc services ...") ;
-		if (!rc_release(info))
-			strerr_diefu1x(111,"release rc services") ;
-		VERBO2 strerr_warni3x("switch rc services of: ",info->treename," to source") ;
+			strerr_diefu1x(111,"update atomic services") ;
+		VERBO1 strerr_warni3x("switch atomic services of: ",info->treename.s," to source") ;
 		if (!db_switch_to(info,envp,SS_SWSRC))
-			strerr_diefu5x(111,"switch",info->livetree.s,"/",info->treename," to source") ;
+			strerr_diefu5x(111,"switch",info->livetree.s,"/",info->treename.s," to source") ;
+	
+		genalloc_deepfree(ss_resolve_t,&nrc,ss_resolve_free) ;
 	}
 	
 	/** svc work */
-	if (genalloc_len(svstat_t,&nclassic))
+	if (cl)
 	{
-		VERBO2 strerr_warni1x("stop svc services ...") ;
+		VERBO1 strerr_warni1x("stop classic services ...") ;
 		if (!svc_down(info,&nclassic,envp))
-			strerr_diefu1x(111,"update svc services") ;
-		VERBO2 strerr_warni1x("release svc services ...") ;
-		if (!svc_release(info))
-			strerr_diefu1x(111,"release svc services ...") ;
-		VERBO2 strerr_warni3x("switch svc services of: ",info->treename," to source") ;
+			strerr_diefu1x(111,"update classic services") ;
+		VERBO1 strerr_warni3x("switch classic services of: ",info->treename.s," to source") ;
 		if (!svc_switch_to(info,SS_SWSRC))
-			strerr_diefu3x(111,"switch svc service of: ",info->treename," to source") ;
+			strerr_diefu3x(111,"switch classic service of: ",info->treename.s," to source") ;
 		
+		genalloc_deepfree(ss_resolve_t,&nclassic,ss_resolve_free) ;
 	}
 		
-	if (UNSUP || genalloc_len(stralist,&gatoremove))
+	if (UNSUP)
 	{
-		VERBO2 strerr_warnt2x("send signal -an to scandir: ",info->scandir.s) ;
+		VERBO1 strerr_warnt2x("send signal -an to scandir: ",info->scandir.s) ;
 		if (scandir_send_signal(info->scandir.s,"an") <= 0)
 			strerr_diefu2sys(111,"send signal to scandir: ", info->scandir.s) ;
 	}
-	
-	genalloc_free(svstat_t,&nrc) ;
-	genalloc_free(svstat_t,&nclassic) ;
-	
+		
 	return 0 ;		
 }
-- 
GitLab