From 7302598b36e3e25b2ebb122e0964e55ef510c965 Mon Sep 17 00:00:00 2001
From: obarun <eric@obarun.org>
Date: Mon, 22 Oct 2018 14:10:08 +1100
Subject: [PATCH] service file is now into a directory, environment of the
 service is now by default at /etc/66/env/name_of_service

---
 Makefile                 |  15 +++---
 configure                |   1 +
 src/66/66-enable.c       |  37 ++++++++++++-
 src/include/66/parser.h  |  12 ++---
 src/lib66/parser.c       |  10 ++--
 src/lib66/parser_write.c | 112 ++++++++++++++++++++-------------------
 6 files changed, 114 insertions(+), 73 deletions(-)

diff --git a/Makefile b/Makefile
index 610dbb61..4e35b99b 100644
--- a/Makefile
+++ b/Makefile
@@ -53,15 +53,17 @@ AR := $(CROSS_COMPILE)ar
 RANLIB := $(CROSS_COMPILE)ranlib
 STRIP := $(CROSS_COMPILE)strip
 INSTALL := ./tools/install.sh
+ENV_TARGETS := $(servicedir)/env
 
 ALL_BINS := $(LIBEXEC_TARGETS) $(BIN_TARGETS)
 ALL_LIBS := $(SHARED_LIBS) $(STATIC_LIBS) $(INTERNAL_LIBS)
 ALL_INCLUDES := $(wildcard src/include/$(package)/*.h)
+ALL_ENV := $(DESTDIR)$(ENV_TARGETS)
 
 all: $(ALL_LIBS) $(ALL_BINS) $(ALL_INCLUDES)
 
 clean:
-	@exec rm -f $(ALL_LIBS) $(ALL_BINS) $(wildcard src/*/*.o src/*/*.lo) $(EXTRA_TARGETS)
+	@exec rm -f $(ALL_LIBS) $(ALL_BINS) $(wildcard src/*/*.o src/*/*.lo) $(EXTRA_TARGETS) $(ENV_TARGETS)
 
 distclean: clean
 	@exec rm -f config.mak src/include/$(package)/config.h
@@ -82,13 +84,14 @@ ifneq ($(strip $(ALL_BINS)$(SHARED_LIBS)),)
 	exec $(STRIP) -R .note -R .comment -R .note.GNU-stack $(ALL_BINS) $(SHARED_LIBS)
 endif
 
-install: install-dynlib install-libexec install-bin install-lib install-include
+install: install-dynlib install-libexec install-bin install-lib install-include install-env
 install-dynlib: $(SHARED_LIBS:lib%.so.xyzzy=$(DESTDIR)$(dynlibdir)/lib%.so)
 install-libexec: $(LIBEXEC_TARGETS:%=$(DESTDIR)$(libexecdir)/%)
 install-bin: $(BIN_TARGETS:%=$(DESTDIR)$(bindir)/%)
 install-lib: $(STATIC_LIBS:lib%.a.xyzzy=$(DESTDIR)$(libdir)/lib%.a)
 install-include: $(ALL_INCLUDES:src/include/$(package)/%.h=$(DESTDIR)$(includedir)/$(package)/%.h)
-install-data: $(ALL_DATA:src/etc/%=$(DESTDIR)$(datadir)/%)
+install-env: 
+	exec install -d -m 1777 $(ALL_ENV)
 
 ifneq ($(exthome),)
 
@@ -109,8 +112,8 @@ $(DESTDIR)$(sproot)/library.so/lib%.so.$(version_M): $(DESTDIR)$(dynlibdir)/lib%
 
 endif
 
-$(DESTDIR)$(datadir)/%: src/etc/%
-	exec $(INSTALL) -D -m 644 $< $@
+$(DESTDIR)$(servicedir)/%: src/etc/%
+	exec $(INSTALL) -D -m 1777 $< $@
 
 $(DESTDIR)$(dynlibdir)/lib%.so: lib%.so.xyzzy
 	$(INSTALL) -D -m 755 $< $@.$(version) && \
@@ -146,6 +149,6 @@ lib%.a.xyzzy:
 lib%.so.xyzzy:
 	exec $(REALCC) -o $@ $(CFLAGS_ALL) $(CFLAGS_SHARED) $(LDFLAGS_ALL) $(LDFLAGS_SHARED) -Wl,-soname,$(patsubst lib%.so.xyzzy,lib%.so.$(version_M),$@) $^ $(EXTRA_LIBS) $(LDLIBS)
 
-.PHONY: it all clean distclean tgz strip install install-dynlib install-bin install-lib install-include install-data
+.PHONY: it all clean distclean tgz strip install install-dynlib install-bin install-lib install-include install-env
 
 .DELETE_ON_ERROR:
diff --git a/configure b/configure
index eba5bb06..84696ee5 100755
--- a/configure
+++ b/configure
@@ -381,6 +381,7 @@ libexecdir := $libexecdir
 bindir := $bindir
 libdir := $libdir
 includedir := $includedir
+servicedir := $service_path
 slashpackage := $slashpackage
 sproot := $sproot
 version := $version
diff --git a/src/66/66-enable.c b/src/66/66-enable.c
index 7aca2718..febaf825 100644
--- a/src/66/66-enable.c
+++ b/src/66/66-enable.c
@@ -27,6 +27,8 @@
 #include <skalibs/genalloc.h>
 #include <skalibs/djbunix.h>
 #include <skalibs/buffer.h>
+#include <skalibs/direntry.h>
+#include <skalibs/unix-transactional.h>
 
 #include <66/constants.h>
 #include <66/utils.h>
@@ -72,6 +74,37 @@ static void cleanup(char const *dst)
 	errno = e ;
 }
 
+int dir_get_fromdir(genalloc *ga,char const *srcdir)
+{
+	int fdsrc ;
+	
+	DIR *dir = opendir(srcdir) ;
+	if (!dir)
+		return 0 ;
+	
+	fdsrc = dir_fd(dir) ;
+	
+	for (;;)
+    {
+		struct stat st ;
+		direntry *d ;
+		d = readdir(dir) ;
+		if (!d) break ;
+		if (d->d_name[0] == '.')
+		if (((d->d_name[1] == '.') && !d->d_name[2]) || !d->d_name[1])
+			continue ;
+		if (stat_at(fdsrc, d->d_name, &st) < 0)
+			return 0 ;
+		
+		if (S_ISDIR(st.st_mode)){
+				printf("d->d_name::%s\n",d->d_name) ;
+		
+			if (!stra_add(ga,d->d_name)) return 0 ;		 
+		}
+	}
+
+	return 1 ;
+}
 int main(int argc, char const *const *argv,char const *const *envp)
 {
 	int r ;
@@ -173,7 +206,7 @@ int main(int argc, char const *const *argv,char const *const *envp)
 	
 	/** get all service on sv_src directory*/
 	if (MULTI){
-		if (!file_get_fromdir(&gargv,sv_src.s)) strerr_diefu2sys(111,"get services from directory: ",sv_src.s) ;
+		if (!dir_get_fromdir(&gargv,sv_src.s)) strerr_diefu2sys(111,"get services from directory: ",sv_src.s) ;
 		MSTART = *argv ;
 	}
 	else{
@@ -210,7 +243,7 @@ int main(int argc, char const *const *argv,char const *const *envp)
 		for (unsigned int i = 0; i < before.nsv; i++)
 		{
 			VERBO2 strerr_warni3x("add ",keep.s + before.services[i].cname.name," service ...") ;
-			r = write_services(&before.services[i], workdir.s,tree.s,FORCE) ;
+			r = write_services(&before.services[i], workdir.s,FORCE) ;
 			if (!r)
 			{
 				cleanup(workdir.s) ;
diff --git a/src/include/66/parser.h b/src/include/66/parser.h
index aad379aa..eba8b063 100644
--- a/src/include/66/parser.h
+++ b/src/include/66/parser.h
@@ -308,23 +308,23 @@ extern int keep_runfinish(sv_exec *exec,keynocheck *nocheck) ;
 
 extern int keep_logger(sv_execlog *log,keynocheck *nocheck) ;
 
-extern int write_services(sv_alltype *sv, char const *workdir, char const *tree, unsigned int force) ;
+extern int write_services(sv_alltype *sv, char const *workdir, unsigned int force) ;
 
-extern int write_classic(char const *src, sv_alltype *sv, char const *dst, char const *tree, unsigned int force) ;
+extern int write_classic(char const *src, sv_alltype *sv, char const *dst, unsigned int force) ;
 
-extern int write_longrun(char const *src, sv_alltype *sv,char const *dst, char const *tree, unsigned int force) ;
+extern int write_longrun(char const *src, sv_alltype *sv,char const *dst, unsigned int force) ;
 
-extern int write_oneshot(char const *src, sv_alltype *sv,char const *dst, char const *tree, unsigned int force) ;
+extern int write_oneshot(char const *src, sv_alltype *sv,char const *dst, unsigned int force) ;
 
 extern int write_bundle(char const *src, sv_alltype *sv, char const *dst, unsigned int force) ;
 
 extern int write_common(sv_alltype *sv, char const *dst) ;
 
-extern int write_exec(sv_alltype *sv, sv_exec *exec,char const *name,char const *dst,int mode, char const *tree) ;
+extern int write_exec(sv_alltype *sv, sv_exec *exec,char const *name,char const *dst,int mode) ;
 
 extern int write_uint(char const *dst, char const *name, uint32_t ui) ;
 
-extern int write_logger(sv_alltype *sv, sv_execlog *log,char const *name, char const *dst, char const *svname,int mode, char const *tree, unsigned int force) ;
+extern int write_logger(sv_alltype *sv, sv_execlog *log,char const *name, char const *dst, char const *svname,int mode, unsigned int force) ;
 
 extern int write_consprod(sv_alltype *sv,char const *prodname,char const *consname,char const *proddst,char const *consdst) ;
 
diff --git a/src/lib66/parser.c b/src/lib66/parser.c
index 6739aa4a..c8487675 100644
--- a/src/lib66/parser.c
+++ b/src/lib66/parser.c
@@ -151,12 +151,14 @@ int parse_service_before(char const *src,char const *sv,char const *tree,strallo
 	sv_alltype sv_before = SV_ALLTYPE_ZERO ;
 	stralloc srctmp = STRALLOC_ZERO ;
 		
-	char svtmp[srclen + svlen + 1 + 1] ;
+	char svtmp[srclen + svlen + 1 + svlen + 1] ;
 	memcpy(svtmp,src,srclen) ;
-	memcpy(svtmp + srclen, "/", 1) ;
+	svtmp[srclen] = '/' ;
 	memcpy(svtmp + srclen + 1, sv, svlen) ;
-	svtmp[srclen + svlen + 1] = 0 ;
-
+	svtmp[srclen + svlen + 1] = '/' ;
+	memcpy(svtmp + srclen + 1 + svlen + 1, sv, svlen) ;
+	svtmp[srclen + 1 + svlen + 1 + svlen] = 0 ;
+	
 	size_t filesize=file_get_size(svtmp) ;
 	if (!filesize)
 	{
diff --git a/src/lib66/parser_write.c b/src/lib66/parser_write.c
index 9df2588b..2ebc8553 100644
--- a/src/lib66/parser_write.c
+++ b/src/lib66/parser_write.c
@@ -41,7 +41,7 @@
 /** @Return 0 on fail
  * @Return 1 on success
  * @Return 2 if the service is ignored */
-int write_services(sv_alltype *sv, char const *workdir, char const *tree, unsigned int force)
+int write_services(sv_alltype *sv, char const *workdir, unsigned int force)
 {
 	int r ;
 	
@@ -106,14 +106,14 @@ int write_services(sv_alltype *sv, char const *workdir, char const *tree, unsign
 	switch(type)
 	{
 		case CLASSIC:
-			if (!write_classic(workdir,sv, wname,tree, force))
+			if (!write_classic(workdir,sv, wname, force))
 			{
 				VERBO3 strerr_warnwu2x("write: ",wname) ;
 				return 0 ;
 			}
 			break ;
 		case LONGRUN:
-			if (!write_longrun(workdir,sv, wname,tree, force))
+			if (!write_longrun(workdir,sv, wname, force))
 			{
 				VERBO3 strerr_warnwu2x("write: ",wname) ;
 				return 0 ;
@@ -121,7 +121,7 @@ int write_services(sv_alltype *sv, char const *workdir, char const *tree, unsign
 			
 			break ;
 		case ONESHOT:
-			if (!write_oneshot(workdir,sv, wname,tree, force))
+			if (!write_oneshot(workdir,sv, wname, force))
 			{
 				VERBO3 strerr_warnwu2x("write: ",wname) ;
 				return 0 ;
@@ -187,7 +187,7 @@ int write_services(sv_alltype *sv, char const *workdir, char const *tree, unsign
 	return 1 ;
 }
 
-int write_classic(char const *src, sv_alltype *sv, char const *dst, char const *tree, unsigned int force)
+int write_classic(char const *src, sv_alltype *sv, char const *dst, unsigned int force)
 {	
 	/**notification,timeout, ...*/
 	if (!write_common(sv, dst))
@@ -196,7 +196,7 @@ int write_classic(char const *src, sv_alltype *sv, char const *dst, char const *
 		return 0 ;
 	}
 	/** run file*/
-	if (!write_exec(sv, &sv->type.classic_longrun.run,"run",dst,0755,tree))
+	if (!write_exec(sv, &sv->type.classic_longrun.run,"run",dst,0755))
 	{
 		VERBO3 strerr_warnwu3x("write: ",dst,"/run") ;
 		return 0 ;
@@ -204,7 +204,7 @@ int write_classic(char const *src, sv_alltype *sv, char const *dst, char const *
 	/** finish file*/
 	if (sv->type.classic_longrun.finish.exec) 
 	{	
-		if (!write_exec(sv, &sv->type.classic_longrun.finish,"finish",dst,0755,tree))
+		if (!write_exec(sv, &sv->type.classic_longrun.finish,"finish",dst,0755))
 		{
 			VERBO3 strerr_warnwu3x("write: ",dst,"/finish") ;
 			return 0 ;
@@ -213,7 +213,7 @@ int write_classic(char const *src, sv_alltype *sv, char const *dst, char const *
 	/**logger */
 	if (sv->opts[0])
 	{
-		if (!write_logger(sv, &sv->type.classic_longrun.log,"log",dst,keep.s+sv->cname.name,0755,tree,force))
+		if (!write_logger(sv, &sv->type.classic_longrun.log,"log",dst,keep.s+sv->cname.name,0755,force))
 		{
 			VERBO3 strerr_warnwu3x("write: ",dst,"/log") ;
 			return 0 ;
@@ -224,7 +224,7 @@ int write_classic(char const *src, sv_alltype *sv, char const *dst, char const *
 	return 1 ;
 }
 
-int write_longrun(char const *src, sv_alltype *sv,char const *dst, char const *tree, unsigned force)
+int write_longrun(char const *src, sv_alltype *sv,char const *dst, unsigned force)
 {	
 	size_t r ;
 	char *name = keep.s+sv->cname.name ;
@@ -240,7 +240,7 @@ int write_longrun(char const *src, sv_alltype *sv,char const *dst, char const *t
 		return 0 ;
 	}
 	/**run file*/
-	if (!write_exec(sv, &sv->type.classic_longrun.run,"run",dst,0644,tree))
+	if (!write_exec(sv, &sv->type.classic_longrun.run,"run",dst,0644))
 	{
 		VERBO3 strerr_warnwu3x("write: ",dst,"/run") ;
 		return 0 ;
@@ -249,7 +249,7 @@ int write_longrun(char const *src, sv_alltype *sv,char const *dst, char const *t
 	if (sv->type.classic_longrun.finish.exec) 
 	{
 		
-		if (!write_exec(sv, &sv->type.classic_longrun.finish,"finish",dst,0644,tree))
+		if (!write_exec(sv, &sv->type.classic_longrun.finish,"finish",dst,0644))
 		{
 			VERBO3 strerr_warnwu3x("write: ",dst,"/finish") ;
 			return 0 ;
@@ -265,7 +265,7 @@ int write_longrun(char const *src, sv_alltype *sv,char const *dst, char const *t
 		r = byte_search(dst,dstlen,keep.s+sv->cname.name,namelen) ;
 		memcpy(dstlog,dst,r) ;
 		dstlog[r] = 0 ;
-		if (!write_logger(sv, &sv->type.classic_longrun.log,logname,dstlog,keep.s+sv->cname.name,0644,tree,force)) 
+		if (!write_logger(sv, &sv->type.classic_longrun.log,logname,dstlog,keep.s+sv->cname.name,0644,force)) 
 		{
 			VERBO3 strerr_warnwu3x("write: ",dstlog,logname) ;
 			return 0 ;
@@ -288,7 +288,7 @@ int write_longrun(char const *src, sv_alltype *sv,char const *dst, char const *t
 	return 1 ;
 }
 
-int write_oneshot(char const *src, sv_alltype *sv,char const *dst, char const *tree, unsigned int force)
+int write_oneshot(char const *src, sv_alltype *sv,char const *dst, unsigned int force)
 {
 	
 	if (!write_common(sv, dst))
@@ -297,7 +297,7 @@ int write_oneshot(char const *src, sv_alltype *sv,char const *dst, char const *t
 		return 0 ;
 	}
 	/** up file*/
-	if (!write_exec(sv, &sv->type.oneshot.up,"up",dst,0644,tree))
+	if (!write_exec(sv, &sv->type.oneshot.up,"up",dst,0644))
 	{
 		VERBO3 strerr_warnwu3x("write: ",dst,"/up") ;
 		return 0 ;
@@ -305,7 +305,7 @@ int write_oneshot(char const *src, sv_alltype *sv,char const *dst, char const *t
 	/** down file*/
 	if (sv->type.oneshot.down.exec) 
 	{	
-		if (!write_exec(sv, &sv->type.oneshot.down,"down",dst,0644,tree))
+		if (!write_exec(sv, &sv->type.oneshot.down,"down",dst,0644))
 		{
 			VERBO3 strerr_warnwu3x("write: ",dst,"/down") ;
 			return 0 ;
@@ -339,7 +339,7 @@ int write_bundle(char const *src, sv_alltype *sv, char const *dst, unsigned int
 	return 1 ;
 }
 
-int write_logger(sv_alltype *sv, sv_execlog *log,char const *name, char const *dst, char const *svname,int mode, char const *tree, unsigned int force)
+int write_logger(sv_alltype *sv, sv_execlog *log,char const *name, char const *dst, char const *svname,int mode, unsigned int force)
 {
 	int r ;
 	int logbuild = log->run.build ;
@@ -529,7 +529,7 @@ int write_logger(sv_alltype *sv, sv_execlog *log,char const *name, char const *d
 			}
 			break;
 		case CUSTOM:
-			if (!write_exec(sv, &log->run,"run",ddst.s,mode,tree))
+			if (!write_exec(sv, &log->run,"run",ddst.s,mode))
 			{ 
 				VERBO3 strerr_warnwu3x("write: ",ddst.s,"/run") ;
 				return 0 ;
@@ -685,6 +685,7 @@ int write_dependencies(char const *src, sv_name_t *cname,char const *dst,char co
 
 int write_common(sv_alltype *sv, char const *dst)
 {
+	int r ;
 	char *time = NULL ;
 	
 	/**down file*/
@@ -759,13 +760,34 @@ int write_common(sv_alltype *sv, char const *dst)
 	/** environment */
 	if (sv->opts[2])
 	{
-		size_t dstlen = strlen(dst) ;
-		char env[dstlen + SS_ENVDIR_LEN +1] ;
-		memcpy(env,dst,dstlen) ;
-		memcpy(env + dstlen,SS_ENVDIR,SS_ENVDIR_LEN) ;
-		env[dstlen + SS_ENVDIR_LEN] = 0 ;
+		/** /etc/env/sv_name*/
+		size_t sslen = strlen(SS_SERVICEDIR) - 1 ;
+		char *name = keep.s + sv->cname.name ;
+		size_t namelen = strlen(name) ;
+		char dst[sslen + SS_ENVDIR_LEN +1 + namelen ] ;
+		memcpy(dst,SS_SERVICEDIR,sslen) ;
+		memcpy(dst + sslen,SS_ENVDIR,SS_ENVDIR_LEN) ;
+		dst[sslen + SS_ENVDIR_LEN] = 0 ;
+		r = scan_mode(dst,S_IFDIR) ;
+		if (r < 0)
+		{
+			VERBO3 strerr_warnwu2sys("invalid environment directory: ",dst) ;
+			return 0 ;
+		}
+		if (!r)
+		{
+			if (!dir_create(dst,0755))
+			{
+				VERBO3 strerr_warnwu2sys("create environment directory: ",dst) ;
+				return 0 ;
+			}
+		}
 		
-		if (!write_env(&sv->env,&saenv,env))
+		dst[sslen + SS_ENVDIR_LEN] = '/' ;
+		memcpy(dst + sslen + SS_ENVDIR_LEN + 1, name,namelen) ;
+		dst[sslen + SS_ENVDIR_LEN + 1 + namelen] = 0 ;
+		
+		if (!write_env(&sv->env,&saenv,dst))
 		{
 			VERBO3 strerr_warnwu1x("write environment") ;
 			return 0 ;
@@ -775,7 +797,7 @@ int write_common(sv_alltype *sv, char const *dst)
 }
 
 
-int write_exec(sv_alltype *sv, sv_exec *exec,char const *file,char const *dst,int mode, char const *tree)
+int write_exec(sv_alltype *sv, sv_exec *exec,char const *file,char const *dst,int mode)
 {
 	
 	unsigned int key, val ;
@@ -793,35 +815,15 @@ int write_exec(sv_alltype *sv, sv_exec *exec,char const *file,char const *dst,in
 	stralloc execute = STRALLOC_ZERO ;
 	
 	key = val = 0 ;
-	size_t treelen = strlen(tree) ;
-	size_t newtree ;
-	size_t longsize ;
-	if (treelen > dstlen) longsize = treelen ;
-	else longsize = dstlen ;
-	char envdata[longsize + SS_SVDIRS_LEN + 1 + SS_SYM_SVC_LEN + SS_SRC_LEN + 1 + namelen + 1] ;
-	memcpy(envdata,tree,treelen) ;
-	memcpy(envdata + treelen, SS_SVDIRS,SS_SVDIRS_LEN) ;
-	envdata[treelen + SS_SVDIRS_LEN] = '/' ;
-	newtree = treelen + SS_SVDIRS_LEN + 1 ;
-
-	if (type == CLASSIC)
-	{
-		memcpy(envdata + newtree, SS_SYM_SVC, SS_SYM_SVC_LEN) ;
-		envdata[newtree + SS_SYM_SVC_LEN] = '/' ;
-		memcpy(envdata + newtree + SS_SYM_SVC_LEN + 1, name,namelen) ;
-		newtree = newtree + SS_SYM_SVC_LEN + 1 + namelen ;
-	}
-	else
-	{
-		memcpy(envdata + newtree, SS_SYM_DB, SS_SYM_DB_LEN) ;
-		memcpy(envdata + newtree + SS_SYM_DB_LEN, SS_SRC,SS_SRC_LEN) ;
-		envdata[newtree + SS_SYM_DB_LEN + SS_SRC_LEN] = '/' ;
-		memcpy(envdata + newtree + SS_SYM_DB_LEN + SS_SRC_LEN + 1, name, namelen) ;
-		newtree = newtree + SS_SYM_DB_LEN + SS_SRC_LEN + 1 + namelen ;
-	}
-	memcpy(envdata + newtree, SS_ENVDIR,SS_ENVDIR_LEN) ;
-	envdata[newtree + SS_ENVDIR_LEN] = 0 ;
+	size_t envdstlen = strlen(SS_SERVICEDIR) - 1;
+	char envdata[envdstlen + SS_ENVDIR_LEN + 1 + namelen + 1] ;
+	memcpy(envdata,SS_SERVICEDIR,envdstlen) ;
+	memcpy(envdata + envdstlen, SS_ENVDIR,SS_ENVDIR_LEN) ;
+	envdata[envdstlen + SS_ENVDIR_LEN] = '/' ;
+	memcpy(envdata + envdstlen + SS_ENVDIR_LEN + 1, name,namelen) ;
+	envdata[envdstlen + SS_ENVDIR_LEN + 1 + namelen] = 0 ;
 	
+		
 	switch (exec->build)
 	{
 		case AUTO:
@@ -953,7 +955,7 @@ int write_env(genalloc *env,stralloc *sa,char const *dst)
 		{
 			if (!dir_create(dst,0755))
 			{
-				VERBO3 strerr_warnwu2sys("create environment directory: ",dst) ;
+				VERBO3 strerr_warnwu2sys("create service environment directory: ",dst) ;
 				return 0 ;
 			}
 		}
@@ -961,11 +963,11 @@ int write_env(genalloc *env,stralloc *sa,char const *dst)
 		{
 			key = genalloc_s(sv_env,env)[i].key ;
 			val = genalloc_s(sv_env,env)[i].val ;
-			if (dir_search(dst,sa->s+key,S_IFREG))
+		/*	if (dir_search(dst,sa->s+key,S_IFREG))
 			{
 				VERBO3 strerr_warnw5x("file: ",dst,"/",sa->s+key," already exist, skip it") ;
 				continue ;
-			}
+			}*/
 			if (!file_write_unsafe(dst,sa->s+key,sa->s+val,strlen(sa->s+val)))
 			{
 				VERBO3 strerr_warnwu4sys("create file: ",dst,"/",sa->s+key) ;
-- 
GitLab