diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-06-06 18:15:00 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska@appnovation.com> | 2025-06-06 18:15:00 +0000 |
| commit | 0db2f82a71f627be6b0feff3541862072653181e (patch) | |
| tree | 8bd1c7d1e5def588ca83cd68664893403521326f | |
| parent | 3f75ffee7c0c7d6b70cf305d60435ac862ea9ab5 (diff) | |
| download | s6-frontend-0db2f82a71f627be6b0feff3541862072653181e.tar.gz | |
Add skeleton for "s6 service"
Signed-off-by: Laurent Bercot <ska@appnovation.com>
| -rw-r--r-- | package/deps.mak | 9 | ||||
| -rw-r--r-- | src/s6/deps-exe/s6 | 7 | ||||
| -rw-r--r-- | src/s6/help.c | 29 | ||||
| -rw-r--r-- | src/s6/process.c | 56 | ||||
| -rw-r--r-- | src/s6/process_help.c | 16 | ||||
| -rw-r--r-- | src/s6/process_util.c | 63 | ||||
| -rw-r--r-- | src/s6/s6-internal.h | 27 | ||||
| -rw-r--r-- | src/s6/s6.c | 11 | ||||
| -rw-r--r-- | src/s6/service.c | 28 | ||||
| -rw-r--r-- | src/s6/service_start.c | 32 | ||||
| -rw-r--r-- | src/s6/service_status.c | 31 | ||||
| -rw-r--r-- | src/s6/service_stop.c | 32 | ||||
| -rw-r--r-- | src/s6/version.c | 14 |
13 files changed, 242 insertions, 113 deletions
diff --git a/package/deps.mak b/package/deps.mak index e2fa383..35933be 100644 --- a/package/deps.mak +++ b/package/deps.mak @@ -9,16 +9,17 @@ src/alias/s6-frontend-alias.o src/alias/s6-frontend-alias.lo: src/alias/s6-front src/config/s6-frontend-config-preprocess.o src/config/s6-frontend-config-preprocess.lo: src/config/s6-frontend-config-preprocess.c src/s6/help.o src/s6/help.lo: src/s6/help.c src/s6/s6-internal.h src/s6/process.o src/s6/process.lo: src/s6/process.c src/s6/s6-internal.h -src/s6/process_help.o src/s6/process_help.lo: src/s6/process_help.c src/s6/s6-internal.h src/s6/process_kill.o src/s6/process_kill.lo: src/s6/process_kill.c src/s6/s6-internal.h src/s6/process_restart.o src/s6/process_restart.lo: src/s6/process_restart.c src/s6/s6-internal.h src/s6/process_start.o src/s6/process_start.lo: src/s6/process_start.c src/s6/s6-internal.h src/s6/process_status.o src/s6/process_status.lo: src/s6/process_status.c src/s6/s6-internal.h src/s6/process_stop.o src/s6/process_stop.lo: src/s6/process_stop.c src/s6/s6-internal.h -src/s6/process_util.o src/s6/process_util.lo: src/s6/process_util.c src/s6/s6-internal.h src/s6/s6.o src/s6/s6.lo: src/s6/s6.c src/include/s6-frontend/config.h src/s6/s6-internal.h +src/s6/service.o src/s6/service.lo: src/s6/service.c src/s6/s6-internal.h +src/s6/service_start.o src/s6/service_start.lo: src/s6/service_start.c src/s6/s6-internal.h +src/s6/service_status.o src/s6/service_status.lo: src/s6/service_status.c src/s6/s6-internal.h +src/s6/service_stop.o src/s6/service_stop.lo: src/s6/service_stop.c src/s6/s6-internal.h src/s6/util.o src/s6/util.lo: src/s6/util.c src/s6/s6-internal.h -src/s6/version.o src/s6/version.lo: src/s6/version.c src/s6/s6-internal.h s6-frontend-alias: EXTRA_LIBS := s6-frontend-alias: src/alias/s6-frontend-alias.o -lskarnet @@ -29,5 +30,5 @@ s6-frontend-alias-sv: src/alias/s6-frontend-alias-sv.o -ls6 -lskarnet s6-frontend-config-preprocess: EXTRA_LIBS := s6-frontend-config-preprocess: src/config/s6-frontend-config-preprocess.o -lskarnet s6: EXTRA_LIBS := -s6: src/s6/s6.o src/s6/help.o src/s6/util.o src/s6/process.o src/s6/process_help.o src/s6/process_kill.o src/s6/process_restart.o src/s6/process_start.o src/s6/process_status.o src/s6/process_stop.o src/s6/process_util.o src/s6/version.o -ls6 -lskarnet +s6: src/s6/s6.o src/s6/help.o src/s6/util.o src/s6/process.o src/s6/process_kill.o src/s6/process_restart.o src/s6/process_start.o src/s6/process_status.o src/s6/process_stop.o src/s6/service.o src/s6/service_start.o src/s6/service_status.o src/s6/service_stop.o -ls6 -lskarnet INTERNAL_LIBS := diff --git a/src/s6/deps-exe/s6 b/src/s6/deps-exe/s6 index 6bfee46..d408a3a 100644 --- a/src/s6/deps-exe/s6 +++ b/src/s6/deps-exe/s6 @@ -1,13 +1,14 @@ help.o util.o process.o -process_help.o process_kill.o process_restart.o process_start.o process_status.o process_stop.o -process_util.o -version.o +service.o +service_start.o +service_status.o +service_stop.o -ls6 -lskarnet diff --git a/src/s6/help.c b/src/s6/help.c index f7de80f..ac2205c 100644 --- a/src/s6/help.c +++ b/src/s6/help.c @@ -5,12 +5,33 @@ #include "s6-internal.h" -#define HELP_MESSAGE "This is the main help message.\n" +#define MAIN_HELP_MESSAGE "This is the main help message.\n" -int help (char const *const *argv) +#define PROCESS_HELP_MESSAGE "This is the process help message.\n" + +#define SERVICE_HELP_MESSAGE "This is the service help message.\n" + +static int print_help (char const *msg) { - (void)argv ; - if (!buffer_putsflush(buffer_1, HELP_MESSAGE)) + if (!buffer_putsflush(buffer_1, msg)) strerr_diefu1sys(111, "write to stdout") ; return 0 ; } + +int process_help (char const* const *argv) +{ + (void)argv ; + return print_help(PROCESS_HELP_MESSAGE) ; +} + +int service_help (char const* const *argv) +{ + (void)argv ; + return print_help(SERVICE_HELP_MESSAGE) ; +} + +int help (char const *const *argv) +{ + (void)argv ; + return print_help(MAIN_HELP_MESSAGE) ; +} diff --git a/src/s6/process.c b/src/s6/process.c index bd14c67..6f8586c 100644 --- a/src/s6/process.c +++ b/src/s6/process.c @@ -1,9 +1,15 @@ /* ISC license. */ +#include <string.h> +#include <sys/stat.h> +#include <errno.h> + #include <skalibs/posixplz.h> +#include <skalibs/prog.h> #include <skalibs/strerr.h> #include <skalibs/cspawn.h> #include <skalibs/djbunix.h> + #include <s6/config.h> #include "s6-internal.h" @@ -11,6 +17,56 @@ #define USAGE "s6 process [ process options ] subcommand [ subcommand options ] services... Type \"s6 process help\" for details." #define dieusage() strerr_dieusage(100, USAGE) +static int check_service (char const *name, size_t scandirlen) +{ + struct stat st ; + size_t namelen = strlen(name) ; + char path[scandirlen + namelen + 2] ; + memcpy(path, g->scandir, scandirlen) ; + path[scandirlen] = '/' ; + memcpy(path + scandirlen + 1, name, namelen) ; + path[scandirlen + 1 + namelen] = 0 ; + return stat(path, &st) == -1 ? errno == ENOENT ? 0 : -1 : !!S_ISDIR(st.st_mode) ; +} + +void process_check_services (char const *const *argv, size_t argc) +{ + size_t scandirlen = strlen(g->scandir) ; + for (size_t i = 0 ; i < argc ; i++) + { + int r = check_service(argv[i], scandirlen) ; + if (r == -1) + strerr_diefu4sys(111, "stat ", g->scandir, "/", argv[i]) ; + else if (!r) + strerr_dief3x(100, argv[i], "is not registered as a supervised service in ", g->scandir) ; + } +} + +int process_send_svc (char const *svcopt, char const *const *argv, size_t argc) +{ + char const *newargv[5] = { S6_EXTBINPREFIX "s6-svc", svcopt, "--", 0, 0 } ; + size_t scandirlen = strlen(g->scandir) ; + int wstat ; + pid_t pids[argc] ; + + for (size_t i = 0 ; i < argc ; i++) + { + size_t arglen = strlen(argv[i]) ; + char path[scandirlen + arglen + 2] ; + memcpy(path, g->scandir, scandirlen) ; + path[scandirlen] = '/' ; + memcpy(path + scandirlen + 1, argv[i], arglen) ; + path[scandirlen + 1 + arglen] = 0 ; + newargv[3] = path ; + pids[i] = cspawn(newargv[0], newargv, (char const *const *)environ, 0, 0, 0) ; + if (!pids[i]) + strerr_diefu4sys(111, "spawn ", newargv[0], " command for service ", argv[i]) ; + } + waitn_posix(pids, argc, &wstat) ; + return 0 ; +} + + static struct command_s const process_commands[] = { { .s = "help", .f = &process_help }, diff --git a/src/s6/process_help.c b/src/s6/process_help.c deleted file mode 100644 index 1e51ebe..0000000 --- a/src/s6/process_help.c +++ /dev/null @@ -1,16 +0,0 @@ -/* ISC license. */ - -#include <skalibs/buffer.h> -#include <skalibs/strerr.h> - -#include "s6-internal.h" - -#define HELP_MESSAGE "This is the \"s6 process\" help message.\n" - -int process_help (char const *const *argv) -{ - (void)argv ; - if (!buffer_putsflush(buffer_1, HELP_MESSAGE)) - strerr_diefu1sys(111, "write to stdout") ; - return 0 ; -} diff --git a/src/s6/process_util.c b/src/s6/process_util.c deleted file mode 100644 index 34b9196..0000000 --- a/src/s6/process_util.c +++ /dev/null @@ -1,63 +0,0 @@ -/* ISC license. */ - -#include <string.h> -#include <sys/stat.h> -#include <errno.h> - -#include <skalibs/posixplz.h> -#include <skalibs/strerr.h> -#include <skalibs/cspawn.h> -#include <skalibs/djbunix.h> - -#include <s6/config.h> - -#include "s6-internal.h" - -static int check_service (char const *name, size_t scandirlen) -{ - struct stat st ; - size_t namelen = strlen(name) ; - char path[scandirlen + namelen + 2] ; - memcpy(path, g->scandir, scandirlen) ; - path[scandirlen] = '/' ; - memcpy(path + scandirlen + 1, name, namelen) ; - path[scandirlen + 1 + namelen] = 0 ; - return stat(path, &st) == -1 ? errno == ENOENT ? 0 : -1 : !!S_ISDIR(st.st_mode) ; -} - -void process_check_services (char const *const *argv, size_t argc) -{ - size_t scandirlen = strlen(g->scandir) ; - for (size_t i = 0 ; i < argc ; i++) - { - int r = check_service(argv[i], scandirlen) ; - if (r == -1) - strerr_diefu4sys(111, "stat ", g->scandir, "/", argv[i]) ; - else if (!r) - strerr_dief3x(100, argv[i], "is not registered as a supervised service in ", g->scandir) ; - } -} - -int process_send_svc (char const *svcopt, char const *const *argv, size_t argc) -{ - char const *newargv[5] = { S6_EXTBINPREFIX "s6-svc", svcopt, "--", 0, 0 } ; - size_t scandirlen = strlen(g->scandir) ; - int wstat ; - pid_t pids[argc] ; - - for (size_t i = 0 ; i < argc ; i++) - { - size_t arglen = strlen(argv[i]) ; - char path[scandirlen + arglen + 2] ; - memcpy(path, g->scandir, scandirlen) ; - path[scandirlen] = '/' ; - memcpy(path + scandirlen + 1, argv[i], arglen) ; - path[scandirlen + 1 + arglen] = 0 ; - newargv[3] = path ; - pids[i] = cspawn(newargv[0], newargv, (char const *const *)environ, 0, 0, 0) ; - if (!pids[i]) - strerr_diefu4sys(111, "spawn ", newargv[0], " command for service ", argv[i]) ; - } - waitn_posix(pids, argc, &wstat) ; - return 0 ; -} diff --git a/src/s6/s6-internal.h b/src/s6/s6-internal.h index 7d08d18..e269380 100644 --- a/src/s6/s6-internal.h +++ b/src/s6/s6-internal.h @@ -19,12 +19,10 @@ extern int keycmp (void const *, void const *) ; /* help */ -extern int help (char const *const *) ; - - - /* version */ +extern int process_help (char const *const *) ; +extern int service_help (char const *const *) ; -extern int version (char const *const *) ; +extern int help (char const *const *) ; /* process */ @@ -32,14 +30,23 @@ extern int version (char const *const *) ; extern void process_check_services (char const *const *, size_t) ; extern int process_send_svc (char const *, char const *const *, size_t) ; -extern int process (char const *const *) ; -extern int process_help (char const *const *) ; extern int process_kill (char const *const *) ; extern int process_restart (char const *const *) ; extern int process_start (char const *const *) ; extern int process_status (char const *const *) ; extern int process_stop (char const *const *) ; +extern int process (char const *const *) ; + + + /* service */ + +extern int service_start (char const *const *) ; +extern int service_status (char const *const *) ; +extern int service_stop (char const *const *) ; + +extern int service (char const *const *) ; + /* main */ @@ -56,8 +63,6 @@ struct global_s .color = 0 \ } -extern struct global_s *g ; - struct command_s { char const *s ; @@ -65,4 +70,8 @@ struct command_s } ; #define COMMAND_ZERO { .s = 0, .f = 0 } +extern struct global_s *g ; + +extern int version (char const *const *) ; + #endif diff --git a/src/s6/s6.c b/src/s6/s6.c index c7d950c..c811b1a 100644 --- a/src/s6/s6.c +++ b/src/s6/s6.c @@ -1,10 +1,12 @@ /* ISC license. */ +#include <string.h> #include <unistd.h> #include <skalibs/uint64.h> #include <skalibs/types.h> #include <skalibs/buffer.h> +#include <skalibs/prog.h> #include <skalibs/strerr.h> #include <skalibs/gol.h> @@ -17,6 +19,15 @@ #define USAGE "s6 [ generic options ] command [ command options ] command_arguments... Type \"s6 help\" for details." #define dieusage() strerr_dieusage(100, USAGE) + +int version (char const *const *argv) +{ + (void)argv ; + if (!buffer_putsflush(buffer_1, "s6-frontend v" S6_FRONTEND_VERSION "\n")) + strerr_diefu1sys(111, "write to stdout") ; + return 0 ; +} + enum main_golb_e { MAIN_GOLB_HELP, diff --git a/src/s6/service.c b/src/s6/service.c new file mode 100644 index 0000000..5ac453b --- /dev/null +++ b/src/s6/service.c @@ -0,0 +1,28 @@ +/* ISC license. */ + +#include <skalibs/prog.h> +#include <skalibs/strerr.h> + +#include "s6-internal.h" + +#define USAGE "s6 service [ service options ] subcommand [ subcommand options ] services... Type \"s6 service help\" for details." +#define dieusage() strerr_dieusage(100, USAGE) + +static struct command_s const service_commands[] = +{ + { .s = "help", .f = &service_help }, + { .s = "start", .f = &service_start }, + { .s = "status", .f = &service_status }, + { .s = "stop", .f = &service_stop }, +} ; + +int service (char const *const *argv) +{ + struct command_s *cmd ; + + PROG = "s6 service" ; + if (!*argv) dieusage() ; + cmd = BSEARCH(struct command_s, *argv, service_commands) ; + if (!cmd) dieusage() ; + return (*cmd->f)(++argv) ; +} diff --git a/src/s6/service_start.c b/src/s6/service_start.c new file mode 100644 index 0000000..f9b5039 --- /dev/null +++ b/src/s6/service_start.c @@ -0,0 +1,32 @@ +/* ISC license. */ + +#include <skalibs/uint64.h> +#include <skalibs/strerr.h> +#include <skalibs/gol.h> + +#include "s6-internal.h" + +#define USAGE "s6 service start services..." +#define dieusage() strerr_dieusage(100, USAGE) + +enum service_start_golb_e +{ + SERVICE_START_GOLB_WAIT, + SERVICE_START_GOLB_N +} ; + +static gol_bool const service_start_golb[2] = +{ + { .so = 'W', .lo = "nowait", .set = 0, .mask = 1 << SERVICE_START_GOLB_WAIT }, + { .so = 'w', .lo = "wait", .set = 1, .mask = 1 << SERVICE_START_GOLB_WAIT } +} ; + +int service_start (char const *const *argv) +{ + uint64_t golb = 0 ; + PROG = "s6 service start" ; + + argv += gol_argv(argv, service_start_golb, 0, 0, 0, &golb, 0) ; + if (!argv) dieusage() ; + return 0 ; +} diff --git a/src/s6/service_status.c b/src/s6/service_status.c new file mode 100644 index 0000000..ae6f97d --- /dev/null +++ b/src/s6/service_status.c @@ -0,0 +1,31 @@ +/* ISC license. */ + +#include <skalibs/uint64.h> +#include <skalibs/strerr.h> +#include <skalibs/gol.h> + +#include "s6-internal.h" + +#define USAGE "s6 service status services..." +#define dieusage() strerr_dieusage(100, USAGE) + +enum service_status_golb_e +{ + SERVICE_STATUS_GOLB_WAIT, + SERVICE_STATUS_GOLB_N +} ; + +static gol_bool const service_status_golb[2] = +{ + { .so = 'w', .lo = "wait", .set = 1, .mask = 1 << SERVICE_STATUS_GOLB_WAIT } +} ; + +int service_status (char const *const *argv) +{ + uint64_t golb = 0 ; + PROG = "s6 service status" ; + + argv += gol_argv(argv, service_status_golb, 0, 0, 0, &golb, 0) ; + if (!argv) dieusage() ; + return 0 ; +} diff --git a/src/s6/service_stop.c b/src/s6/service_stop.c new file mode 100644 index 0000000..fc1db58 --- /dev/null +++ b/src/s6/service_stop.c @@ -0,0 +1,32 @@ +/* ISC license. */ + +#include <skalibs/uint64.h> +#include <skalibs/strerr.h> +#include <skalibs/gol.h> + +#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 ; +} diff --git a/src/s6/version.c b/src/s6/version.c deleted file mode 100644 index acb06ad..0000000 --- a/src/s6/version.c +++ /dev/null @@ -1,14 +0,0 @@ -/* ISC license. */ - -#include <skalibs/buffer.h> -#include <skalibs/strerr.h> - -#include "s6-internal.h" - -int version (char const *const *argv) -{ - (void)argv ; - if (!buffer_putsflush(buffer_1, "s6-frontend v" S6_FRONTEND_VERSION "\n")) - strerr_diefu1sys(111, "write to stdout") ; - return 0 ; -} |
