diff --git a/Makefile b/Makefile index 4e35b99bb0b59368de7eeccf87560be2c5fbc672..e050c74decfa0c4a577f21df5ab2eb5abd664936 100644 --- a/Makefile +++ b/Makefile @@ -63,7 +63,7 @@ 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) $(ENV_TARGETS) + @exec rm -f $(ALL_LIBS) $(ALL_BINS) $(wildcard src/*/*.o src/*/*.lo) $(EXTRA_TARGETS) distclean: clean @exec rm -f config.mak src/include/$(package)/config.h diff --git a/doc/index.html b/doc/index.html index eeb461f281fe63e0150d0abd489ece2ad10591bc..0c1c611bddc4cb82766936642e15a3eddf2f231b 100644 --- a/doc/index.html +++ b/doc/index.html @@ -87,6 +87,12 @@ <li><a href="66-start.html"><tt>66-start</tt></a></li> <li><a href="66-stop.html"><tt>66-stop</tt></a></li> </ul> + + <h3> execline tools </h3> + + <ul> + <li><a href="execl-cmdline.html"><tt>execl-cmdline</tt></a></li> + </ul> <h2> Why is 66 necessary? </h2> diff --git a/package/deps.mak b/package/deps.mak index 13d075fcdf52ed7c15c0a39c4291e07959476f3e..7c42587d3fbe735c17e809b66c8653d8eea8f203 100644 --- a/package/deps.mak +++ b/package/deps.mak @@ -5,16 +5,17 @@ src/include/66/66.h: src/include/66/backup.h src/include/66/config.h src/include/66/constants.h src/include/66/db.h src/include/66/enum.h src/include/66/parser.h src/include/66/svc.h src/include/66/tree.h src/include/66/utils.h src/include/66/constants.h: src/include/66/config.h src/include/66/parser.h: src/include/66/enum.h -src/66/66-all.o src/66/66-all.lo: src/66/66-all.c +src/66/66-all.o src/66/66-all.lo: src/66/66-all.c src/include/66/config.h src/include/66/constants.h src/include/66/tree.h src/include/66/utils.h src/66/66-dbctl.o src/66/66-dbctl.lo: src/66/66-dbctl.c src/include/66/constants.h src/include/66/db.h src/include/66/enum.h src/include/66/tree.h src/include/66/utils.h src/66/66-disable.o src/66/66-disable.lo: src/66/66-disable.c src/include/66/backup.h src/include/66/constants.h src/include/66/db.h src/include/66/enum.h src/include/66/tree.h src/include/66/utils.h src/66/66-enable.o src/66/66-enable.lo: src/66/66-enable.c src/include/66/backup.h src/include/66/constants.h src/include/66/db.h src/include/66/enum.h src/include/66/parser.h src/include/66/svc.h src/include/66/tree.h src/include/66/utils.h -src/66/66-init.o src/66/66-init.lo: src/66/66-init.c src/include/66/backup.h src/include/66/constants.h src/include/66/tree.h src/include/66/utils.h +src/66/66-init.o src/66/66-init.lo: src/66/66-init.c src/include/66/backup.h src/include/66/constants.h src/include/66/db.h src/include/66/tree.h src/include/66/utils.h src/66/66-scandir.o src/66/66-scandir.lo: src/66/66-scandir.c src/include/66/config.h src/include/66/constants.h src/include/66/utils.h src/66/66-start.o src/66/66-start.lo: src/66/66-start.c src/include/66/backup.h src/include/66/config.h src/include/66/constants.h src/include/66/db.h src/include/66/enum.h src/include/66/svc.h src/include/66/tree.h src/include/66/utils.h src/66/66-stop.o src/66/66-stop.lo: src/66/66-stop.c src/include/66/backup.h src/include/66/config.h src/include/66/constants.h src/include/66/db.h src/include/66/enum.h src/include/66/svc.h src/include/66/tree.h src/include/66/utils.h src/66/66-svctl.o src/66/66-svctl.lo: src/66/66-svctl.c src/include/66/constants.h src/include/66/tree.h src/include/66/utils.h src/66/66-tree.o src/66/66-tree.lo: src/66/66-tree.c src/include/66/config.h src/include/66/constants.h src/include/66/db.h src/include/66/tree.h src/include/66/utils.h +src/66/execl-cmdline.o src/66/execl-cmdline.lo: src/66/execl-cmdline.c src/lib66/backup_cmd_switcher.o src/lib66/backup_cmd_switcher.lo: src/lib66/backup_cmd_switcher.c src/include/66/constants.h src/include/66/enum.h src/include/66/utils.h src/lib66/backup_make_new.o src/lib66/backup_make_new.lo: src/lib66/backup_make_new.c src/include/66/constants.h src/include/66/db.h src/include/66/enum.h src/include/66/tree.h src/include/66/utils.h src/lib66/backup_realpath_sym.o src/lib66/backup_realpath_sym.lo: src/lib66/backup_realpath_sym.c src/include/66/constants.h src/include/66/enum.h src/include/66/utils.h @@ -75,6 +76,8 @@ src/lib66/tree_switch_tobackup.o src/lib66/tree_switch_tobackup.lo: src/lib66/tr 66-svctl: src/66/66-svctl.o ${LIB66} -loblibs -ls6 -lskarnet 66-tree: EXTRA_LIBS := 66-tree: src/66/66-tree.o ${LIB66} -loblibs -lskarnet +execl-cmdline: EXTRA_LIBS := +execl-cmdline: src/66/execl-cmdline.o -lexecline -loblibs -lskarnet ifeq ($(strip $(STATIC_LIBS_ARE_PIC)),) lib66.a.xyzzy: src/lib66/backup_cmd_switcher.o src/lib66/backup_make_new.o src/lib66/backup_realpath_sym.o src/lib66/db_cmd_master.o src/lib66/db_compile.o src/lib66/db_find_compiled_state.o src/lib66/db_get_permissions.o src/lib66/db_ok.o src/lib66/db_switch_to.o src/lib66/db_update.o src/lib66/dir_cmpndel.o src/lib66/find_sv_src.o src/lib66/get_enum.o src/lib66/get_uidgid.o src/lib66/get_userhome.o src/lib66/parser.o src/lib66/parser_utils.o src/lib66/parser_write.o src/lib66/resolve.o src/lib66/scandir_ok.o src/lib66/scandir_send_signal.o src/lib66/set_livedir.o src/lib66/set_livescan.o src/lib66/set_livetree.o src/lib66/set_ownerhome.o src/lib66/set_ownersysdir.o src/lib66/sv_alltype_zero.o src/lib66/svc_switch_to.o src/lib66/tree_cmd_state.o src/lib66/tree_cmd_switcher.o src/lib66/tree_copy.o src/lib66/tree_find_current.o src/lib66/tree_from_current.o src/lib66/tree_get_permissions.o src/lib66/tree_make_backup.o src/lib66/tree_sethome.o src/lib66/tree_switch_current.o src/lib66/tree_switch_tobackup.o else diff --git a/package/modes b/package/modes index dc256d2e3c9016b54d9859462cdf3b1445124161..63252212f4b74caae2c0bd876425afd71289260b 100644 --- a/package/modes +++ b/package/modes @@ -1,10 +1,11 @@ -66-scandir 0755 -66-init 0755 -66-tree 0755 -66-dbctl 0755 -66-enable 0755 -66-disable 0755 -66-start 0755 -66-stop 0755 -66-svctl 0755 -66-all 0755 +66-scandir 0755 +66-init 0755 +66-tree 0755 +66-dbctl 0755 +66-enable 0755 +66-disable 0755 +66-start 0755 +66-stop 0755 +66-svctl 0755 +66-all 0755 +execl-cmdline 0755 diff --git a/package/targets.mak b/package/targets.mak index 1304eadf12eaf3b66053a1387cdb5cf864316ed9..2a7bbacba32d038d18bae4705fd3dd65797cdf63 100644 --- a/package/targets.mak +++ b/package/targets.mak @@ -8,6 +8,7 @@ BIN_TARGETS := \ 66-start \ 66-stop \ 66-svctl \ -66-all +66-all \ +execl-cmdline LIB_DEFS := 66=66 diff --git a/src/66/66-all.c b/src/66/66-all.c index 07f2828b9fde25ddf7d4cb85d3b5c3b917a157d0..6b2e604df7efd21fee78beab1fba188bb3c25fa1 100644 --- a/src/66/66-all.c +++ b/src/66/66-all.c @@ -36,6 +36,9 @@ #include <66/utils.h> #include <66/tree.h> +#include <s6/s6-supervise.h> +#include <s6/config.h> + #include <stdio.h> unsigned int VERBOSITY = 1 ; static tain_t DEADLINE ; @@ -312,6 +315,14 @@ int main(int argc, char const *const *argv,char const *const *envp) if (wstat) strerr_diefu2x(111,"init services for tree: ",treename) ; + + VERBO3 strerr_warnt2x("reload scandir: ",scandir.s) ; + r = s6_svc_writectl(scandir.s, S6_SVSCAN_CTLDIR, "an", 2) ; + if (r < 0) + { + VERBO3 strerr_warnw3sys("something is wrong with the ",scandir.s, "/" S6_SVSCAN_CTLDIR " directory. errno reported") ; + return -1 ; + } } if (!doit(tree.s,treename,live.s,what,envp)) strerr_diefu2x(111,"start service for tree: ",treename) ; } diff --git a/src/66/66-dbctl.c b/src/66/66-dbctl.c index a721fc27b90dfa919853f565e5e2b02e2426c659..664d32937d7674d9f6f9dadc03a11c01a751af22 100644 --- a/src/66/66-dbctl.c +++ b/src/66/66-dbctl.c @@ -130,7 +130,7 @@ int main(int argc, char const *const *argv,char const *const *envp) if (r < 0) strerr_diefu1x(110,"find the current tree. You must use -t options") ; if (!r) strerr_diefu2sys(111,"find tree: ", tree.s) ; - size_t treelen = get_rlen_until(tree.s,'/',tree.len) ; + size_t treelen = get_rlen_until(tree.s,'/',tree.len - 1) ; size_t treenamelen = (tree.len - 1) - treelen ; char treename[treenamelen + 1] ; memcpy(treename, tree.s + treelen + 1,treenamelen) ; @@ -278,18 +278,12 @@ int main(int argc, char const *const *argv,char const *const *envp) if (down) { if (WEXITSTATUS(status.wstat) && WIFEXITED(status.wstat) && status.pid) - { - VERBO3 strerr_warnwu2x("stop: ",svname) ; - e = 111 ; - } + strerr_diefu2x(111,"stop: ",svname) ; } if (up) { if (WEXITSTATUS(status.wstat) && WIFEXITED(status.wstat)) - { - VERBO3 strerr_warnwu2x("start: ",svname) ; - e = 111 ; - } + strerr_diefu2x(111,"start: ",svname) ; } } } diff --git a/src/66/66-disable.c b/src/66/66-disable.c index c308bc53b5e9858c7bfeaa8bb43dba611a5c1fd0..2ba8a193335027d0eea15804f23e7a942bed1eb3 100644 --- a/src/66/66-disable.c +++ b/src/66/66-disable.c @@ -331,7 +331,7 @@ int main(int argc, char const *const *argv,char const *const *envp) if (r < 0) strerr_diefu1x(110,"find the current tree. You must use -t options") ; if (!r) strerr_diefu2sys(111,"find tree: ", tree.s) ; - size_t treelen = get_rlen_until(tree.s,'/',tree.len) ; + size_t treelen = get_rlen_until(tree.s,'/',tree.len - 1) ; size_t treenamelen = (tree.len - 1) - treelen ; char treename[treenamelen + 1] ; memcpy(treename, tree.s + treelen + 1,treenamelen) ; diff --git a/src/66/66-enable.c b/src/66/66-enable.c index cc801c15361696f0b76714ad1f847baaf1d26a90..256a20a37d02e1e79f283e7253dc63ef383297d5 100644 --- a/src/66/66-enable.c +++ b/src/66/66-enable.c @@ -135,7 +135,7 @@ int main(int argc, char const *const *argv,char const *const *envp) if (r < 0) strerr_diefu1x(110,"find the current tree. You must use -t options") ; if (!r) strerr_diefu2sys(111,"find tree: ", tree.s) ; - size_t treelen = get_rlen_until(tree.s,'/',tree.len) ; + size_t treelen = get_rlen_until(tree.s,'/',tree.len - 1) ; size_t treenamelen = (tree.len - 1) - treelen ; char treename[treenamelen + 1] ; memcpy(treename, tree.s + treelen + 1,treenamelen) ; diff --git a/src/66/66-start.c b/src/66/66-start.c index 93db9c7ead3e05865af6b4f6d2a74d46fce56000..448d44e6fef730fcef06fceb121555d6bfee4623 100644 --- a/src/66/66-start.c +++ b/src/66/66-start.c @@ -177,10 +177,7 @@ int svc_start(char const *base,char const *scandir,char const *live,char const * pid_t pid ; genalloc tot = genalloc_zero ; //stralist - /** search logger */ - - for (unsigned int i = 0; i < genalloc_len(svstat_t,ga) ; i++) { if (!stra_add(&tot,genalloc_s(svstat_t,ga)[i].name)) @@ -660,7 +657,7 @@ int main(int argc, char const *const *argv,char const *const *envp) if (r < 0) strerr_diefu1x(110,"find the current tree. You must use -t options") ; if (!r) strerr_diefu2sys(111,"find tree: ", tree.s) ; - size_t treelen = get_rlen_until(tree.s,'/',tree.len) ; + size_t treelen = get_rlen_until(tree.s,'/',tree.len - 1) ; size_t treenamelen = (tree.len - 1) - treelen ; char treename[treenamelen + 1] ; memcpy(treename, tree.s + treelen + 1,treenamelen) ; @@ -773,6 +770,9 @@ int main(int argc, char const *const *argv,char const *const *envp) if (!rc_sanitize(base.s,live.s,livetree.s,tree.s,treename,&nrc,envp)) strerr_diefu1x(111,"sanitize s6-rc services") ; VERBO2 strerr_warni1x("start rc services ...") ; if (!rc_start(base.s,live.s,livetree.s,tree.s,treename,&nrc,envp,trc)) strerr_diefu1x(111,"update s6-rc services") ; + VERBO2 strerr_warni3x("switch rc services of: ",treename," to source") ; + if (!db_switch_to(base.s,livetree.s,tree.s,treename,envp,SS_SWSRC)) + strerr_diefu5x(111,"switch",livetree.s,"/",treename," to source") ; } stralloc_free(&base) ; diff --git a/src/66/66-stop.c b/src/66/66-stop.c index a85083de7af51911bc6ac97c12817437667f5d5f..26930bd26ae3f9eb9b6215e955d2923a171e65de 100644 --- a/src/66/66-stop.c +++ b/src/66/66-stop.c @@ -167,7 +167,7 @@ int svc_down(char const *base,char const *scandir,char const *live,char const *t { if (!stra_add(&gatoremove,saresolve.s)) { - VERBO3 strerr_warnwu3x("add logger of: ",svname," as service to remove") ; + VERBO3 strerr_warnwu3x("add logger of: ",saresolve.s," as service to remove") ; return 0 ; } } @@ -175,7 +175,7 @@ int svc_down(char const *base,char const *scandir,char const *live,char const *t { if (!stra_add(&gaunsup,svname)) { - VERBO3 strerr_warnwu3x("add: ",svname," as service to unsupervise") ; + VERBO3 strerr_warnwu3x("add: ",saresolve.s," as service to unsupervise") ; return 0 ; } } @@ -235,8 +235,33 @@ int svc_down(char const *base,char const *scandir,char const *live,char const *t return 1 ; } -int rc_release(char const *base, char const *live,char const *tree, char const *treename) +int rc_release(char const *base, char const *scandir, char const *live,char const *tree, char const *treename) { +// size_t scanlen = strlen(scandir) ; +/* size_t treenamelen = strlen(treename) ; + + 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[scanlen + 1 + treenamelen + 1 + svnamelen + 1] ; + memcpy(rm,scandir,scanlen) ; + rm[scanlen] = '/' ; + memcpy(rm + scanlen + 1, treename,treenamelen) ; + rm[scanlen + 1 + svnamelen] = '-' ; + memcpy(rm + scanlen + 1 + treenamelen + 1,svname,svnamelen) ; + rm[scanlen + 1 + treenamelen + 1 + svnamelen] = 0 ; + VERBO3 strerr_warnt2x("unsupervise: ",rm) ; + if (rm_rf(rm) < 0) + { + VERBO3 strerr_warnwu2sys("remove directory: ",rm) ; + return 0 ; + } + } + }*/ if (!resolve_pointo(&saresolve,base,live,tree,treename,0,SS_RESOLVE_SRC)) { VERBO3 strerr_warnwu1x("set revolve pointer to source") ; @@ -276,6 +301,7 @@ int rc_down(char const *base, char const *scandir, char const *live, char const 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)) { @@ -292,6 +318,15 @@ int rc_down(char const *base, char const *scandir, char const *live, char const return 0 ; } } + /** unsupervise */ + /* if (unsup) + { + if (!stra_add(&gaunsup,svname)) + { + VERBO3 strerr_warnwu3x("add: ",svname," as service to unsupervise") ; + return 0 ; + } + }*/ /** logger */ if (!resolve_pointo(&saresolve,base,live,tree,treename,0,SS_RESOLVE_SRC)) { @@ -309,10 +344,18 @@ int rc_down(char const *base, char const *scandir, char const *live, char const { if (!stra_add(&gatoremove,saresolve.s)) { - VERBO3 strerr_warnwu3x("add logger of: ",svname," as service to remove") ; + VERBO3 strerr_warnwu3x("add logger of: ",saresolve.s," as service to remove") ; return 0 ; } } + /* if (unsup) + { + if (!stra_add(&gaunsup,saresolve.s)) + { + VERBO3 strerr_warnwu3x("add: ",saresolve.s," as service to unsupervise") ; + return 0 ; + } + }*/ } } @@ -458,7 +501,7 @@ int main(int argc, char const *const *argv,char const *const *envp) if (r < 0) strerr_diefu1x(110,"find the current tree. You must use -t options") ; if (!r) strerr_diefu2sys(111,"find tree: ", tree.s) ; - size_t treelen = get_rlen_until(tree.s,'/',tree.len) ; + size_t treelen = get_rlen_until(tree.s,'/',tree.len - 1) ; size_t treenamelen = (tree.len - 1) - treelen ; char treename[treenamelen + 1] ; memcpy(treename, tree.s + treelen + 1,treenamelen) ; @@ -526,7 +569,7 @@ int main(int argc, char const *const *argv,char const *const *envp) if (!resolve_pointo(&saresolve,base.s,live.s,tree.s,treename,0,SS_RESOLVE_BACK)) strerr_diefu1x(111,"set revolve pointer to backup") ; r = resolve_read(&type,saresolve.s,*argv,"type") ; - if (r <= 0) strerr_dief3x(111,"service: ",*argv," is not running, you can only start it") ; + if (r <= 0 && !UNSUP) strerr_dief3x(111,"service: ",*argv," is not running, you can only start it") ; } if (svsrc.type == CLASSIC) { @@ -568,13 +611,11 @@ int main(int argc, char const *const *argv,char const *const *envp) } if (genalloc_len(svstat_t,&nrc)) { - gatoremove = genalloc_zero ; - gaunsup = genalloc_zero ; VERBO2 strerr_warni1x("stop rc services ...") ; if (!rc_down(base.s, scandir.s, live.s,livetree.s,tree.s,treename,&nrc,envp,trc)) strerr_diefu1x(111,"update rc services") ; VERBO2 strerr_warni1x("release rc services ...") ; - if (!rc_release(base.s,live.s,tree.s,treename)) + if (!rc_release(base.s,scandir.s, live.s,tree.s,treename)) strerr_diefu1x(111,"release rc services") ; VERBO2 strerr_warni3x("switch rc services of: ",treename," to source") ; if (!db_switch_to(base.s,livetree.s,tree.s,treename,envp,SS_SWSRC)) diff --git a/src/66/66-svctl.c b/src/66/66-svctl.c index ee89089068a3fb4bdc0b0bca3b4f86f5e5b28b0d..b919afb3259ecaf4d0f9519702f5e9793fa12e55 100644 --- a/src/66/66-svctl.c +++ b/src/66/66-svctl.c @@ -42,7 +42,7 @@ unsigned int VERBOSITY = 1 ; stralloc svkeep = STRALLOC_ZERO ; genalloc gakeep = GENALLOC_ZERO ; //type svc_sig_s - +stralloc saresolve = STRALLOC_ZERO ; typedef struct svc_sig_s svc_sig, *svc_sig_t_ref ; struct svc_sig_s { @@ -329,7 +329,7 @@ int iopause_svc(svc_sig *sv_signal,char const *sig, ftrigr_t *fifo) { case GOTIT: h = handle_signal_svc(sv_signal) ; - if (!h) + if (h) { check = 4 ; break ; @@ -517,9 +517,7 @@ int main(int argc, char const *const *argv,char const *const *envp) if (r < 0) strerr_diefu1x(110,"find the current tree. You must use -t options") ; if (!r) strerr_diefu2sys(111,"find tree: ", tree.s) ; - stralloc_free(&base) ; - - size_t treelen = get_rlen_until(tree.s,'/',tree.len) ; + size_t treelen = get_rlen_until(tree.s,'/',tree.len - 1) ; size_t treenamelen = (tree.len - 1) - treelen ; char treename[treenamelen + 1] ; memcpy(treename, tree.s + treelen + 1,treenamelen) ; @@ -539,8 +537,6 @@ int main(int argc, char const *const *argv,char const *const *envp) if (!r) retstralloc(111,"main") ; if (r < 0 ) strerr_dief3x(111,"live: ",scandir.s," must be an absolute path") ; - stralloc_free(&live) ; - if ((scandir_ok(scandir.s)) !=1 ) strerr_dief3sys(111,"scandir: ", scandir.s," is not running") ; @@ -564,12 +560,20 @@ int main(int argc, char const *const *argv,char const *const *envp) svok[svoklen] = '/' ; memcpy(svok + svoklen + 1 ,svname,namelen + 1) ; svoklen = svoklen + 1 + namelen ; - - r = s6_svc_ok(svok) ; - if (r < 0) strerr_diefu2sys(111,"check ", svok) ; - if (!r) + /** do not check the logger*/ + if (!resolve_pointo(&saresolve,base.s,live.s,tree.s,treename,0,SS_RESOLVE_SRC)) { - strerr_dief2x(110,svok," is not initialized") ; + VERBO3 strerr_warnwu1x("set revolve pointer to source") ; + return 0 ; + } + if (resolve_read(&saresolve,saresolve.s,svname,"logger")) + { + if (str_diff(saresolve.s,svname)) + { + r = s6_svc_ok(svok) ; + if (r < 0) strerr_diefu2sys(111,"check ", svok) ; + if (!r) strerr_dief2x(110,svok," is not initialized") ; + } } sv_signal.scan = svkeep.len ; if (!stralloc_catb(&svkeep, svok, svoklen + 1)) retstralloc(111,"main") ; @@ -659,6 +663,8 @@ int main(int argc, char const *const *argv,char const *const *envp) } + stralloc_free(&base) ; + stralloc_free(&live) ; stralloc_free(&tree) ; stralloc_free(&scandir) ; diff --git a/src/66/66-tree.c b/src/66/66-tree.c index 137f6b1fc395dda6faae8c4a6ae61bba71728ec0..03751634cbd7e1fc310e123af668dc8280174222 100644 --- a/src/66/66-tree.c +++ b/src/66/66-tree.c @@ -33,6 +33,7 @@ #include <66/constants.h> #include <66/db.h> + #define USAGE "66-tree [ -h help ] [ -v verbosity ] [ -n new ] [ -a allow user,user,... ] [ -d deny user,user,... ] [ -c current ] [ -E enable ] [ -D disable ] [ -R remove ] [ -C clone ] tree" unsigned int VERBOSITY = 1 ; @@ -121,18 +122,20 @@ int sanitize_tree(stralloc *dstree, char const *base, char const *tree) return -1 ; } } + r = dir_search(dst,tree,S_IFDIR) ; if (r < 0){ VERBO3 strerr_warnw3x(dst,tree," is not a directory") ; return -1 ; } + + if (!r) return 0 ; + /** we have one, keep it*/ if (!stralloc_cats(dstree,dst)) retstralloc(0,"sanitize_tree") ; if (!stralloc_cats(dstree,"/")) retstralloc(0,"sanitize_tree") ; if (!stralloc_cats(dstree,tree)) retstralloc(0,"sanitize_tree") ; if (!stralloc_0(dstree)) retstralloc(0,"sanitize_tree") ; - - if (!r) return 0 ; return 1 ; } diff --git a/src/66/deps-exe/execl-cmdline b/src/66/deps-exe/execl-cmdline new file mode 100644 index 0000000000000000000000000000000000000000..c6b27401245136c5d4e0f2b82c6d623381aefe8b --- /dev/null +++ b/src/66/deps-exe/execl-cmdline @@ -0,0 +1,3 @@ +-lexecline +-loblibs +-lskarnet diff --git a/src/66/execl-cmdline.c b/src/66/execl-cmdline.c new file mode 100644 index 0000000000000000000000000000000000000000..4257ce84779323161c7d02d70320d1c7044594b6 --- /dev/null +++ b/src/66/execl-cmdline.c @@ -0,0 +1,96 @@ +/* + * execl-cmdline.c + * + * Copyright (c) 2018 Eric Vidal <eric@obarun.org> + * + * All rights reserved. + * + * This file is part of Obarun. It is subject to the license terms in + * the LICENSE file found in the top-level directory of this + * distribution. + * This file may not be copied, modified, propagated, or distributed + * except according to the terms contained in the LICENSE file./ + */ + +#include <oblibs/string.h> +#include <oblibs/stralist.h> +#include <oblibs/error2.h> + +#include <skalibs/stralloc.h> +#include <skalibs/genalloc.h> +#include <skalibs/env.h> +#include <skalibs/djbunix.h> +#include <skalibs/sgetopt.h> + +#include <execline/execline.h> + +#define USAGE "execl-cmdline [ -s ] { command... }" + +int main(int argc, char const **argv, char const *const *envp) +{ + + int r, argc1, split ; + + PROG = "execl-cmdline" ; + + stralloc tmodifs = STRALLOC_ZERO ; + stralloc modifs = STRALLOC_ZERO ; + genalloc ga = GENALLOC_ZERO ; + + r = argc1 = split = 0 ; + + { + subgetopt_t l = SUBGETOPT_ZERO ; + for (;;) + { + int opt = subgetopt_r(argc, argv, "s", &l) ; + if (opt == -1) break ; + switch (opt) + { + case 's' : split = 1 ; break ; + default : exitusage() ; + } + } + argc -= l.ind ; argv += l.ind ; + } + argc1 = el_semicolon(argv) ; + if (argc1 >= argc) strerr_dief1x(100, "unterminated block") ; + argv[argc1] = 0 ; + + char const **newargv = argv ; + for (int i = 0; i < argc1 ; i++, newargv++) + { + if (!*newargv[0]) + continue ; + + if (!stralloc_cats(&tmodifs,*newargv)) retstralloc(111,"tmodifs") ; + if (split) + { + if (!stralloc_cats(&tmodifs," ")) retstralloc(111,"tmodifs") ; + } + else if (!stralloc_0(&tmodifs)) retstralloc(111,"tmodifs_0") ; + r++; + } + + if (split) + { + if (!clean_val(&ga,tmodifs.s)) strerr_diefu2x(111,"clean val: ",tmodifs.s) ; + for (unsigned int i = 0 ; i < genalloc_len(stralist,&ga) ; i++) + { + stralloc_cats(&modifs,gaistr(&ga,i)) ; + stralloc_0(&modifs) ; + } + r = genalloc_len(stralist,&ga) ; + genalloc_deepfree(stralist,&ga,stra_free) ; + } + else if (!stralloc_copy(&modifs,&tmodifs)) retstralloc(111,"copy") ; + + stralloc_free(&tmodifs) ; + + char const *newarg[r + 1] ; + if (!env_make(newarg, r, modifs.s, modifs.len)) strerr_diefu1sys(111, "env_make") ; + newarg[r] = 0 ; + + xpathexec_run(newarg[0],newarg,envp) ; + //el_execsequence(newarg, argv+argc1+1, envp) ; +} diff --git a/src/lib66/parser.c b/src/lib66/parser.c index 84b490583fd28a45397a7d0a0f412dee2922d6dd..180a89f8906d9753abe48486571e2bdc192e3518 100644 --- a/src/lib66/parser.c +++ b/src/lib66/parser.c @@ -237,7 +237,6 @@ int parse_service_before(char const *src,char const *sv,char const *tree,strallo if (!r) return 0 ; if (r == 2) VERBO3 strerr_warni3x("ignore ",deps.s+(genalloc_s(unsigned int,&gadeps)[sv_before.cname.idga+i])," service dependency: already added") ; } - } stralloc_free(&srctmp) ; diff --git a/src/lib66/parser_utils.c b/src/lib66/parser_utils.c index 89027ff3cb96b6db78e690b6cc97b9baead2bb3a..ca384357bf97fa57aef6cab8bc217bbc51be8abe 100644 --- a/src/lib66/parser_utils.c +++ b/src/lib66/parser_utils.c @@ -126,8 +126,9 @@ int get_key(char const *s,char const *key,stralloc *keep) { int pos,newpos ; size_t end ; - + pos = get_keyline(s,key,keep) ; + if (pos < 0){ return -1 ; } @@ -299,9 +300,9 @@ int parse_bracket(keynocheck *nocheck) ssize_t start,end,nl ; size_t nlen ; - char tmp[nocheck->val.len + 1 + 1] ; + char tmp[nocheck->val.len + 1] ; start = end = nl = 0 ; - nlen = nocheck->val.len ; + nlen = nocheck->val.len - 1 ; start = get_len_until(nocheck->val.s,'(') ; if (start < 0) return 0 ; start++; diff --git a/src/lib66/parser_write.c b/src/lib66/parser_write.c index 2ebc85537d5f15871fd584dba401b2ca7685bee3..687eaa4c486d05d9cf8bb7558634ec7578ba61c1 100644 --- a/src/lib66/parser_write.c +++ b/src/lib66/parser_write.c @@ -159,7 +159,7 @@ int write_services(sv_alltype *sv, char const *workdir, unsigned int force) { VERBO3 strerr_warnwu2x("write resolve file: reload for service: ",name) ; return 0 ; - } + } } if (sv->opts[0]) { @@ -175,12 +175,33 @@ int write_services(sv_alltype *sv, char const *workdir, unsigned int force) } logname[namelen + 4] = 0 ; + /** resolve directory*/ + if (!resolve_remove_service(workdir,logname)) + { + VERBO3 strerr_warnwu2sys("remove resolve directory for: ",name) ; + return 0 ; + } //VERBO2 strerr_warnt4x("write resolve file ", src,SS_RESOLVE,"/logger ...") ; if (!resolve_write(workdir,name,"logger",logname,force)) { VERBO3 strerr_warnwu2x("write resolve file: logger for service: ",name) ; return 0 ; } + /** write resolve logger file */ + if (!resolve_write(workdir,logname,"type",get_keybyid(type),force)) + { + VERBO3 strerr_warnwu2x("write resolve file: type for service: ",logname) ; + return 0 ; + } + if (type == LONGRUN && force) + { + /** reload file */ + if (!resolve_write(workdir,logname,"reload","",force)) + { + VERBO3 strerr_warnwu2x("write resolve file: reload for service: ",logname) ; + return 0 ; + } + } } @@ -429,27 +450,10 @@ int write_logger(sv_alltype *sv, sv_execlog *log,char const *name, char const *d switch(logbuild) { case AUTO: + /** uid */ if (!stralloc_cats(&shebang, "#!" EXECLINE_SHEBANGPREFIX "execlineb -P\n")) retstralloc(0,"write_logger") ; if (!stralloc_0(&shebang)) retstralloc(0,"write_logger") ; - if (MYUID > 0){ - if (!stralloc_cats(&ui,"\n")) retstralloc(0,"write_logger") ; - if (!stralloc_0(&ui)) retstralloc(0,"write_logger") ; - if (!log->destination) - { - if (!stralloc_cats(&destlog,userhome)) retstralloc(0,"write_logger") ; - if (!stralloc_cats(&destlog,"/")) retstralloc(0,"write_logger") ; - if (!stralloc_cats(&destlog,SS_LOGGER_USER_DIRECTORY)) retstralloc(0,"write_logger") ; - if (!stralloc_cats(&destlog,svname)) retstralloc(0,"write_logger") ; - // if (!stralloc_cats(&destlog,"\n")) retstralloc(0,"write_logger") ; - } - else - { - if (!stralloc_cats(&destlog,keep.s+log->destination)) retstralloc(0,"write_logger") ; - // if (!stralloc_cats(&destlog,"\n")) retstralloc(0,"write_logger") ; - } - if (!stralloc_0(&destlog)) retstralloc(0,"write_logger") ; - } - else + if ((!MYUID && log->run.runas)) { if (!stralloc_cats(&ui,S6_BINPREFIX "s6-setuidgid ")) retstralloc(0,"write_logger") ; if (!get_namebyuid(log->run.runas,&ui)) @@ -457,22 +461,32 @@ int write_logger(sv_alltype *sv, sv_execlog *log,char const *name, char const *d VERBO3 strerr_warnwu1sys("set owner for the logger") ; return 0 ; } - if (!stralloc_cats(&ui,"\n")) retstralloc(0,"write_logger") ; - if (!stralloc_0(&ui)) retstralloc(0,"write_logger") ; + } + if (!stralloc_cats(&ui,"\n")) retstralloc(0,"write_logger") ; + if (!stralloc_0(&ui)) retstralloc(0,"write_logger") ; + /** destination */ + if (!log->destination) + { + if(MYUID > 0) + { - if (!log->destination) - { - if (!stralloc_cats(&destlog,SS_LOGGER_SYS_DIRECTORY)) retstralloc(0,"write_logger") ; + if (!stralloc_cats(&destlog,userhome)) retstralloc(0,"write_logger") ; + if (!stralloc_cats(&destlog,"/")) retstralloc(0,"write_logger") ; + if (!stralloc_cats(&destlog,SS_LOGGER_USER_DIRECTORY)) retstralloc(0,"write_logger") ; if (!stralloc_cats(&destlog,svname)) retstralloc(0,"write_logger") ; - // if (!stralloc_cats(&destlog,"\n")) retstralloc(0,"write_logger") ; } else { - if (!stralloc_cats(&destlog,keep.s+log->destination)) retstralloc(0,"write_logger") ; - // if (!stralloc_cats(&destlog,"\n")) retstralloc(0,"write_logger") ; + if (!stralloc_cats(&destlog,SS_LOGGER_SYS_DIRECTORY)) retstralloc(0,"write_logger") ; + if (!stralloc_cats(&destlog,svname)) retstralloc(0,"write_logger") ; } - if (!stralloc_0(&destlog)) retstralloc(0,"write_logger") ; } + else + { + if (!stralloc_cats(&destlog,keep.s+log->destination)) retstralloc(0,"write_logger") ; + } + if (!stralloc_0(&destlog)) retstralloc(0,"write_logger") ; + if (log->timestamp == TAI) timestamp = "t" ; else @@ -497,7 +511,7 @@ int write_logger(sv_alltype *sv, sv_execlog *log,char const *name, char const *d if (!stralloc_cats(&exec,shebang.s)) retstralloc(0,"write_logger") ; if (!stralloc_cats(&exec,EXECLINE_BINPREFIX "fdmove -c 2 1\n")) retstralloc(0,"write_logger") ; if (!stralloc_cats(&exec,ui.s)) retstralloc(0,"write_logger") ; - if (!stralloc_cats(&exec,EXECLINE_BINPREFIX "exec\n" S6_BINPREFIX "s6-log " "n")) retstralloc(0,"write_logger") ; + if (!stralloc_cats(&exec,S6_BINPREFIX "s6-log " "n")) retstralloc(0,"write_logger") ; if (!stralloc_cats(&exec,pback)) retstralloc(0,"write_logger") ; if (!stralloc_cats(&exec," ")) retstralloc(0,"write_logger") ; if (!stralloc_cats(&exec,timestamp)) retstralloc(0,"write_logger") ; @@ -561,7 +575,7 @@ int write_logger(sv_alltype *sv, sv_execlog *log,char const *name, char const *d return 0 ; } } - if (r) +/* if (r) { if (force) { @@ -588,7 +602,7 @@ int write_logger(sv_alltype *sv, sv_execlog *log,char const *name, char const *d VERBO3 strerr_warnw5x("ignoring creation of: ",destlog.s,"/",svname,": already exist") ; return 1 ; } - } + }*/ stralloc_free(&shebang) ; @@ -849,10 +863,20 @@ int write_exec(sv_alltype *sv, sv_exec *exec,char const *file,char const *dst,in for (unsigned int i = 0 ; i < genalloc_len(sv_env,&sv->env) ; i++) { key = genalloc_s(sv_env,&sv->env)[i].key ; - if (!stralloc_cats(&env,"importas -i ")) retstralloc(0,"write_exec") ; - if (!stralloc_cats(&env,saenv.s+key)) retstralloc(0,"write_exec") ; - if (!stralloc_cats(&env," ")) retstralloc(0,"write_exec") ; - if (!stralloc_cats(&env,saenv.s+key)) retstralloc(0,"write_exec") ; + if ((saenv.s+key)[0] == '!') + { + if (!stralloc_cats(&env,"importas -uD \"\" ")) retstralloc(0,"write_exec") ; + if (!stralloc_cats(&env,saenv.s+1+key)) retstralloc(0,"write_exec") ; + if (!stralloc_cats(&env," ")) retstralloc(0,"write_exec") ; + if (!stralloc_cats(&env,saenv.s+1+key)) retstralloc(0,"write_exec") ; + } + else + { + if (!stralloc_cats(&env,"importas -D \"\" ")) retstralloc(0,"write_exec") ; + if (!stralloc_cats(&env,saenv.s+key)) retstralloc(0,"write_exec") ; + if (!stralloc_cats(&env," ")) retstralloc(0,"write_exec") ; + if (!stralloc_cats(&env,saenv.s+key)) retstralloc(0,"write_exec") ; + } if (!stralloc_cats(&env,"\n")) retstralloc(0,"write_exec") ; } } @@ -862,17 +886,11 @@ int write_exec(sv_alltype *sv, sv_exec *exec,char const *file,char const *dst,in { if (!stralloc_cats(&shebang, "#!" EXECLINE_SHEBANGPREFIX "execlineb -P\n")) retstralloc(0,"write_exec") ; } - /** command to execute */ - if (!stralloc_cats(&runuser, keep.s+exec->exec)) retstralloc(0,"write_exec") ; break ; case CUSTOM: if (!stralloc_cats(&shebang, "#!")) retstralloc(0,"write_exec") ; if (!stralloc_cats(&shebang, keep.s+exec->shebang)) retstralloc(0,"write_exec") ; if (!stralloc_cats(&shebang,"\n")) retstralloc(0,"write_exec") ; - - if (!stralloc_cats(&runuser, keep.s+exec->exec)) retstralloc(0,"write_exec") ; - if (!stralloc_cats(&runuser,"\n")) retstralloc(0,"write_exec") ; - break ; default: VERBO3 strerr_warnw3x("unknow ", get_keybyid(exec->build)," build type") ; @@ -885,6 +903,8 @@ int write_exec(sv_alltype *sv, sv_exec *exec,char const *file,char const *dst,in /** close shebang */ if (!stralloc_0(&shebang)) retstralloc(0,"write_exec") ; /** close command */ + if (!stralloc_cats(&runuser, keep.s+exec->exec)) retstralloc(0,"write_exec") ; + if (!stralloc_cats(&runuser,"\n")) retstralloc(0,"write_exec") ; if (!stralloc_0(&runuser)) retstralloc(0,"write_exec") ; /** build the file*/ @@ -963,6 +983,9 @@ 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 ((sa->s+key)[0] == '!') + key++ ; /* if (dir_search(dst,sa->s+key,S_IFREG)) { VERBO3 strerr_warnw5x("file: ",dst,"/",sa->s+key," already exist, skip it") ; diff --git a/src/lib66/tree_find_current.c b/src/lib66/tree_find_current.c index dbb4d71618534dcd39cdf7f9aebc309c9526aca4..ea3974ed05744e16a0eb804873eaec16fbaa46fe 100644 --- a/src/lib66/tree_find_current.c +++ b/src/lib66/tree_find_current.c @@ -26,6 +26,7 @@ #include <66/constants.h> + int tree_find_current(stralloc *tree, char const *base) { ssize_t r ; @@ -36,7 +37,7 @@ int tree_find_current(stralloc *tree, char const *base) size_t packlen = uint_fmt(pack,MYUID) ; pack[packlen] = 0 ; - char sa[baselen + SS_TREE_CURRENT_LEN + 1 + packlen + 1 + SS_TREE_CURRENT_LEN] ; + char sa[baselen + SS_TREE_CURRENT_LEN + 1 + packlen + 1 + SS_TREE_CURRENT_LEN + 1] ; memcpy(sa,base,baselen) ; memcpy(sa + baselen, SS_TREE_CURRENT, SS_TREE_CURRENT_LEN) ; sa[baselen + SS_TREE_CURRENT_LEN] = '/' ; @@ -47,7 +48,7 @@ int tree_find_current(stralloc *tree, char const *base) r = scan_mode(sa,S_IFDIR) ; if(r <= 0) return 0 ; - + // strerr_warni2x("sa tree_find_current",sa) ; r = sarealpath(tree,sa) ; if (r < 0 ) return 0 ; if (!stralloc_0(tree)) retstralloc(0,"find_current") ; diff --git a/src/lib66/tree_sethome.c b/src/lib66/tree_sethome.c index 158e7db78183ebcaf6ff6065cb72fbaa17e9bfd8..8c8c9fa56fc3f16f03d754ad826c9831be62ef94 100644 --- a/src/lib66/tree_sethome.c +++ b/src/lib66/tree_sethome.c @@ -35,7 +35,7 @@ int tree_sethome(stralloc *tree, char const *base) } else { - char treename[tree->len] ; + char treename[tree->len + 1] ; memcpy(treename,tree->s,tree->len - 1) ; treename[tree->len - 1] = 0 ; tree->len = 0 ;