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