aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2025-06-06 18:15:00 +0000
committerLaurent Bercot <ska@appnovation.com>2025-06-06 18:15:00 +0000
commit0db2f82a71f627be6b0feff3541862072653181e (patch)
tree8bd1c7d1e5def588ca83cd68664893403521326f
parent3f75ffee7c0c7d6b70cf305d60435ac862ea9ab5 (diff)
downloads6-frontend-0db2f82a71f627be6b0feff3541862072653181e.tar.gz
Add skeleton for "s6 service"
Signed-off-by: Laurent Bercot <ska@appnovation.com>
-rw-r--r--package/deps.mak9
-rw-r--r--src/s6/deps-exe/s67
-rw-r--r--src/s6/help.c29
-rw-r--r--src/s6/process.c56
-rw-r--r--src/s6/process_help.c16
-rw-r--r--src/s6/process_util.c63
-rw-r--r--src/s6/s6-internal.h27
-rw-r--r--src/s6/s6.c11
-rw-r--r--src/s6/service.c28
-rw-r--r--src/s6/service_start.c32
-rw-r--r--src/s6/service_status.c31
-rw-r--r--src/s6/service_stop.c32
-rw-r--r--src/s6/version.c14
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 ;
-}