Skip to content
Snippets Groups Projects
Commit b1d9c2c4 authored by Eric Vidal's avatar Eric Vidal :speech_balloon:
Browse files

fix -r behavior

parent 907180a4
No related branches found
No related tags found
No related merge requests found
...@@ -17,11 +17,12 @@ ...@@ -17,11 +17,12 @@
#include <sys/wait.h> #include <sys/wait.h>
#include <signal.h> #include <signal.h>
#include <unistd.h>//access #include <unistd.h>//access
#include <stdio.h> //#include <stdio.h>
//#include <stdlib.h> //#include <stdlib.h>
#include <oblibs/obgetopt.h> #include <oblibs/obgetopt.h>
#include <oblibs/error2.h> #include <oblibs/error2.h>
#include <oblibs/string.h>
#include <skalibs/types.h> #include <skalibs/types.h>
#include <skalibs/stralloc.h> #include <skalibs/stralloc.h>
...@@ -167,6 +168,7 @@ int handle_case(stralloc *sa, ss_resolve_sig_t *svc) ...@@ -167,6 +168,7 @@ int handle_case(stralloc *sa, ss_resolve_sig_t *svc)
unsigned int state, i = 0 ; unsigned int state, i = 0 ;
state = svc->sig ; state = svc->sig ;
err = 2 ; err = 2 ;
for (;i < sa->len ; i++) for (;i < sa->len ; i++)
{ {
p = chtenum[(unsigned char)sa->s[i]] ; p = chtenum[(unsigned char)sa->s[i]] ;
...@@ -256,15 +258,15 @@ static int announce(ss_resolve_sig_t *svc) ...@@ -256,15 +258,15 @@ static int announce(ss_resolve_sig_t *svc)
{ {
case 0: VERBO1 strerr_warni4x(sv," is ",(svc->sig > 3) ? "down" : "up"," but not notified by the daemon itself") ; case 0: VERBO1 strerr_warni4x(sv," is ",(svc->sig > 3) ? "down" : "up"," but not notified by the daemon itself") ;
break ; break ;
case 1: VERBO1 strerr_warni4x(sv,": ",(svc->sig > 3) ? "stopped" : "started"," successfully") ; case 1: VERBO1 strerr_warni4x(sv,": ",(svc->sig > 3) ? "stopped" : (svc->sig == 2 || svc->sig == 3) ? "reloaded" : "started"," successfully") ;
break ; break ;
case 2: VERBO1 strerr_warnwu2x((svc->sig > 3) ? "stop " : "start ", sv) ; case 2: VERBO1 strerr_warnwu2x((svc->sig > 3) ? "stop " : (svc->sig == 2 || svc->sig == 3) ? "reload" : "start ", sv) ;
break ; break ;
case 3: VERBO1 strerr_warnw3x(sv," report permanent failure -- unable to ",(svc->sig > 1) ? "stop" : "start") ; case 3: VERBO1 strerr_warnw3x(sv," report permanent failure -- unable to ",(svc->sig > 1) ? "stop" : (svc->sig == 2 || svc->sig == 3) ? "reload" : "start") ;
break ; break ;
case 4: VERBO1 strerr_warnwu3x((svc->sig > 3) ? "stop: " : "start: ",sv, ": number of try exceeded") ; case 4: VERBO1 strerr_warnwu3x((svc->sig > 3) ? "stop: " : (svc->sig == 2 || svc->sig == 3) ? "reload" : "start: ",sv, ": number of try exceeded") ;
break ; break ;
case 5: VERBO1 strerr_warnwu3x((svc->sig > 3) ? "stop: " : "start: ",sv, ": time out reached") ; case 5: VERBO1 strerr_warnwu3x((svc->sig > 3) ? "stop: " : (svc->sig == 2 || svc->sig == 3) ? "reload" : "start: ",sv, ": time out reached") ;
break ; break ;
case-1: case-1:
default:VERBO1 strerr_warnw3x("unexpected data in state file of: ",sv," -- please make a bug report") ; default:VERBO1 strerr_warnw3x("unexpected data in state file of: ",sv," -- please make a bug report") ;
...@@ -357,7 +359,7 @@ static void svc_listen(unsigned int nsv,tain_t *deadline) ...@@ -357,7 +359,7 @@ static void svc_listen(unsigned int nsv,tain_t *deadline)
tain_now_g() ; tain_now_g() ;
tain_copynow(&start) ; tain_copynow(&start) ;
while(i--) while(i--)
did[i] = 0 ; did[i] = 0 ;
...@@ -365,8 +367,7 @@ static void svc_listen(unsigned int nsv,tain_t *deadline) ...@@ -365,8 +367,7 @@ static void svc_listen(unsigned int nsv,tain_t *deadline)
{ {
r = iopause_g(&x, 1, deadline) ; r = iopause_g(&x, 1, deadline) ;
if (r < 0) strerr_dief1sys(111,"listen iopause") ; if (r < 0) strerr_dief1sys(111,"listen iopause") ;
/** timeout is not a error , the iopause process did right*/ else if (!r) strerr_dief1x(111,"listen time out") ;
else if (!r) strerr_dief1sys(111,"listen time out") ;
if (x.revents & IOPAUSE_READ) if (x.revents & IOPAUSE_READ)
{ {
i = 0 ; i = 0 ;
...@@ -468,7 +469,7 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe ...@@ -468,7 +469,7 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
DEATHSV = 5 ; DEATHSV = 5 ;
int e, isup, r, ret = 1 ; int e, isup, r, ret = 1 ;
unsigned int death, tsv, reverse ; unsigned int death, tsv, reverse, tsv_g ;
int SIGNAL = -1 ; int SIGNAL = -1 ;
tain_t ttmain ; tain_t ttmain ;
...@@ -483,6 +484,7 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe ...@@ -483,6 +484,7 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
s6_svstatus_t status = S6_SVSTATUS_ZERO ; s6_svstatus_t status = S6_SVSTATUS_ZERO ;
tsv = death = reverse = 0 ; tsv = death = reverse = 0 ;
tsv_g = SV_DEADLINE ;
//PROG = "66-svctl" ; //PROG = "66-svctl" ;
{ {
...@@ -512,21 +514,23 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe ...@@ -512,21 +514,23 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
if (info->timeout) tsv = info->timeout ; if (info->timeout) tsv = info->timeout ;
if ((scandir_ok(info->scandir.s)) !=1 ) strerr_dief3sys(111,"scandir: ", info->scandir.s," is not running") ; 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") ; if (!ss_resolve_pointo(&sares,info,SS_NOTYPE,SS_RESOLVE_SRC)) strerr_diefu1sys(111,"set revolve pointer to source") ;
if (SIGNAL > SIGRUP) reverse = 1 ; if (SIGNAL > SIGR) reverse = 1 ;
for(;*argv;argv++) for(;*argv;argv++)
{ {
char const *name = *argv ; char const *name = *argv ;
int logname = 0 ;
logname = get_rstrlen_until(name,SS_LOG_SUFFIX) ;
if (!ss_resolve_check(sares.s,name)) strerr_dief2sys(111,"unknown service: ",name) ; if (!ss_resolve_check(sares.s,name)) strerr_dief2sys(111,"unknown service: ",name) ;
if (!ss_resolve_read(&res,sares.s,name)) strerr_diefu2sys(111,"read resolve file of: ",name) ; if (!ss_resolve_read(&res,sares.s,name)) strerr_diefu2sys(111,"read resolve file of: ",name) ;
if (res.type >= BUNDLE) strerr_dief3x(111,name," has type ",get_keybyid(res.type)) ; if (res.type >= BUNDLE) strerr_dief3x(111,name," has type ",get_keybyid(res.type)) ;
if (SIGNAL == SIGR && logname < 0) reverse = 1 ;
if (!ss_resolve_graph_build(&graph,&res,sares.s,reverse)) strerr_diefu1sys(111,"build services graph") ; if (!ss_resolve_graph_build(&graph,&res,sares.s,reverse)) strerr_diefu1sys(111,"build services graph") ;
} }
if (SIGNAL == SIGR) reverse = 0 ;
r = ss_resolve_graph_publish(&graph,reverse) ; r = ss_resolve_graph_publish(&graph,reverse) ;
if (r < 0) strerr_dief1x(111,"cyclic dependencies detected") ; if (r < 0) strerr_dief1x(111,"cyclic dependencies detected") ;
if (!r) strerr_diefu1sys(111,"publish service graph") ; if (!r) strerr_diefu1sys(111,"publish service graph") ;
for(unsigned int i = 0 ; i < genalloc_len(ss_resolve_t,&graph.sorted) ; i++) for(unsigned int i = 0 ; i < genalloc_len(ss_resolve_t,&graph.sorted) ; i++)
{ {
ss_resolve_sig_t sv_signal = RESOLVE_SIG_ZERO ; ss_resolve_sig_t sv_signal = RESOLVE_SIG_ZERO ;
...@@ -553,6 +557,13 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe ...@@ -553,6 +557,13 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
VERBO1 strerr_warni2x("Already down: ",string + sv_signal.res.name) ; VERBO1 strerr_warni2x("Already down: ",string + sv_signal.res.name) ;
continue ; continue ;
} }
/** special on reload signal, if the process is down
* simply bring it up */
else if (!isup && (SIGNAL == SIGR))
{
sig = "u" ;
SIGNAL = SIGUP ;
}
sv_signal.sigtosend = sig ; sv_signal.sig = SIGNAL ; sv_signal.sigtosend = sig ; sv_signal.sig = SIGNAL ;
/** notification-fd */ /** notification-fd */
...@@ -570,7 +581,7 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe ...@@ -570,7 +581,7 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
if (SIGNAL == SIGUP) if (SIGNAL == SIGUP)
{ sv_signal.sig = SIGRUP ; sv_signal.sigtosend = "uwU" ; } { sv_signal.sig = SIGRUP ; sv_signal.sigtosend = "uwU" ; }
else if (SIGNAL == SIGR) else if (SIGNAL == SIGR)
{ sv_signal.sig = SIGRR ; sv_signal.sigtosend = "uwR" ; } { sv_signal.sig = SIGRR ; sv_signal.sigtosend = "rwR" ; }
else if (SIGNAL == SIGDOWN) else if (SIGNAL == SIGDOWN)
{ sv_signal.sig = SIGRDOWN ; sv_signal.sigtosend = "dwD" ; } { sv_signal.sig = SIGRDOWN ; sv_signal.sigtosend = "dwD" ; }
} }
...@@ -595,7 +606,11 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe ...@@ -595,7 +606,11 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
tain_t tcheck ; tain_t tcheck ;
tain_from_millisecs(&tcheck,tsv) ; tain_from_millisecs(&tcheck,tsv) ;
int check = tain_to_millisecs(&tcheck) ; int check = tain_to_millisecs(&tcheck) ;
if (check > 0) tain_from_millisecs(&sv_signal.deadline, tsv) ; if (check > 0)
{
tain_from_millisecs(&sv_signal.deadline, tsv) ;
tsv_g += tsv ;
}
else else
{ {
/** timeout-{up/down} */ /** timeout-{up/down} */
...@@ -612,11 +627,17 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe ...@@ -612,11 +627,17 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
if (errno != ENOENT) strerr_diefu2sys(111, "access ", file) ; if (errno != ENOENT) strerr_diefu2sys(111, "access ", file) ;
if (errno == ENOENT) if (errno == ENOENT)
{
tain_from_millisecs(&sv_signal.deadline, SV_DEADLINE) ; tain_from_millisecs(&sv_signal.deadline, SV_DEADLINE) ;
tsv_g += SV_DEADLINE ;
}
else else
{ {
if (!read_uint(file,&t)) strerr_diefu2sys(111,"read: ",file) ; if (!read_uint(file,&t)) strerr_diefu2sys(111,"read: ",file) ;
{
tain_from_millisecs(&sv_signal.deadline, t) ; tain_from_millisecs(&sv_signal.deadline, t) ;
tsv_g += t ;
}
} }
} }
errno = e ; errno = e ;
...@@ -625,11 +646,11 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe ...@@ -625,11 +646,11 @@ int ssexec_svctl(int argc, char const *const *argv,char const *const *envp,ssexe
/** nothing to do */ /** nothing to do */
if (!genalloc_len(ss_resolve_sig_t,&gakeep)) goto finish ; if (!genalloc_len(ss_resolve_sig_t,&gakeep)) goto finish ;
ttmain = tain_infinite_relative ; //ttmain = tain_infinite_relative ;
tain_from_millisecs(&ttmain,tsv_g) ;
tain_now_g() ; tain_now_g() ;
tain_add_g(&ttmain,&ttmain) ; tain_add_g(&ttmain,&ttmain) ;
int spfd = selfpipe_init() ; int spfd = selfpipe_init() ;
if (spfd < 0) strerr_diefu1sys(111, "selfpipe_trap") ; if (spfd < 0) strerr_diefu1sys(111, "selfpipe_trap") ;
if (selfpipe_trap(SIGCHLD) < 0) strerr_diefu1sys(111, "selfpipe_trap") ; if (selfpipe_trap(SIGCHLD) < 0) strerr_diefu1sys(111, "selfpipe_trap") ;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment