From 986fd74f6d48b1c274efd656214d4f6af99cabe5 Mon Sep 17 00:00:00 2001 From: obarun <eric@obarun.org> Date: Mon, 1 Apr 2019 17:46:14 +1100 Subject: [PATCH] check state file --- src/lib66/ssexec_svctl.c | 43 +++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/src/lib66/ssexec_svctl.c b/src/lib66/ssexec_svctl.c index b16f403d..6655943b 100644 --- a/src/lib66/ssexec_svctl.c +++ b/src/lib66/ssexec_svctl.c @@ -11,18 +11,17 @@ * This file may not be copied, modified, propagated, or distributed * except according to the terms contained in the LICENSE file./ */ + +#include <string.h> +#include <errno.h> +#include <sys/wait.h> #include <signal.h> +#include <unistd.h>//access //#include <stdio.h> -#include <string.h> -#include <stdlib.h> #include <oblibs/obgetopt.h> #include <oblibs/error2.h> -#include <oblibs/types.h> -#include <oblibs/string.h> -#include <oblibs/stralist.h> -#include <skalibs/buffer.h> #include <skalibs/types.h> #include <skalibs/stralloc.h> #include <skalibs/genalloc.h> @@ -30,15 +29,15 @@ #include <skalibs/bytestr.h> #include <skalibs/selfpipe.h> #include <skalibs/iopause.h> -#include <skalibs/sig.h> +#include <skalibs/tai.h> +#include <skalibs/sig.h>//sig_ignore #include <s6/s6-supervise.h>//s6_svstatus_t #include <s6/ftrigr.h> -#include <66/svc.h> -#include <66/constants.h> #include <66/utils.h> -#include <66/tree.h> +#include <66/constants.h> +#include <66/svc.h> #include <66/ssexec.h> #include <66/resolve.h> #include <66/state.h> @@ -46,7 +45,6 @@ unsigned int SV_DEADLINE = 3000 ; unsigned int DEATHSV = 10 ; - static int read_file (char const *file, char *buf, size_t n) { ssize_t r = openreadnclose_nb(file, buf, n) ; @@ -89,7 +87,6 @@ int handle_signal_svc(ss_resolve_sig_t *sv_signal) else return 0 ; } - static unsigned char const actions[9][9] = { //signal receive: @@ -106,6 +103,7 @@ static unsigned char const actions[9][9] = { UKNOW, UKNOW, UKNOW, UKNOW, UKNOW, UKNOW, UKNOW, UKNOW, DONE }, // SIGSUP } ; + // convert signal receive into enum number static const uint8_t chtenum[128] = { @@ -158,7 +156,6 @@ static const uint8_t chtenum[128] = * @Return 1 on if signal is not complete (e.g. want U receive only u) * @Return 2 on fail * @Return 3 for PERMANENT failure */ - int handle_case(stralloc *sa, ss_resolve_sig_t *sv_signal) { int p, h, err ; @@ -225,6 +222,7 @@ static int handle_signal_pipe(ss_resolve_sig_t *svc) } } } + static void announce(ss_resolve_sig_t *sv_signal) { @@ -299,7 +297,6 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe genalloc gakeep = GENALLOC_ZERO ; //type ss_resolve_sig stralloc sares = STRALLOC_ZERO ; - stralloc sasta = STRALLOC_ZERO ; ss_resolve_graph_t graph = RESOLVE_GRAPH_ZERO ; ss_resolve_t res = RESOLVE_ZERO ; ss_state_t sta = STATE_ZERO ; @@ -363,18 +360,19 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe if (r < 0) strerr_dief1x(111,"cyclic dependencies detected") ; if (!r) strerr_diefu1sys(111,"publish service graph") ; - if (!ss_resolve_pointo(&sasta,info,SS_NOTYPE,SS_RESOLVE_STATE)) strerr_diefu1sys(111,"set revolve pointer to state") ; - for(unsigned int i = 0 ; i < genalloc_len(ss_resolve_t,&graph.sorted) ; i++) { ss_resolve_sig_t sv_signal = RESOLVE_SIG_ZERO ; sv_signal.res = genalloc_s(ss_resolve_t,&graph.sorted)[i] ; char *string = sv_signal.res.sa.s ; char *svok = string + sv_signal.res.runat ; + char *state = string + sv_signal.res.state ; size_t svoklen = strlen(svok) ; char file[svoklen + 16 + 1] ; memcpy(file,svok,svoklen) ; - if (!ss_state_check(sasta.s,string + sv_signal.res.name)) strerr_dief2x(111,"unitialized service: ",string + sv_signal.res.name) ; + if (!ss_state_check(state,string + sv_signal.res.name)) strerr_dief2x(111,"unitialized service: ",string + sv_signal.res.name) ; + if (!ss_state_read(&sta,state,string + sv_signal.res.name)) strerr_diefu2sys(111,"read state of: ",string + sv_signal.res.name) ; + if (sta.init) strerr_dief2x(111,"unitialized service: ",string + sv_signal.res.name) ; if (!s6_svstatus_read(svok,&status)) strerr_diefu2sys(111,"read status of: ",svok) ; isup = status.pid && !status.flagfinishing ; @@ -388,11 +386,10 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe VERBO1 strerr_warni2x("Already down: ",string + sv_signal.res.name) ; continue ; } - else if ((SIGNAL == SIGR) || (SIGNAL == SIGRR)) + /*else if ((SIGNAL == SIGR) || (SIGNAL == SIGRR)) { SIGNAL = SIGRUP ; - } - + }*/ sv_signal.sigtosend = sig ; sv_signal.sig = SIGNAL ; @@ -505,7 +502,8 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe { int nret = 0 ; ss_resolve_sig_t *sv = &genalloc_s(ss_resolve_sig_t,&gakeep)[i] ; - char *name = sv->res.sa.s + sv->res.name ; + char const *name = sv->res.sa.s + sv->res.name ; + char const *state = sv->res.sa.s + sv->res.state ; nret = svc_listen(&gakeep,&fifo,spfd,sv) ; if (nret > 1) ret = 111 ; if (sv->sig <= 3) @@ -538,7 +536,7 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe ss_state_setflag(&sta,SS_FLAGS_INIT,SS_FLAGS_FALSE) ; ss_state_setflag(&sta,SS_FLAGS_UNSUPERVISE,SS_FLAGS_FALSE) ; VERBO2 strerr_warni2x("Write state file of: ",name) ; - if (!ss_state_write(&sta,sasta.s,name)) + if (!ss_state_write(&sta,state,name)) { VERBO1 strerr_warnwu2sys("write state file of: ",name) ; ret = 111 ; @@ -563,7 +561,6 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe ftrigr_end(&fifo) ; selfpipe_finish() ; stralloc_free(&sares) ; - stralloc_free(&sasta) ; ss_resolve_graph_free(&graph) ; genalloc_free(ss_resolve_sig_t,&gakeep) ; ss_resolve_free(&res) ; -- GitLab