diff --git a/Makefile b/Makefile index 610dbb61c74defd64f6f239f8ef74f63be5315ae..4e35b99bb0b59368de7eeccf87560be2c5fbc672 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 eba5bb06f32ed0ff3693a8112dbe2d819f38a265..84696ee5edd75c0283812657d235dae7b666981b 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 7aca2718296d28bf0c6a42e8c7c1ca82c57d5234..febaf825068abe0bdcc87c88844e604f047471ce 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 aad379aa3ed6503ede88b49edcfe5582af51f522..eba8b063ed8fe4a6a7ba45b012d0cc5923ff137c 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 6739aa4a68984481d019b1e587462bd7b822d6b3..c84876758b9cc790304809f02d53fb12baf8e211 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 9df2588b33f25c8ea5b40e4174e9f563f9aef41c..2ebc85537d5f15871fd584dba401b2ca7685bee3 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) ;