From 6d953b22ae50261812b27ba84ecd6dc33b2007de Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Mon, 30 Jun 2025 14:41:53 +0000 Subject: Adapt to new gol Signed-off-by: Laurent Bercot --- src/s6/deps-exe/s6 | 6 +-- src/s6/process_kill.c | 19 ++++--- src/s6/process_restart.c | 18 +++---- src/s6/process_start.c | 38 ------------- src/s6/process_startstop.c | 45 ++++++++++++++++ src/s6/process_status.c | 16 +++--- src/s6/process_stop.c | 38 ------------- src/s6/s6.c | 90 +++++++++++++++---------------- src/s6/service_start.c | 122 ------------------------------------------ src/s6/service_startstop.c | 129 +++++++++++++++++++++++++++++++++++++++++++++ src/s6/service_status.c | 14 ++--- src/s6/service_stop.c | 32 ----------- 12 files changed, 254 insertions(+), 313 deletions(-) delete mode 100644 src/s6/process_start.c create mode 100644 src/s6/process_startstop.c delete mode 100644 src/s6/process_stop.c delete mode 100644 src/s6/service_start.c create mode 100644 src/s6/service_startstop.c delete mode 100644 src/s6/service_stop.c (limited to 'src/s6') diff --git a/src/s6/deps-exe/s6 b/src/s6/deps-exe/s6 index 1d03ef1..9c0862f 100644 --- a/src/s6/deps-exe/s6 +++ b/src/s6/deps-exe/s6 @@ -3,13 +3,11 @@ util.o process.o process_kill.o process_restart.o -process_start.o +process_startstop.o process_status.o -process_stop.o service.o -service_start.o +service_startstop.o service_status.o -service_stop.o libs6f.a.xyzzy -ls6rc -ls6 diff --git a/src/s6/process_kill.c b/src/s6/process_kill.c index e33b47f..64f7ffb 100644 --- a/src/s6/process_kill.c +++ b/src/s6/process_kill.c @@ -46,31 +46,30 @@ static int process_kill_hack_kill (int sig, char const *const *argv) } -enum process_kill_gola_e +enum gola_e { - PROCESS_KILL_GOLA_SIGNAL, - PROCESS_KILL_GOLA_N + GOLA_SIGNAL, + GOLA_N } ; -static gol_arg const process_kill_gola[PROCESS_KILL_GOLA_N] = +static gol_arg const rgola[GOLA_N] = { - { .so = 's', .lo = "signal", .i = PROCESS_KILL_GOLA_SIGNAL }, + { .so = 's', .lo = "signal", .i = GOLA_SIGNAL }, } ; int process_kill (char const *const *argv) { - uint64_t golb = 0 ; - char const *gola[PROCESS_KILL_GOLA_N] = { 0 } ; + char const *wgola[GOLA_N] = { 0 } ; char const *svcopt = 0 ; size_t argc ; int sig = SIGTERM ; PROG = "s6 process kill" ; - argv += gol_argv(argv, 0, 0, process_kill_gola, PROCESS_KILL_GOLA_N, &golb, gola) ; + argv += gol_argv(argv, 0, 0, rgola, GOLA_N, 0, wgola) ; if (!argv) dieusage() ; - if (gola[PROCESS_KILL_GOLA_SIGNAL]) + if (wgola[GOLA_SIGNAL]) { - if (!sig0_scan(gola[PROCESS_KILL_GOLA_SIGNAL], &sig)) + if (!sig0_scan(wgola[GOLA_SIGNAL], &sig)) strerr_dief1x(100, "--signal= argument must be the name or number of a signal") ; } argc = env_len(argv) ; diff --git a/src/s6/process_restart.c b/src/s6/process_restart.c index 9e8c083..73e66f3 100644 --- a/src/s6/process_restart.c +++ b/src/s6/process_restart.c @@ -12,27 +12,27 @@ #define USAGE "s6 process restart [ -W|--nowait ] services..." #define dieusage() strerr_dieusage(100, USAGE) -enum process_restart_golb_e +enum golb_e { - PROCESS_RESTART_GOLB_WAIT, - PROCESS_RESTART_GOLB_N + GOLB_WAIT, + GOLB_N } ; -static gol_bool const process_restart_golb[2] = +static gol_bool const rgolb[2] = { - { .so = 'W', .lo = "nowait", .set = 0, .mask = 1 << PROCESS_RESTART_GOLB_WAIT }, - { .so = 'w', .lo = "wait", .set = 1, .mask = 1 << PROCESS_RESTART_GOLB_WAIT } + { .so = 'W', .lo = "nowait", .clear = 1 << GOLB_WAIT, .set = 0 }, + { .so = 'w', .lo = "wait", .clear = 0, .set = 1 << GOLB_WAIT } } ; int process_restart (char const *const *argv) { - uint64_t golb = 1 << PROCESS_RESTART_GOLB_WAIT ; + uint64_t wgolb = 1 << GOLB_WAIT ; size_t argc ; PROG = "s6 process restart" ; - argv += gol_argv(argv, process_restart_golb, 2, 0, 0, &golb, 0) ; + argv += gol_argv(argv, rgolb, 2, 0, 0, &wgolb, 0) ; if (!argv) dieusage() ; argc = env_len(argv) ; process_check_services(argv, argc) ; - return process_send_svc(golb & 1 << PROCESS_RESTART_GOLB_WAIT ? "-rwR" : "-r", argv, argc) ; + return process_send_svc(wgolb & 1 << GOLB_WAIT ? "-rwR" : "-r", argv, argc) ; } diff --git a/src/s6/process_start.c b/src/s6/process_start.c deleted file mode 100644 index a2186cf..0000000 --- a/src/s6/process_start.c +++ /dev/null @@ -1,38 +0,0 @@ -/* ISC license. */ - -#include - -#include -#include -#include -#include - -#include "s6-internal.h" - -#define USAGE "s6 process start [ -W|--nowait | -w|--wait ] services..." -#define dieusage() strerr_dieusage(100, USAGE) - -enum process_start_golb_e -{ - PROCESS_START_GOLB_WAIT, - PROCESS_START_GOLB_N -} ; - -static gol_bool const process_start_golb[2] = -{ - { .so = 'W', .lo = "nowait", .set = 0, .mask = 1 << PROCESS_START_GOLB_WAIT }, - { .so = 'w', .lo = "wait", .set = 1, .mask = 1 << PROCESS_START_GOLB_WAIT } -} ; - -int process_start (char const *const *argv) -{ - uint64_t golb = 1 << PROCESS_START_GOLB_WAIT ; - size_t argc ; - PROG = "s6 process start" ; - - argv += gol_argv(argv, process_start_golb, 2, 0, 0, &golb, 0) ; - if (!argv) dieusage() ; - argc = env_len(argv) ; - process_check_services(argv, argc) ; - return process_send_svc(golb & 1 << PROCESS_START_GOLB_WAIT ? "-uwU" : "-u", argv, argc) ; -} diff --git a/src/s6/process_startstop.c b/src/s6/process_startstop.c new file mode 100644 index 0000000..8a5089e --- /dev/null +++ b/src/s6/process_startstop.c @@ -0,0 +1,45 @@ +/* ISC license. */ + +#include + +#include +#include +#include +#include + +#include "s6-internal.h" + +enum golb_e +{ + GOLB_WAIT, + GOLB_N +} ; + +static gol_bool const rgolb[2] = +{ + { .so = 'W', .lo = "nowait", .clear = 1 << GOLB_WAIT, .set = 0 }, + { .so = 'w', .lo = "wait", .clear = 0, .set = 1 << GOLB_WAIT } +} ; + +static int process_startstop (char const *const *argv, int h) +{ + uint64_t wgolb = 1 << GOLB_WAIT ; + size_t argc ; + PROG = h ? "s6 process start" : "s6 process stop" ; + + argv += gol_argv(argv, rgolb, 2, 0, 0, &wgolb, 0) ; + if (!argv) strerr_dien(100, 4, PROG, ": usage: ", PROG, " [ -W|--nowait | -w|--wait ] services...") ; + argc = env_len(argv) ; + process_check_services(argv, argc) ; + return process_send_svc(wgolb & 1 << GOLB_WAIT ? h ? "-uwU" : "-dwD" : h ? "-u" : "-d", argv, argc) ; +} + +int process_start (char const *const *argv) +{ + return process_startstop(argv, 1) ; +} + +int process_stop (char const *const *argv) +{ + return process_startstop(argv, 0) ; +} diff --git a/src/s6/process_status.c b/src/s6/process_status.c index 96eb84b..a13938d 100644 --- a/src/s6/process_status.c +++ b/src/s6/process_status.c @@ -73,26 +73,26 @@ static int do_status (char const *dir, int withlog) } -enum process_status_golb_e +enum golb_e { - PROCESS_STATUS_GOLB_WITHLOGS, - PROCESS_STATUS_GOLB_N + GOLB_WITHLOGS, + GOLB_N } ; -static gol_bool const process_status_golb[1] = +static gol_bool const rgolb[1] = { - { .so = 'l', .lo = "with-logs", .set = 1, .mask = 1 << PROCESS_STATUS_GOLB_WITHLOGS } + { .so = 'l', .lo = "with-logs", .clear = 0, .set = 1 << GOLB_WITHLOGS } } ; int process_status (char const *const *argv) { size_t scandirlen = strlen(g->dirs.scan) ; - uint64_t golb = 0 ; + uint64_t wgolb = 0 ; int e = 0 ; PROG = "s6 process status" ; - argv += gol_argv(argv, process_status_golb, 1, 0, 0, &golb, 0) ; + argv += gol_argv(argv, rgolb, 1, 0, 0, &wgolb, 0) ; if (!argv) dieusage() ; process_check_services(argv, env_len(argv)) ; for (; *argv ; argv++) @@ -102,7 +102,7 @@ int process_status (char const *const *argv) memcpy(path, g->dirs.scan, scandirlen) ; path[scandirlen] = '/' ; memcpy(path + scandirlen + 1, *argv, len+1) ; - if (do_status(path, !!(golb & 1 << PROCESS_STATUS_GOLB_WITHLOGS))) e = 1 ; + if (do_status(path, !!(wgolb & 1 << GOLB_WITHLOGS))) e = 1 ; } return e ; } diff --git a/src/s6/process_stop.c b/src/s6/process_stop.c deleted file mode 100644 index 6f11b02..0000000 --- a/src/s6/process_stop.c +++ /dev/null @@ -1,38 +0,0 @@ -/* ISC license. */ - -#include - -#include -#include -#include -#include - -#include "s6-internal.h" - -#define USAGE "s6 process stop [ -W|--nowait | -w|--wait ] services..." -#define dieusage() strerr_dieusage(100, USAGE) - -enum process_stop_golb_e -{ - PROCESS_STOP_GOLB_WAIT, - PROCESS_STOP_GOLB_N -} ; - -static gol_bool const process_stop_golb[2] = -{ - { .so = 'W', .lo = "nowait", .set = 0, .mask = 1 << PROCESS_STOP_GOLB_WAIT }, - { .so = 'w', .lo = "wait", .set = 1, .mask = 1 << PROCESS_STOP_GOLB_WAIT } -} ; - -int process_stop (char const *const *argv) -{ - uint64_t golb = 1 << PROCESS_STOP_GOLB_WAIT ; - size_t argc ; - PROG = "s6 process stop" ; - - argv += gol_argv(argv, process_stop_golb, 2, 0, 0, &golb, 0) ; - if (!argv) dieusage() ; - argc = env_len(argv) ; - process_check_services(argv, argc) ; - return process_send_svc(golb & 1 << PROCESS_STOP_GOLB_WAIT ? "-dwD" : "-d", argv, argc) ; -} diff --git a/src/s6/s6.c b/src/s6/s6.c index 2467f3c..e7ecd6f 100644 --- a/src/s6/s6.c +++ b/src/s6/s6.c @@ -28,47 +28,47 @@ int version (char const *const *argv) return 0 ; } -enum main_golb_e +enum golb_e { - MAIN_GOLB_HELP, - MAIN_GOLB_VERSION, - MAIN_GOLB_USER, - MAIN_GOLB_N + GOLB_HELP, + GOLB_VERSION, + GOLB_USER, + GOLB_N } ; -enum main_gola_e +enum gola_e { - MAIN_GOLA_SCANDIR, - MAIN_GOLA_LIVEDIR, - MAIN_GOLA_REPODIR, - MAIN_GOLA_BOOTDIR, - MAIN_GOLA_STMPDIR, - MAIN_GOLA_VERBOSITY, - MAIN_GOLA_COLOR, - MAIN_GOLA_N + GOLA_SCANDIR, + GOLA_LIVEDIR, + GOLA_REPODIR, + GOLA_BOOTDIR, + GOLA_STMPDIR, + GOLA_VERBOSITY, + GOLA_COLOR, + GOLA_N } ; -static gol_bool const main_golb[MAIN_GOLB_N] = +static gol_bool const rgolb[GOLB_N] = { - { .so = 'h', .lo = "help", .set = 1, .mask = 1 << MAIN_GOLB_HELP }, - { .so = 'V', .lo = "version", .set = 1, .mask = 1 << MAIN_GOLB_VERSION }, - { .so = 0, .lo = "user", .set = 1, .mask = 1 << MAIN_GOLB_USER } + { .so = 'h', .lo = "help", .clear = 0, .set = 1 << GOLB_HELP }, + { .so = 'V', .lo = "version", .clear = 0, .set = 1 << GOLB_VERSION }, + { .so = 0, .lo = "user", .clear = 0, .set = 1 << GOLB_USER } } ; -static gol_arg const main_gola[MAIN_GOLA_N] = +static gol_arg const rgola[GOLA_N] = { - { .so = 's', .lo = "scandir", .i = MAIN_GOLA_SCANDIR }, - { .so = 'l', .lo = "livedir", .i = MAIN_GOLA_LIVEDIR }, - { .so = 'r', .lo = "repodir", .i = MAIN_GOLA_REPODIR }, - { .so = 'b', .lo = "bootdir", .i = MAIN_GOLA_BOOTDIR }, - { .so = 0, .lo = "stmpdir", .i = MAIN_GOLA_STMPDIR }, - { .so = 'v', .lo = "verbosity", .i = MAIN_GOLA_VERBOSITY }, - { .so = 0, .lo = "color", .i = MAIN_GOLA_COLOR } + { .so = 's', .lo = "scandir", .i = GOLA_SCANDIR }, + { .so = 'l', .lo = "livedir", .i = GOLA_LIVEDIR }, + { .so = 'r', .lo = "repodir", .i = GOLA_REPODIR }, + { .so = 'b', .lo = "bootdir", .i = GOLA_BOOTDIR }, + { .so = 0, .lo = "stmpdir", .i = GOLA_STMPDIR }, + { .so = 'v', .lo = "verbosity", .i = GOLA_VERBOSITY }, + { .so = 0, .lo = "color", .i = GOLA_COLOR } } ; struct global_s *g ; -static struct command_s const main_commands[] = +static struct command_s const commands[] = { { .s = "help", .f = &help }, { .s = "process", .f = &process }, @@ -79,55 +79,55 @@ static struct command_s const main_commands[] = int main (int argc, char const *const *argv, char const *const *envp) { struct global_s globals_in_the_stack = GLOBAL_ZERO ; - char const *gola[MAIN_GOLA_N] = { 0 } ; - uint64_t golb = 0 ; + char const *wgola[GOLA_N] = { 0 } ; + uint64_t wgolb = 0 ; unsigned int golc ; struct command_s *cmd ; PROG = "s6" ; g = &globals_in_the_stack ; - golc = gol_main(argc, argv, main_golb, MAIN_GOLB_N, main_gola, MAIN_GOLA_N, &golb, gola) ; + golc = gol_main(argc, argv, rgolb, GOLB_N, rgola, GOLA_N, &wgolb, wgola) ; argc -= golc ; argv += golc ; - if (gola[MAIN_GOLA_VERBOSITY] && !uint0_scan(gola[MAIN_GOLA_VERBOSITY], &g->verbosity)) + if (wgola[GOLA_VERBOSITY] && !uint0_scan(wgola[GOLA_VERBOSITY], &g->verbosity)) strerr_dief1x(100, "verbosity must be an unsigned integer") ; - if (golb & 1 << MAIN_GOLB_VERSION) version(argv) ; - if (golb & 1 << MAIN_GOLB_HELP) help(argv) ; - if (golb & (1 << MAIN_GOLB_VERSION | 1 << MAIN_GOLB_HELP)) return 0 ; + if (wgolb & 1 << GOLB_VERSION) version(argv) ; + if (wgolb & 1 << GOLB_HELP) help(argv) ; + if (wgolb & (1 << GOLB_VERSION | 1 << GOLB_HELP)) return 0 ; - if (gola[MAIN_GOLA_SCANDIR]) g->dirs.scan = gola[MAIN_GOLA_SCANDIR] ; - if (gola[MAIN_GOLA_LIVEDIR]) g->dirs.live = gola[MAIN_GOLA_LIVEDIR] ; - if (gola[MAIN_GOLA_REPODIR]) g->dirs.repo = gola[MAIN_GOLA_REPODIR] ; - if (gola[MAIN_GOLA_BOOTDIR]) g->dirs.boot = gola[MAIN_GOLA_BOOTDIR] ; - if (gola[MAIN_GOLA_STMPDIR]) g->dirs.stmp = gola[MAIN_GOLA_STMPDIR] ; + if (wgola[GOLA_SCANDIR]) g->dirs.scan = wgola[GOLA_SCANDIR] ; + if (wgola[GOLA_LIVEDIR]) g->dirs.live = wgola[GOLA_LIVEDIR] ; + if (wgola[GOLA_REPODIR]) g->dirs.repo = wgola[GOLA_REPODIR] ; + if (wgola[GOLA_BOOTDIR]) g->dirs.boot = wgola[GOLA_BOOTDIR] ; + if (wgola[GOLA_STMPDIR]) g->dirs.stmp = wgola[GOLA_STMPDIR] ; { int force_color = 0 ; g->istty = isatty(1) ; - if (gola[MAIN_GOLA_COLOR]) + if (wgola[GOLA_COLOR]) { - if (!strcmp(gola[MAIN_GOLA_COLOR], "yes")) + if (!strcmp(wgola[GOLA_COLOR], "yes")) { force_color = 1 ; g->color = 1 ; } - else if (!strcmp(gola[MAIN_GOLA_COLOR], "no")) + else if (!strcmp(wgola[GOLA_COLOR], "no")) { force_color = 1 ; g->color = 0 ; } - else if (strcmp(gola[MAIN_GOLA_COLOR], "auto")) + else if (strcmp(wgola[GOLA_COLOR], "auto")) strerr_dief1x(100, "--color value must be yes, no, or auto") ; } if (!force_color) g->color = g->istty ; } - g->isuser = !!(golb & 1 << MAIN_GOLB_USER) ; + g->isuser = !!(wgolb & 1 << GOLB_USER) ; if (g->isuser) s6f_user_get_confdirs(&g->dirs, &g->userstorage) ; if (!*argv) dieusage() ; - cmd = BSEARCH(struct command_s, *argv, main_commands) ; + cmd = BSEARCH(struct command_s, *argv, commands) ; if (!cmd) dieusage() ; return (*cmd->f)(++argv) ; } diff --git a/src/s6/service_start.c b/src/s6/service_start.c deleted file mode 100644 index 90a3087..0000000 --- a/src/s6/service_start.c +++ /dev/null @@ -1,122 +0,0 @@ -/* ISC license. */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "s6-internal.h" - -#define USAGE "s6 service start services..." -#define dieusage() strerr_dieusage(100, USAGE) - -enum service_start_golb_e -{ - SERVICE_START_GOLB_DRYRUN, - SERVICE_START_GOLB_WAIT, - SERVICE_START_GOLB_N -} ; - -enum service_start_gola_e -{ - SERVICE_START_GOLA_TIMEOUT, - SERVICE_START_GOLA_N -} ; - -static gol_bool const service_start_golb[3] = -{ - { .so = 'n', .lo = "dryrun", .set = 1, .mask = 1 << SERVICE_START_GOLB_DRYRUN }, - { .so = 'W', .lo = "nowait", .set = 0, .mask = 1 << SERVICE_START_GOLB_WAIT }, - { .so = 'w', .lo = "wait", .set = 1, .mask = 1 << SERVICE_START_GOLB_WAIT } -} ; - -static gol_arg const service_start_gola[SERVICE_START_GOLA_N] = -{ - { .so = 't', .lo = "timeout", .i = SERVICE_START_GOLA_TIMEOUT } -} ; - -int service_start (char const *const *argv) -{ - char const *gola[SERVICE_START_GOLA_N] = { 0 } ; - uint64_t golb = 0 ; - unsigned int t = 0 ; - size_t argc = env_len(argv) ; - pid_t pid ; - int wstat ; - uint32_t nlong, nshort, n ; - int livelock, compiledlock ; - size_t livelen = strlen(g->dirs.live) ; - PROG = "s6 service start" ; - - argv += gol_argv(argv, service_start_golb, 3, service_start_gola, SERVICE_START_GOLA_N, &golb, gola) ; - if (!*argv) dieusage() ; - - if (gola[SERVICE_START_GOLA_TIMEOUT]) - { - if (!uint0_scan(gola[SERVICE_START_GOLA_TIMEOUT], &t)) - strerr_dief1x(100, "timeout must be an integer (milliseconds)") ; - } - s6f_lock(g->dirs.stmp, 0) ; /* leaks, it's fine */ - char dbfn[livelen + 10] ; - memcpy(dbfn, g->dirs.live, livelen) ; - memcpy(dbfn + livelen, "/compiled", 10) ; - if (!s6rc_lock(g->dirs.live, 2, &livelock, dbfn, 1, &compiledlock, 1)) - strerr_diefu2sys(111, "take lock in ", g->dirs.live) ; - if (!s6rc_live_state_size(g->dirs.live, &nlong, &nshort)) - strerr_diefu2sys(111, "read state size in ", g->dirs.live) ; - n = nlong + nshort ; - unsigned char oldstate[n] ; - if (!s6rc_live_state_read(g->dirs.live, oldstate, n)) - strerr_diefu2sys(111, "read state in ", g->dirs.live) ; - - { - size_t m = 0 ; - char const *newargv[13 + argc] ; - char fmtv[UINT_FMT] ; - char fmtt[UINT_FMT] ; - - newargv[m++] = S6RC_EXTBINPREFIX "s6-rc" ; - newargv[m++] = "-X" ; /* we already took the locks */ - newargv[m++] = "-v" ; - newargv[m++] = fmtv ; - fmtv[uint_fmt(fmtv, g->verbosity)] = 0 ; - if (t) - { - newargv[m++] = "-t" ; - newargv[m++] = fmtt ; - fmtt[uint_fmt(fmtt, t)] = 0 ; - } - if (golb & 1 << SERVICE_START_GOLB_DRYRUN) - { - newargv[m++] = "-n" ; - newargv[m++] = "1" ; - } - newargv[m++] = "-l" ; - newargv[m++] = g->dirs.live ; - newargv[m++] = "--" ; - newargv[m++] = "start" ; - while (*argv) newargv[m++] = *argv++ ; - newargv[m++] = 0 ; - pid = cspawn(newargv[0], newargv, (char const *const *)environ, CSPAWN_FLAGS_SIGBLOCKNONE, 0, 0) ; - if (!pid) strerr_diefu2sys(111, "spawn ", newargv[0]) ; - } - if (wait_pid(pid, &wstat) <= 0) strerr_diefu1sys(111, "wait for s6-rc") ; - if ((WIFEXITED(wstat) && !WEXITSTATUS(wstat)) || !g->verbosity) - return wait_estatus(wstat) ; - - unsigned char newstate[n] ; - if (!s6rc_live_state_read(g->dirs.live, newstate, n)) - strerr_diefu2sys(111, "read state in ", g->dirs.live) ; - s6f_report_state_change(n, oldstate, newstate, dbfn) ; - return wait_estatus(wstat) ; -} diff --git a/src/s6/service_startstop.c b/src/s6/service_startstop.c new file mode 100644 index 0000000..c4946fc --- /dev/null +++ b/src/s6/service_startstop.c @@ -0,0 +1,129 @@ +/* ISC license. */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "s6-internal.h" + +enum golb_e +{ + GOLB_DRYRUN, + GOLB_WAIT, + GOLB_N +} ; + +enum gola_e +{ + GOLA_TIMEOUT, + GOLA_N +} ; + +static gol_bool const rgolb[3] = +{ + { .so = 'n', .lo = "dryrun", .clear = 0, .set = 1 << GOLB_DRYRUN }, + { .so = 'W', .lo = "nowait", .clear = 1 << GOLB_WAIT, .set = 0 }, + { .so = 'w', .lo = "wait", .clear = 0, .set = 1 << GOLB_WAIT } +} ; + +static gol_arg const rgola[GOLA_N] = +{ + { .so = 't', .lo = "timeout", .i = GOLA_TIMEOUT } +} ; + +static int service_startstop (char const *const *argv, int h) +{ + char const *wgola[GOLA_N] = { 0 } ; + uint64_t wgolb = 0 ; + unsigned int t = 0 ; + size_t argc = env_len(argv) ; + pid_t pid ; + int wstat ; + uint32_t nlong, nshort, n ; + int livelock, compiledlock ; + size_t livelen = strlen(g->dirs.live) ; + PROG = h ? "s6 service start" : "s6 service stop" ; + + argv += gol_argv(argv, rgolb, 3, rgola, GOLA_N, &wgolb, wgola) ; + if (!*argv) strerr_dieusage(100, h ? "s6 service start services..." : "s6 service stop services...") ; + + if (wgola[GOLA_TIMEOUT]) + { + if (!uint0_scan(wgola[GOLA_TIMEOUT], &t)) + strerr_dief1x(100, "timeout must be an integer (milliseconds)") ; + } + s6f_lock(g->dirs.stmp, 0) ; /* leaks, it's fine */ + char dbfn[livelen + 10] ; + memcpy(dbfn, g->dirs.live, livelen) ; + memcpy(dbfn + livelen, "/compiled", 10) ; + if (!s6rc_lock(g->dirs.live, 2, &livelock, dbfn, 1, &compiledlock, 1)) + strerr_diefu2sys(111, "take lock in ", g->dirs.live) ; + if (!s6rc_live_state_size(g->dirs.live, &nlong, &nshort)) + strerr_diefu2sys(111, "read state size in ", g->dirs.live) ; + n = nlong + nshort ; + unsigned char oldstate[n] ; + if (!s6rc_live_state_read(g->dirs.live, oldstate, n)) + strerr_diefu2sys(111, "read state in ", g->dirs.live) ; + + { + size_t m = 0 ; + char const *newargv[13 + argc] ; + char fmtv[UINT_FMT] ; + char fmtt[UINT_FMT] ; + + newargv[m++] = S6RC_EXTBINPREFIX "s6-rc" ; + newargv[m++] = "-X" ; /* we already took the locks */ + newargv[m++] = "-v" ; + newargv[m++] = fmtv ; + fmtv[uint_fmt(fmtv, g->verbosity)] = 0 ; + if (t) + { + newargv[m++] = "-t" ; + newargv[m++] = fmtt ; + fmtt[uint_fmt(fmtt, t)] = 0 ; + } + if (wgolb & 1 << GOLB_DRYRUN) + { + newargv[m++] = "-n" ; + newargv[m++] = "1" ; + } + newargv[m++] = "-l" ; + newargv[m++] = g->dirs.live ; + newargv[m++] = "--" ; + newargv[m++] = h ? "start" : "stop" ; + while (*argv) newargv[m++] = *argv++ ; + newargv[m++] = 0 ; + pid = cspawn(newargv[0], newargv, (char const *const *)environ, CSPAWN_FLAGS_SIGBLOCKNONE, 0, 0) ; + if (!pid) strerr_diefu2sys(111, "spawn ", newargv[0]) ; + } + if (wait_pid(pid, &wstat) <= 0) strerr_diefu1sys(111, "wait for s6-rc") ; + if ((WIFEXITED(wstat) && !WEXITSTATUS(wstat)) || !g->verbosity) + return wait_estatus(wstat) ; + + unsigned char newstate[n] ; + if (!s6rc_live_state_read(g->dirs.live, newstate, n)) + strerr_diefu2sys(111, "read state in ", g->dirs.live) ; + s6f_report_state_change(n, oldstate, newstate, dbfn, h) ; + return wait_estatus(wstat) ; +} + +int service_start (char const *const *argv) +{ + return service_startstop(argv, 1) ; +} + +int service_stop (char const *const *argv) +{ + return service_startstop(argv, 0) ; +} diff --git a/src/s6/service_status.c b/src/s6/service_status.c index ae6f97d..5bf71b5 100644 --- a/src/s6/service_status.c +++ b/src/s6/service_status.c @@ -9,23 +9,23 @@ #define USAGE "s6 service status services..." #define dieusage() strerr_dieusage(100, USAGE) -enum service_status_golb_e +enum golb_e { - SERVICE_STATUS_GOLB_WAIT, - SERVICE_STATUS_GOLB_N + GOLB_WAIT, + GOLB_N } ; -static gol_bool const service_status_golb[2] = +static gol_bool const rgolb[2] = { - { .so = 'w', .lo = "wait", .set = 1, .mask = 1 << SERVICE_STATUS_GOLB_WAIT } + { .so = 'w', .lo = "wait", .clear = 0, .set = 1 << GOLB_WAIT } } ; int service_status (char const *const *argv) { - uint64_t golb = 0 ; + uint64_t wgolb = 0 ; PROG = "s6 service status" ; - argv += gol_argv(argv, service_status_golb, 0, 0, 0, &golb, 0) ; + argv += gol_argv(argv, rgolb, 0, 0, 0, &wgolb, 0) ; if (!argv) dieusage() ; return 0 ; } diff --git a/src/s6/service_stop.c b/src/s6/service_stop.c deleted file mode 100644 index fc1db58..0000000 --- a/src/s6/service_stop.c +++ /dev/null @@ -1,32 +0,0 @@ -/* ISC license. */ - -#include -#include -#include - -#include "s6-internal.h" - -#define USAGE "s6 service stop services..." -#define dieusage() strerr_dieusage(100, USAGE) - -enum service_stop_golb_e -{ - SERVICE_STOP_GOLB_WAIT, - SERVICE_STOP_GOLB_N -} ; - -static gol_bool const service_stop_golb[2] = -{ - { .so = 'W', .lo = "nowait", .set = 0, .mask = 1 << SERVICE_STOP_GOLB_WAIT }, - { .so = 'w', .lo = "wait", .set = 1, .mask = 1 << SERVICE_STOP_GOLB_WAIT } -} ; - -int service_stop (char const *const *argv) -{ - uint64_t golb = 0 ; - PROG = "s6 service stop" ; - - argv += gol_argv(argv, service_stop_golb, 0, 0, 0, &golb, 0) ; - if (!argv) dieusage() ; - return 0 ; -} -- cgit v1.3.1