diff --git a/src/66/66-tree.c b/src/66/66-tree.c index b74994c1adb430fc265096a3aeb83cfb528e03e9..c5d5b43e6dc5587e993b5eb34e59325b0c0b33e2 100644 --- a/src/66/66-tree.c +++ b/src/66/66-tree.c @@ -43,6 +43,7 @@ #define USAGE "66-tree [ -h ] [ -v verbosity ] [ -n|R ] [ -a|d ] [ -c ] [ -E|D ] [ -U ] [ -C clone ] tree" unsigned int VERBOSITY = 1 ; +static stralloc reslive = STRALLOC_ZERO ; static inline void info_help (void) { @@ -256,7 +257,7 @@ int create_tree(char const *tree,char const *treename) } VERBO3 strerr_warnt1x("write resolve file of: Master") ; - if (!ss_resolve_write(&res,dst,"Master")) + if (!ss_resolve_write(&res,dst,"Master",SS_SIMPLE)) { VERBO3 strerr_warnwu1sys("write resolve file of: Master") ; ss_resolve_free(&res) ; @@ -472,6 +473,7 @@ int tree_unsupervise(char const *tree, char const *treename,uid_t owner,char con { if (!stralloc_cats(&scandir,res.sa.s + res.live)) retstralloc(111,"tree_unsupervise") ; + if (!stralloc_cats(&reslive,res.sa.s + res.resolve)) retstralloc(111,"tree_unsupervise") ; if (!stralloc_cats(&livetree,res.sa.s + res.live)) retstralloc(111,"tree_unsupervise") ; r = set_livetree(&livetree,owner) ; @@ -501,9 +503,21 @@ int tree_unsupervise(char const *tree, char const *treename,uid_t owner,char con VERBO3 strerr_warnwu2sys("wait for ",newargv[0]) ; return 0 ; } - if (wstat) strerr_diefu2sys(111,"bring down db service of tree: ",treename) ; + if (wstat) strerr_diefu2sys(111,"stop db service of tree: ",treename) ; /** unsupervise service into the scandir */ if (!clean_val(&gasv,res.sa.s + res.deps)) strerr_diefu2sys(111,"clean deps of inner bundle of tree: ", treename) ; + for (unsigned int i = 0 ; i < genalloc_len(stralist,&gasv) ; i++) + { + ss_resolve_t dres = RESOLVE_ZERO ; + ss_resolve_init(&dres) ; + if (!ss_resolve_read(&dres,res.sa.s + res.resolve,gaistr(&gasv,i))) strerr_diefu2sys(111,"read resolve file of: ",gaistr(&gasv,i)) ; + ss_resolve_setflag(&dres,SS_FLAGS_INIT,SS_FLAGS_TRUE) ; + ss_resolve_setflag(&dres,SS_FLAGS_RELOAD,SS_FLAGS_FALSE) ; + ss_resolve_setflag(&dres,SS_FLAGS_UNSUPERVISE,SS_FLAGS_FALSE) ; + ss_resolve_setflag(&dres,SS_FLAGS_RUN,SS_FLAGS_FALSE) ; + if (!ss_resolve_write(&dres,res.sa.s + res.resolve,gaistr(&gasv,i),SS_DOUBLE)) strerr_diefu2sys(111,"write resolve file of: ", gaistr(&gasv,i)) ; + ss_resolve_free(&dres) ; + } if (!stra_add(&gasv,S6RC_ONESHOT_RUNNER)) strerr_diefu3sys(111,"add ",S6RC_ONESHOT_RUNNER," as service to unsupervise") ; if (!stra_add(&gasv,S6RC_FDHOLDER)) strerr_diefu3sys(111,"add ",S6RC_FDHOLDER," as service to unsupervise") ; @@ -518,8 +532,7 @@ int tree_unsupervise(char const *tree, char const *treename,uid_t owner,char con if (r < 0 ) strerr_diefu2sys(111,"find realpath of: ",livetree.s) ; if (!stralloc_0(&realsym)) retstralloc(111,"tree_unsupervise") ; if (rm_rf(realsym.s) < 0) strerr_diefu2sys(111,"remove ", realsym.s) ; - if (rm_rf(livetree.s) < 0) strerr_diefu2sys(111,"remove ", livetree.s) ; - + if (rm_rf(livetree.s) < 0) strerr_diefu2sys(111,"remove ", livetree.s) ; } } genalloc_deepfree(stralist,&gasv,stra_free) ; @@ -529,9 +542,17 @@ int tree_unsupervise(char const *tree, char const *treename,uid_t owner,char con genalloc tostop = GENALLOC_ZERO ; for (unsigned int i = 0 ; i < genalloc_len(stralist,&gasv) ; i++) { - res.sa.len = 0 ; + ss_resolve_init(&res) ; if (!ss_resolve_read(&res,dtree.s,gaistr(&gasv,i))) strerr_diefu1sys(111,"read resolve file of inner bundle") ; - if (res.run) if (!stra_add(&tostop,gaistr(&gasv,i))) strerr_diefu3sys(111,"add ",gaistr(&gasv,i)," as service to stop") ; + if (res.run) + { + if (!stra_add(&tostop,gaistr(&gasv,i))) strerr_diefu3sys(111,"add ",gaistr(&gasv,i)," as service to stop") ; + ss_resolve_setflag(&res,SS_FLAGS_INIT,SS_FLAGS_TRUE) ; + ss_resolve_setflag(&res,SS_FLAGS_RELOAD,SS_FLAGS_FALSE) ; + ss_resolve_setflag(&res,SS_FLAGS_UNSUPERVISE,SS_FLAGS_FALSE) ; + ss_resolve_setflag(&res,SS_FLAGS_RUN,SS_FLAGS_FALSE) ; + if (!ss_resolve_write(&res,res.sa.s + res.resolve,gaistr(&gasv,i),SS_DOUBLE)) strerr_diefu2sys(111,"set write resolve file of: ", gaistr(&gasv,i)) ; + } } if (genalloc_len(stralist,&tostop)) { @@ -540,6 +561,8 @@ int tree_unsupervise(char const *tree, char const *treename,uid_t owner,char con * to avoid double path*/ scandir.len = 0 ; if (!stralloc_cats(&scandir,res.sa.s + res.live)) retstralloc(111,"tree_unsupervise") ; + reslive.len = 0 ; + if (!stralloc_cats(&reslive,res.sa.s + res.resolve)) retstralloc(111,"tree_unsupervise") ; char const *newargv[9 + genalloc_len(stralist,&tostop)] ; unsigned int m = 0 ; @@ -577,6 +600,7 @@ int tree_unsupervise(char const *tree, char const *treename,uid_t owner,char con } if (reload) { + if (!stralloc_0(&reslive)) retstralloc(111,"tree_unsupervise") ; if (!stralloc_0(&scandir)) retstralloc(111,"tree_unsupervise") ; if (!set_livescan(&scandir,owner)) strerr_diefu1sys(111,"set scandir") ; if (scandir_send_signal(scandir.s,"an") <= 0) strerr_diefu2sys(111,"reload scandir: ",scandir.s) ; @@ -736,8 +760,8 @@ int main(int argc, char const *const *argv,char const *const *envp) if (remove) { - VERBO2 strerr_warni3x("remove ",dstree.s," ..." ) ; - if (rm_rf(dstree.s) < 0) strerr_diefu2sys(111,"remove ", dstree.s) ; + VERBO2 strerr_warni3x("delete ",dstree.s," ..." ) ; + if (rm_rf(dstree.s) < 0) strerr_diefu2sys(111,"delete ", dstree.s) ; size_t treelen = strlen(tree) ; size_t baselen = base.len ; @@ -752,16 +776,22 @@ int main(int argc, char const *const *argv,char const *const *envp) r = scan_mode(treetmp,S_IFDIR) ; if (r || (r < 0)) { - VERBO2 strerr_warni3x("remove backup of tree ",treetmp," ...") ; + VERBO2 strerr_warni3x("delete backup of tree ",treetmp," ...") ; if (rm_rf(treetmp) < 0) { - VERBO3 strerr_warnwu2sys("remove: ",treetmp) ; + VERBO3 strerr_warnwu2sys("delete: ",treetmp) ; return 0 ; } } VERBO2 strerr_warni6x("disable: ",dstree.s," at: ",base.s,SS_SYSTEM,SS_STATE) ; r = tree_cmd_state(VERBOSITY,"-d",tree) ; - if (r != 1) strerr_diefu6x(111,"remove: ",dstree.s," at: ",base.s,SS_SYSTEM,SS_STATE) ; + if (r != 1) strerr_diefu6x(111,"delete: ",dstree.s," at: ",base.s,SS_SYSTEM,SS_STATE) ; + /** remove /run/66/state/treename directory */ + if (reslive.len) + { + VERBO2 strerr_warni3x("delete ",reslive.s," ..." ) ; + if (rm_rf(reslive.s) < 0) strerr_diefu2sys(111,"delete ",reslive.s) ; + } } if (snap)