aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2025-11-02 07:44:29 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2025-11-02 07:44:29 +0000
commitfc800a4c09d282bb046b67116da748d90dcfa56a (patch)
tree14691748acf1df591a2bcf54f619053f0ee5045d /src
parent2c2430d7a7c32aed2cadb876a3ae9a71fcdb37a1 (diff)
downloads6-fc800a4c09d282bb046b67116da748d90dcfa56a.tar.gz
Improve s6-svc; prepare for 2.14.0.0
Diffstat (limited to 'src')
-rw-r--r--src/supervision/s6-svc.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/src/supervision/s6-svc.c b/src/supervision/s6-svc.c
index 40a2cd8..0c67dee 100644
--- a/src/supervision/s6-svc.c
+++ b/src/supervision/s6-svc.c
@@ -18,7 +18,7 @@
#include <s6/config.h>
#include <s6/supervise.h>
-#define USAGE "s6-svc [ -wu | -wU | -wd | -wD | -wr | -wR ] [ -T timeout ] [ -s signal | -abqhkti12pcyrPCK ] [ -oduDUxOQ ] servicedir"
+#define USAGE "s6-svc [ -wu | -wU | -wd | -wD | -wr | -wR ] [ -T timeout ] [ -s signal | -abqhkti12pcyrPCK ] [ -oduDUxOQ ] servicedirs..."
#define dieusage() strerr_dieusage(100, USAGE)
#define DATASIZE 63
@@ -103,7 +103,6 @@ int main (int argc, char const *const *argv)
argc -= l.ind ; argv += l.ind ;
}
if (!argc) dieusage() ;
- if (argc > 1) strerr_warnw1x("ignoring extra arguments") ;
len = strlen(argv[0]) ;
if (!len) strerr_dief1x(100, "invalid service path") ;
@@ -122,10 +121,10 @@ int main (int argc, char const *const *argv)
if (updown[1])
{
- char const *newargv[11] ;
+ char const *newargv[6 + argc + (datalen > 1 ? 4 + argc : 0)] ;
unsigned int m = 0 ;
char fmt[UINT_FMT] ;
- newargv[m++] = datalen > 1 ? S6_BINPREFIX "s6-svlisten1" : S6_BINPREFIX "s6-svwait" ;
+ newargv[m++] = datalen > 1 ? S6_BINPREFIX "s6-svlisten" : S6_BINPREFIX "s6-svwait" ;
newargv[m++] = updown ;
if (timeout)
{
@@ -134,22 +133,30 @@ int main (int argc, char const *const *argv)
newargv[m++] = fmt ;
}
newargv[m++] = "--" ;
- newargv[m++] = argv[0] ;
+ for (unsigned int i = 0 ; i < argc ; i++) newargv[m++] = argv[i] ;
if (datalen > 1)
{
+ newargv[m++] = "" ;
newargv[m++] = S6_BINPREFIX "s6-svc" ;
newargv[m++] = data ;
newargv[m++] = "--" ;
- newargv[m++] = argv[0] ;
+ for (unsigned int i = 0 ; i < argc ; i++) newargv[m++] = argv[i] ;
}
newargv[m++] = 0 ;
- xexec(newargv) ;
+ xmexec_n(newargv, "EXECLINE_STRICT", sizeof("EXECLINE_STRICT"), 1) ;
}
- else switch (s6_svc_writectl(argv[0], S6_SUPERVISE_CTLDIR, data + 1, datalen - 1))
+ else
{
- case -1 : strerr_diefu2sys(111, "control ", argv[0]) ;
- case -2 : strerr_dief3sys(100, "something is wrong with the ", argv[0], "/" S6_SUPERVISE_CTLDIR " directory") ;
- case 0 : strerr_diefu3x(100, "control ", argv[0], ": supervisor not listening") ;
+ int e = 0 ;
+ for (unsigned int i = 0 ; i < argc ; i++)
+ {
+ switch (s6_svc_writectl(argv[0], S6_SUPERVISE_CTLDIR, data + 1, datalen - 1))
+ {
+ case -1 : { strerr_warnwu2sys("control ", argv[i]) ; e = 111 ; break ; }
+ case -2 : { strerr_warnw3sys("something is wrong with the ", argv[i], "/" S6_SUPERVISE_CTLDIR " directory") ; e = 1 ; break ; }
+ case 0 : { strerr_warnwu3x("control ", argv[i], ": supervisor not listening") ; e = 102 ; break ; }
+ }
+ }
+ _exit(e) ;
}
- return 0 ;
}