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

deal with oneshot manually

parent 5aa4d7fa
No related branches found
No related tags found
No related merge requests found
...@@ -27,17 +27,18 @@ ...@@ -27,17 +27,18 @@
#include <66/svc.h> #include <66/svc.h>
#include <66/sanitize.h> #include <66/sanitize.h>
#include <66/service.h> #include <66/service.h>
#include <66/enum.h>
int ssexec_reload(int argc, char const *const *argv, ssexec_t *info) int ssexec_reload(int argc, char const *const *argv, ssexec_t *info)
{ {
log_flow() ; log_flow() ;
int r ; int r, nargc = 0, n = 0 ;
uint32_t flag = 0 ; uint32_t flag = 0 ;
uint8_t siglen = 2 ; uint8_t siglen = 2 ;
graph_t graph = GRAPH_ZERO ; graph_t graph = GRAPH_ZERO ;
unsigned int areslen = 0 ; unsigned int areslen = 0, m = 0 ;
resolve_service_t ares[SS_MAX_SERVICE] ; resolve_service_t ares[SS_MAX_SERVICE] ;
char atree[SS_MAX_TREENAME + 1] ; char atree[SS_MAX_TREENAME + 1] ;
...@@ -73,7 +74,8 @@ int ssexec_reload(int argc, char const *const *argv, ssexec_t *info) ...@@ -73,7 +74,8 @@ int ssexec_reload(int argc, char const *const *argv, ssexec_t *info)
if ((svc_scandir_ok(info->scandir.s)) != 1 ) if ((svc_scandir_ok(info->scandir.s)) != 1 )
log_diesys(LOG_EXIT_SYS,"scandir: ", info->scandir.s, " is not running") ; log_diesys(LOG_EXIT_SYS,"scandir: ", info->scandir.s, " is not running") ;
int n = 0 ; char const *nargv[argc] ;
for (; n < argc ; n++) { for (; n < argc ; n++) {
r = service_is_g(atree, argv[n], STATE_FLAGS_ISPARSED) ; r = service_is_g(atree, argv[n], STATE_FLAGS_ISPARSED) ;
...@@ -108,24 +110,64 @@ int ssexec_reload(int argc, char const *const *argv, ssexec_t *info) ...@@ -108,24 +110,64 @@ int ssexec_reload(int argc, char const *const *argv, ssexec_t *info)
int aresid = service_resolve_array_search(ares, areslen, argv[n]) ; int aresid = service_resolve_array_search(ares, areslen, argv[n]) ;
if (aresid < 0) if (aresid < 0)
log_die(LOG_EXIT_USER, "service: ", *argv, " not available -- did you parsed it?") ; log_die(LOG_EXIT_USER, "service: ", *argv, " not available -- did you parsed it?") ;
}
service_resolve_array_free(ares, areslen) ; if (ares[aresid].type == TYPE_ONESHOT) {
nargc++ ;
nargv[m++] = ares[aresid].sa.s + ares[aresid].name ;
}
}
graph_free_all(&graph) ; if (nargc)
nargv[m] = 0 ;
char *sig[siglen] ; char *sig[siglen] ;
if (siglen > 2) { if (siglen > 2) {
sig[0] = "-P" ; sig[0] = "-P" ;
sig[1] = "-h" ; sig[1] = "-H" ;
sig[2] = 0 ; sig[2] = 0 ;
} else { } else {
sig[0] = "-h" ; sig[0] = "-H" ;
sig[1] = 0 ; sig[1] = 0 ;
} }
return svc_send(argv, argc, sig, siglen, info) ; r = svc_send_wait(argv, argc, sig, siglen, info) ;
if (r)
goto err ;
/** s6-supervise do not deal with oneshot service:
* The previous send command will bring it down but
* s6-supervise will not bring it up automatically.
* Well, do it manually */
if (nargc) {
int verbo = VERBOSITY ;
VERBOSITY = 0 ;
char *nsig[siglen + 1] ;
if (siglen > 2) {
nsig[0] = "-P" ;
nsig[1] = "-wU" ;
nsig[2] = "-u" ;
nsig[3] = 0 ;
} else {
nsig[0] = "-wU" ;
nsig[1] = "-u" ;
nsig[2] = 0 ;
}
siglen++ ;
r = svc_send_wait(nargv, nargc, nsig, siglen, info) ;
VERBOSITY = verbo ;
}
err:
service_resolve_array_free(ares, areslen) ;
graph_free_all(&graph) ;
return r ;
} }
...@@ -27,17 +27,18 @@ ...@@ -27,17 +27,18 @@
#include <66/svc.h> #include <66/svc.h>
#include <66/sanitize.h> #include <66/sanitize.h>
#include <66/service.h> #include <66/service.h>
#include <66/enum.h>
int ssexec_restart(int argc, char const *const *argv, ssexec_t *info) int ssexec_restart(int argc, char const *const *argv, ssexec_t *info)
{ {
log_flow() ; log_flow() ;
int r ; int r, nargc = 0, n = 0 ;
uint32_t flag = 0 ; uint32_t flag = 0 ;
uint8_t siglen = 3 ; uint8_t siglen = 3 ;
graph_t graph = GRAPH_ZERO ; graph_t graph = GRAPH_ZERO ;
unsigned int areslen = 0, n = 0 ; unsigned int areslen = 0, m = 0 ;
resolve_service_t ares[SS_MAX_SERVICE] ; resolve_service_t ares[SS_MAX_SERVICE] ;
char atree[SS_MAX_TREENAME + 1] ; char atree[SS_MAX_TREENAME + 1] ;
...@@ -73,6 +74,8 @@ int ssexec_restart(int argc, char const *const *argv, ssexec_t *info) ...@@ -73,6 +74,8 @@ int ssexec_restart(int argc, char const *const *argv, ssexec_t *info)
if ((svc_scandir_ok(info->scandir.s)) != 1 ) if ((svc_scandir_ok(info->scandir.s)) != 1 )
log_diesys(LOG_EXIT_SYS,"scandir: ", info->scandir.s, " is not running") ; log_diesys(LOG_EXIT_SYS,"scandir: ", info->scandir.s, " is not running") ;
char const *nargv[argc] ;
for (; n < argc ; n++) { for (; n < argc ; n++) {
r = service_is_g(atree, argv[n], STATE_FLAGS_ISPARSED) ; r = service_is_g(atree, argv[n], STATE_FLAGS_ISPARSED) ;
...@@ -107,11 +110,15 @@ int ssexec_restart(int argc, char const *const *argv, ssexec_t *info) ...@@ -107,11 +110,15 @@ int ssexec_restart(int argc, char const *const *argv, ssexec_t *info)
int aresid = service_resolve_array_search(ares, areslen, argv[n]) ; int aresid = service_resolve_array_search(ares, areslen, argv[n]) ;
if (aresid < 0) if (aresid < 0)
log_die(LOG_EXIT_USER, "service: ", *argv, " not available -- did you parsed it?") ; log_die(LOG_EXIT_USER, "service: ", *argv, " not available -- did you parsed it?") ;
}
service_resolve_array_free(ares, areslen) ; if (ares[aresid].type == TYPE_ONESHOT) {
nargc++ ;
nargv[m++] = ares[aresid].sa.s + ares[aresid].name ;
}
}
graph_free_all(&graph) ; if (nargc)
nargv[m] = 0 ;
char *sig[siglen] ; char *sig[siglen] ;
if (siglen > 3) { if (siglen > 3) {
...@@ -128,5 +135,40 @@ int ssexec_restart(int argc, char const *const *argv, ssexec_t *info) ...@@ -128,5 +135,40 @@ int ssexec_restart(int argc, char const *const *argv, ssexec_t *info)
sig[2] = 0 ; sig[2] = 0 ;
} }
return svc_send(argv, argc, sig, siglen, info) ; r = svc_send_wait(argv, argc, sig, siglen, info) ;
if (r)
goto err ;
/** s6-supervise do not deal with oneshot service:
* The previous send command will bring it down but
* s6-supervise will not bring it up automatically.
* Well, do it manually */
if (nargc) {
int verbo = VERBOSITY ;
VERBOSITY = 0 ;
if (siglen > 3) {
sig[0] = "-P" ;
sig[1] = "-wU" ;
sig[2] = "-u" ;
sig[3] = 0 ;
} else {
sig[0] = "-wU" ;
sig[1] = "-u" ;
sig[2] = 0 ;
}
r = svc_send_wait(nargv, nargc, sig, siglen, info) ;
VERBOSITY = verbo ;
}
err:
service_resolve_array_free(ares, areslen) ;
graph_free_all(&graph) ;
return r ;
} }
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