From 6d20200d31d9dfca1423ff4183696c99288121ee Mon Sep 17 00:00:00 2001
From: obarun <eric@obarun.org>
Date: Fri, 27 Jan 2023 11:09:57 +1100
Subject: [PATCH] deal with oneshot manually

---
 src/lib66/exec/ssexec_reload.c  | 60 ++++++++++++++++++++++++++++-----
 src/lib66/exec/ssexec_restart.c | 54 +++++++++++++++++++++++++----
 2 files changed, 99 insertions(+), 15 deletions(-)

diff --git a/src/lib66/exec/ssexec_reload.c b/src/lib66/exec/ssexec_reload.c
index 96af54b9..0aa20c07 100644
--- a/src/lib66/exec/ssexec_reload.c
+++ b/src/lib66/exec/ssexec_reload.c
@@ -27,17 +27,18 @@
 #include <66/svc.h>
 #include <66/sanitize.h>
 #include <66/service.h>
+#include <66/enum.h>
 
 int ssexec_reload(int argc, char const *const *argv, ssexec_t *info)
 {
     log_flow() ;
 
-    int r ;
+    int r, nargc = 0, n = 0 ;
     uint32_t flag = 0 ;
     uint8_t siglen = 2 ;
     graph_t graph = GRAPH_ZERO ;
 
-    unsigned int areslen = 0 ;
+    unsigned int areslen = 0, m = 0 ;
     resolve_service_t ares[SS_MAX_SERVICE] ;
     char atree[SS_MAX_TREENAME + 1] ;
 
@@ -73,7 +74,8 @@ int ssexec_reload(int argc, char const *const *argv, ssexec_t *info)
     if ((svc_scandir_ok(info->scandir.s)) !=  1 )
         log_diesys(LOG_EXIT_SYS,"scandir: ", info->scandir.s, " is not running") ;
 
-    int n = 0 ;
+    char const *nargv[argc] ;
+
     for (; n < argc ; n++) {
 
         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)
         int aresid = service_resolve_array_search(ares, areslen, argv[n]) ;
         if (aresid < 0)
             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] ;
     if (siglen > 2) {
 
         sig[0] = "-P" ;
-        sig[1] = "-h" ;
+        sig[1] = "-H" ;
         sig[2] = 0 ;
 
     } else {
 
-        sig[0] = "-h" ;
+        sig[0] = "-H" ;
         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 ;
 }
diff --git a/src/lib66/exec/ssexec_restart.c b/src/lib66/exec/ssexec_restart.c
index 129f0fd0..d8f6ac43 100644
--- a/src/lib66/exec/ssexec_restart.c
+++ b/src/lib66/exec/ssexec_restart.c
@@ -27,17 +27,18 @@
 #include <66/svc.h>
 #include <66/sanitize.h>
 #include <66/service.h>
+#include <66/enum.h>
 
 int ssexec_restart(int argc, char const *const *argv, ssexec_t *info)
 {
     log_flow() ;
 
-    int r ;
+    int r, nargc = 0, n = 0 ;
     uint32_t flag = 0 ;
     uint8_t siglen = 3 ;
     graph_t graph = GRAPH_ZERO ;
 
-    unsigned int areslen = 0, n = 0 ;
+    unsigned int areslen = 0, m = 0 ;
     resolve_service_t ares[SS_MAX_SERVICE] ;
     char atree[SS_MAX_TREENAME + 1] ;
 
@@ -73,6 +74,8 @@ int ssexec_restart(int argc, char const *const *argv, ssexec_t *info)
     if ((svc_scandir_ok(info->scandir.s)) !=  1 )
         log_diesys(LOG_EXIT_SYS,"scandir: ", info->scandir.s, " is not running") ;
 
+    char const *nargv[argc] ;
+
     for (; n < argc ; n++) {
 
         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)
         int aresid = service_resolve_array_search(ares, areslen, argv[n]) ;
         if (aresid < 0)
             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] ;
     if (siglen > 3) {
@@ -128,5 +135,40 @@ int ssexec_restart(int argc, char const *const *argv, ssexec_t *info)
         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 ;
 }
-- 
GitLab