From 5f46f6f2d649b2bb8664f9c749e15acd8f529b6c Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Fri, 24 Oct 2025 16:46:58 +0000 Subject: Separate s6 from s6-frontend, fix configure for no-nsss build --- .gitignore | 1 + configure | 36 +++++- package/configure-snippets/configure_case_lines | 3 + package/configure-snippets/configure_expand_dirs | 2 +- .../configure-snippets/configure_generate_configh | 12 +- package/configure-snippets/configure_generate_make | 9 +- package/configure-snippets/configure_help_install | 7 +- package/configure-snippets/configure_help_options | 1 + package/configure-snippets/configure_init_vars | 2 + package/deps-build | 12 +- package/deps.mak | 33 ++--- package/modes | 1 + package/targets.mak | 3 +- src/s6-frontend/deps-exe/s6 | 1 + src/s6-frontend/deps-exe/s6-frontend | 16 +++ src/s6-frontend/help.c | 37 ++++++ src/s6-frontend/process.c | 89 +++++++++++++ src/s6-frontend/process_kill.c | 93 ++++++++++++++ src/s6-frontend/process_restart.c | 38 ++++++ src/s6-frontend/process_startstop.c | 45 +++++++ src/s6-frontend/process_status.c | 108 ++++++++++++++++ src/s6-frontend/s6-frontend.c | 142 +++++++++++++++++++++ src/s6-frontend/s6-internal.h | 92 +++++++++++++ src/s6-frontend/s6.c | 31 +++++ src/s6-frontend/service.c | 28 ++++ src/s6-frontend/service_startstop.c | 129 +++++++++++++++++++ src/s6-frontend/service_status.c | 31 +++++ src/s6-frontend/util.c | 15 +++ src/s6/deps-exe/s6 | 15 --- src/s6/help.c | 37 ------ src/s6/process.c | 89 ------------- src/s6/process_kill.c | 93 -------------- src/s6/process_restart.c | 38 ------ src/s6/process_startstop.c | 45 ------- src/s6/process_status.c | 108 ---------------- src/s6/s6-internal.h | 92 ------------- src/s6/s6.c | 133 ------------------- src/s6/service.c | 28 ---- src/s6/service_startstop.c | 129 ------------------- src/s6/service_status.c | 31 ----- src/s6/util.c | 15 --- tools/gen-deps.sh | 4 +- 42 files changed, 982 insertions(+), 892 deletions(-) create mode 100644 src/s6-frontend/deps-exe/s6 create mode 100644 src/s6-frontend/deps-exe/s6-frontend create mode 100644 src/s6-frontend/help.c create mode 100644 src/s6-frontend/process.c create mode 100644 src/s6-frontend/process_kill.c create mode 100644 src/s6-frontend/process_restart.c create mode 100644 src/s6-frontend/process_startstop.c create mode 100644 src/s6-frontend/process_status.c create mode 100644 src/s6-frontend/s6-frontend.c create mode 100644 src/s6-frontend/s6-internal.h create mode 100644 src/s6-frontend/s6.c create mode 100644 src/s6-frontend/service.c create mode 100644 src/s6-frontend/service_startstop.c create mode 100644 src/s6-frontend/service_status.c create mode 100644 src/s6-frontend/util.c delete mode 100644 src/s6/deps-exe/s6 delete mode 100644 src/s6/help.c delete mode 100644 src/s6/process.c delete mode 100644 src/s6/process_kill.c delete mode 100644 src/s6/process_restart.c delete mode 100644 src/s6/process_startstop.c delete mode 100644 src/s6/process_status.c delete mode 100644 src/s6/s6-internal.h delete mode 100644 src/s6/s6.c delete mode 100644 src/s6/service.c delete mode 100644 src/s6/service_startstop.c delete mode 100644 src/s6/service_status.c delete mode 100644 src/s6/util.c diff --git a/.gitignore b/.gitignore index 43a26ca..c872bb1 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ /libs6f.a.xyzzy /src/include/s6-frontend/config.h /s6-frontend-* +/s6-frontend /s6 diff --git a/configure b/configure index 311eaaa..ffd610d 100755 --- a/configure +++ b/configure @@ -25,11 +25,12 @@ Fine tuning of the installation directories: --includedir=DIR C header files [PREFIX/include] --sysconfdir=DIR global configuration files [PREFIX/etc] --pkgconfdir=DIR pkg-config .pc files [PREFIX/lib/pkgconfig] - --scandir=DIR assume s6-svscan is running on DIR [s6li default|/run/service] - --livedir=DIR run s6-rc live directory in DIR [s6-rc default|/run/s6-rc] - --repodir=DIR s6-frontend working base [/var/lib/s6-frontend/repository] + --scandir=DIR assume s6-svscan is running on DIR [s6li default: /run/service] + --livedir=DIR run s6-rc live directory in DIR [s6-rc default: /run/s6-rc] + --repodir=DIR default s6-rc repository [s6-rc default: /var/lib/s6-frontend/repository] --bootdir=DIR location of the bootable s6-rc compiled db [/etc/s6-rc] --stmpdir=DIR secure location for temporary s6-frontend files [/run/s6-frontend] + --conffile=FILE default configuration file for s6 command [SYSCONFDIR/s6-frontend.conf] --with-def-path=PATH path to service files [LIBDIR/s6-frontend/s6-rc/source:SYSCONFDIR/s6-frontend/s6-rc/source] If no --prefix option is given, by default libdir (but not dynlibdir) will be /usr/lib, and includedir will be /usr/include. @@ -53,6 +54,7 @@ Optional features: --enable-pkgconfig Build and install .pc files for pkg-config [disabled] --enable-slashpackage[=ROOT] assume /package installation at ROOT [disabled] --enable-absolute-paths hardcode absolute BINDIR/foobar paths in binaries [disabled] + --enable-nsss use the nsss library for user information [disabled] --disable-s6li do not use s6-linux-init functionality [enabled] --enable-util-linux use util-linux functionality [disabled] --enable-aliases-daemontools build emulation of daemontools programs [disabled] @@ -183,7 +185,9 @@ livedir= repodir=/var/lib/s6-frontend/s6-rc/repository bootdir=/etc/s6-rc stmpdir=/run/s6-frontend +conffile='$sysconfdir/s6-frontend.conf' defpath='$libdir/s6-frontend/s6-rc/source:$sysconfdir/s6-frontend/s6-rc/source' +usensss=false uses6li=true useutillinux=false adaemontools=false @@ -231,7 +235,10 @@ for arg ; do --repodir=*) repodir=${arg#*=} ;; --bootdir=*) bootdir=${arg#*=} ;; --stmpdir=*) stmpdir=${arg#*=} ;; + --conffile=*) conffile=${arg#*=} ;; --with-def-path=*) defpath=${arg#*=} ;; + --enable-nsss|--enable-nsss=yes) usensss=true ;; + --disable-nsss|--enable-nsss=no) usensss=false ;; --enable-s6li|--enable-s6li=yes) uses6li=true ;; --disable-s6li|--enable-s6li=no) uses6li=false ;; --enable-util-linux|--enable-util-linux=yes) useutillinux=true ;; @@ -270,7 +277,7 @@ fi # Expand installation directories stripdir prefix -for i in exec_prefix dynlibdir libexecdir bindir libdir includedir sysconfdir pkgconfdir sysdeps sproot stmpdir defpath ; do +for i in exec_prefix dynlibdir libexecdir bindir libdir includedir sysconfdir pkgconfdir sysdeps sproot stmpdir conffile defpath ; do eval tmp=\${$i} eval $i=$tmp stripdir $i @@ -547,13 +554,18 @@ if $allpic ; then else echo "STATIC_LIBS_ARE_PIC :=" fi -echo "LIBNSSS := -lnsss" -echo "MAYBEPTHREAD_LIB := -lpthread" echo "REPODIR := $repodir" echo "BOOTDIR := $bootdir" echo "STMPDIR := $stmpdir" echo "DEFPATH := $defpath" +if $usensss ; then + echo "LIBNSSS := -lnsss" + echo "MAYBEPTHREAD_LIB := -lpthread" +else + echo "LIBNSSS :=" + echo "MAYBEPTHREAD_LIB :=" +fi if $adaemontools ; then echo "WRAP_DAEMONTOOLS := 1" else @@ -630,7 +642,14 @@ else fi echo "#undef ${package_macro_name}_REPODIR" -echo "#define ${package_macro_name}_REPODIR \"$repodir\"" +if test -n "$repodir" ; then + echo "#define ${package_macro_name}_REPODIR \"$repodir\"" +else + if test -n "$livedir" ; then + echo "#include " + fi + echo "#define ${package_macro_name}_REPODIR S6RC_REPO_BASE" +fi echo "#undef ${package_macro_name}_BOOTDIR" echo "#define ${package_macro_name}_BOOTDIR \"$bootdir\"" @@ -638,6 +657,9 @@ echo "#define ${package_macro_name}_BOOTDIR \"$bootdir\"" echo "#undef ${package_macro_name}_STMPDIR" echo "#define ${package_macro_name}_STMPDIR \"$stmpdir\"" +echo "#undef ${package_macro_name}_CONFFILE" +echo "#define ${package_macro_name}_CONFFILE \"$conffile\"" + echo "#undef ${package_macro_name}_DEFPATH" echo "#define ${package_macro_name}_DEFPATH \"$defpath\"" diff --git a/package/configure-snippets/configure_case_lines b/package/configure-snippets/configure_case_lines index 702f462..2844a69 100644 --- a/package/configure-snippets/configure_case_lines +++ b/package/configure-snippets/configure_case_lines @@ -3,7 +3,10 @@ --repodir=*) repodir=${arg#*=} ;; --bootdir=*) bootdir=${arg#*=} ;; --stmpdir=*) stmpdir=${arg#*=} ;; + --conffile=*) conffile=${arg#*=} ;; --with-def-path=*) defpath=${arg#*=} ;; + --enable-nsss|--enable-nsss=yes) usensss=true ;; + --disable-nsss|--enable-nsss=no) usensss=false ;; --enable-s6li|--enable-s6li=yes) uses6li=true ;; --disable-s6li|--enable-s6li=no) uses6li=false ;; --enable-util-linux|--enable-util-linux=yes) useutillinux=true ;; diff --git a/package/configure-snippets/configure_expand_dirs b/package/configure-snippets/configure_expand_dirs index 60c0477..dcf795f 100644 --- a/package/configure-snippets/configure_expand_dirs +++ b/package/configure-snippets/configure_expand_dirs @@ -1 +1 @@ -stmpdir defpath +stmpdir conffile defpath diff --git a/package/configure-snippets/configure_generate_configh b/package/configure-snippets/configure_generate_configh index d93ea7a..23ce34c 100644 --- a/package/configure-snippets/configure_generate_configh +++ b/package/configure-snippets/configure_generate_configh @@ -28,7 +28,14 @@ else fi echo "#undef ${package_macro_name}_REPODIR" -echo "#define ${package_macro_name}_REPODIR \"$repodir\"" +if test -n "$repodir" ; then + echo "#define ${package_macro_name}_REPODIR \"$repodir\"" +else + if test -n "$livedir" ; then + echo "#include " + fi + echo "#define ${package_macro_name}_REPODIR S6RC_REPO_BASE" +fi echo "#undef ${package_macro_name}_BOOTDIR" echo "#define ${package_macro_name}_BOOTDIR \"$bootdir\"" @@ -36,6 +43,9 @@ echo "#define ${package_macro_name}_BOOTDIR \"$bootdir\"" echo "#undef ${package_macro_name}_STMPDIR" echo "#define ${package_macro_name}_STMPDIR \"$stmpdir\"" +echo "#undef ${package_macro_name}_CONFFILE" +echo "#define ${package_macro_name}_CONFFILE \"$conffile\"" + echo "#undef ${package_macro_name}_DEFPATH" echo "#define ${package_macro_name}_DEFPATH \"$defpath\"" diff --git a/package/configure-snippets/configure_generate_make b/package/configure-snippets/configure_generate_make index 50b068c..3603f53 100644 --- a/package/configure-snippets/configure_generate_make +++ b/package/configure-snippets/configure_generate_make @@ -1,10 +1,15 @@ -echo "LIBNSSS := -lnsss" -echo "MAYBEPTHREAD_LIB := -lpthread" echo "REPODIR := $repodir" echo "BOOTDIR := $bootdir" echo "STMPDIR := $stmpdir" echo "DEFPATH := $defpath" +if $usensss ; then + echo "LIBNSSS := -lnsss" + echo "MAYBEPTHREAD_LIB := -lpthread" +else + echo "LIBNSSS :=" + echo "MAYBEPTHREAD_LIB :=" +fi if $adaemontools ; then echo "WRAP_DAEMONTOOLS := 1" else diff --git a/package/configure-snippets/configure_help_install b/package/configure-snippets/configure_help_install index e35e7e7..8be3412 100644 --- a/package/configure-snippets/configure_help_install +++ b/package/configure-snippets/configure_help_install @@ -1,6 +1,7 @@ - --scandir=DIR assume s6-svscan is running on DIR [s6li default|/run/service] - --livedir=DIR run s6-rc live directory in DIR [s6-rc default|/run/s6-rc] - --repodir=DIR s6-frontend working base [/var/lib/s6-frontend/repository] + --scandir=DIR assume s6-svscan is running on DIR [s6li default: /run/service] + --livedir=DIR run s6-rc live directory in DIR [s6-rc default: /run/s6-rc] + --repodir=DIR default s6-rc repository [s6-rc default: /var/lib/s6-frontend/repository] --bootdir=DIR location of the bootable s6-rc compiled db [/etc/s6-rc] --stmpdir=DIR secure location for temporary s6-frontend files [/run/s6-frontend] + --conffile=FILE default configuration file for s6 command [SYSCONFDIR/s6-frontend.conf] --with-def-path=PATH path to service files [LIBDIR/s6-frontend/s6-rc/source:SYSCONFDIR/s6-frontend/s6-rc/source] diff --git a/package/configure-snippets/configure_help_options b/package/configure-snippets/configure_help_options index c5d4e07..8ef4317 100644 --- a/package/configure-snippets/configure_help_options +++ b/package/configure-snippets/configure_help_options @@ -1,3 +1,4 @@ + --enable-nsss use the nsss library for user information [disabled] --disable-s6li do not use s6-linux-init functionality [enabled] --enable-util-linux use util-linux functionality [disabled] --enable-aliases-daemontools build emulation of daemontools programs [disabled] diff --git a/package/configure-snippets/configure_init_vars b/package/configure-snippets/configure_init_vars index 3413e00..e0b2853 100644 --- a/package/configure-snippets/configure_init_vars +++ b/package/configure-snippets/configure_init_vars @@ -3,7 +3,9 @@ livedir= repodir=/var/lib/s6-frontend/s6-rc/repository bootdir=/etc/s6-rc stmpdir=/run/s6-frontend +conffile='$sysconfdir/s6-frontend.conf' defpath='$libdir/s6-frontend/s6-rc/source:$sysconfdir/s6-frontend/s6-rc/source' +usensss=false uses6li=true useutillinux=false adaemontools=false diff --git a/package/deps-build b/package/deps-build index e850f9e..4298f5b 100644 --- a/package/deps-build +++ b/package/deps-build @@ -1,6 +1,6 @@ -true true /package/prog/skalibs 2.14.4.0 libskarnet -true true /package/admin/nsss 0.2.1.0 libnsss -true false /package/admin/execline 2.9.7.0 libexecline -true false /package/admin/s6 2.13.2.0 libs6 libs6auto -true false /package/admin/s6-rc 0.5.6.0 libs6rc -true false /package/admin/s6-linux-init 1.1.3.0 +true true /package/prog/skalibs 2.14.5.0 libskarnet +$usensss $usensss /package/admin/nsss 0.2.1.0 libnsss +true false /package/admin/execline 2.9.7.0 libexecline +true false /package/admin/s6 2.13.3.0 libs6 libs6auto +true false /package/admin/s6-rc 0.6.0.0 libs6rc +true false /package/admin/s6-linux-init 1.1.3.0 diff --git a/package/deps.mak b/package/deps.mak index 19272df..e28fdce 100644 --- a/package/deps.mak +++ b/package/deps.mak @@ -2,7 +2,7 @@ # This file has been generated by tools/gen-deps.sh # -src/s6/s6-internal.h: src/include/s6-frontend/config.h src/include-local/s6f.h +src/s6-frontend/s6-internal.h: src/include/s6-frontend/config.h src/include-local/s6f.h src/alias/s6-frontend-alias-chpst.o src/alias/s6-frontend-alias-chpst.lo: src/alias/s6-frontend-alias-chpst.c src/alias/s6-frontend-alias-sv.o src/alias/s6-frontend-alias-sv.lo: src/alias/s6-frontend-alias-sv.c src/alias/s6-frontend-alias.o src/alias/s6-frontend-alias.lo: src/alias/s6-frontend-alias.c src/include/s6-frontend/config.h @@ -11,17 +11,18 @@ src/libs6f/s6f_confdir_open.o src/libs6f/s6f_confdir_open.lo: src/libs6f/s6f_con src/libs6f/s6f_lock.o src/libs6f/s6f_lock.lo: src/libs6f/s6f_lock.c src/include-local/s6f.h src/libs6f/s6f_report_state_change.o src/libs6f/s6f_report_state_change.lo: src/libs6f/s6f_report_state_change.c src/include-local/s6f.h src/libs6f/s6f_user_get_confdirs.o src/libs6f/s6f_user_get_confdirs.lo: src/libs6f/s6f_user_get_confdirs.c src/include-local/s6f.h -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_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_startstop.o src/s6/process_startstop.lo: src/s6/process_startstop.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/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_startstop.o src/s6/service_startstop.lo: src/s6/service_startstop.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/util.o src/s6/util.lo: src/s6/util.c src/s6/s6-internal.h +src/s6-frontend/help.o src/s6-frontend/help.lo: src/s6-frontend/help.c src/s6-frontend/s6-internal.h +src/s6-frontend/process.o src/s6-frontend/process.lo: src/s6-frontend/process.c src/s6-frontend/s6-internal.h +src/s6-frontend/process_kill.o src/s6-frontend/process_kill.lo: src/s6-frontend/process_kill.c src/s6-frontend/s6-internal.h +src/s6-frontend/process_restart.o src/s6-frontend/process_restart.lo: src/s6-frontend/process_restart.c src/s6-frontend/s6-internal.h +src/s6-frontend/process_startstop.o src/s6-frontend/process_startstop.lo: src/s6-frontend/process_startstop.c src/s6-frontend/s6-internal.h +src/s6-frontend/process_status.o src/s6-frontend/process_status.lo: src/s6-frontend/process_status.c src/s6-frontend/s6-internal.h +src/s6-frontend/s6-frontend.o src/s6-frontend/s6-frontend.lo: src/s6-frontend/s6-frontend.c src/include/s6-frontend/config.h src/s6-frontend/s6-internal.h +src/s6-frontend/s6.o src/s6-frontend/s6.lo: src/s6-frontend/s6.c src/include/s6-frontend/config.h +src/s6-frontend/service.o src/s6-frontend/service.lo: src/s6-frontend/service.c src/s6-frontend/s6-internal.h +src/s6-frontend/service_startstop.o src/s6-frontend/service_startstop.lo: src/s6-frontend/service_startstop.c src/s6-frontend/s6-internal.h +src/s6-frontend/service_status.o src/s6-frontend/service_status.lo: src/s6-frontend/service_status.c src/s6-frontend/s6-internal.h +src/s6-frontend/util.o src/s6-frontend/util.lo: src/s6-frontend/util.c src/s6-frontend/s6-internal.h s6-frontend-alias: EXTRA_LIBS := s6-frontend-alias: src/alias/s6-frontend-alias.o -lskarnet @@ -32,10 +33,12 @@ 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 ifeq ($(strip $(STATIC_LIBS_ARE_PIC)),) -libs6f.a.xyzzy: src/libs6f/s6f_confdir_open.o src/libs6f/s6f_lock.o src/libs6f/s6f_report_state_change.o src/libs6f/s6f_user_get_confdirs.o ${LIBNSSS} +libs6f.a.xyzzy: src/libs6f/s6f_confdir_open.o src/libs6f/s6f_lock.o src/libs6f/s6f_report_state_change.o src/libs6f/s6f_user_get_confdirs.o else -libs6f.a.xyzzy:src/libs6f/s6f_confdir_open.lo src/libs6f/s6f_lock.lo src/libs6f/s6f_report_state_change.lo src/libs6f/s6f_user_get_confdirs.lo ${LIBNSSS} +libs6f.a.xyzzy:src/libs6f/s6f_confdir_open.lo src/libs6f/s6f_lock.lo src/libs6f/s6f_report_state_change.lo src/libs6f/s6f_user_get_confdirs.lo endif s6: EXTRA_LIBS := -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_startstop.o src/s6/process_status.o src/s6/service.o src/s6/service_startstop.o src/s6/service_status.o libs6f.a.xyzzy -ls6rc -ls6 ${LIBNSSS} -lskarnet +s6: src/s6-frontend/s6.o -lskarnet +s6-frontend: EXTRA_LIBS := ${MAYBEPTHREAD_LIB} +s6-frontend: src/s6-frontend/s6-frontend.o src/s6-frontend/help.o src/s6-frontend/util.o src/s6-frontend/process.o src/s6-frontend/process_kill.o src/s6-frontend/process_restart.o src/s6-frontend/process_startstop.o src/s6-frontend/process_status.o src/s6-frontend/service.o src/s6-frontend/service_startstop.o src/s6-frontend/service_status.o libs6f.a.xyzzy ${LIBNSSS} -ls6rc -ls6 -lskarnet INTERNAL_LIBS := libs6f.a.xyzzy diff --git a/package/modes b/package/modes index 09fe6bb..2c9188f 100644 --- a/package/modes +++ b/package/modes @@ -1,4 +1,5 @@ s6 0755 +s6-frontend 0755 s6-frontend-config-preprocess 0755 s6-frontend-alias 0755 s6-frontend-alias-sv 0755 diff --git a/package/targets.mak b/package/targets.mak index 1dedd4a..2cdb392 100644 --- a/package/targets.mak +++ b/package/targets.mak @@ -1,5 +1,6 @@ BIN_TARGETS := \ -s6 +s6 \ +s6-frontend LIBEXEC_TARGETS := diff --git a/src/s6-frontend/deps-exe/s6 b/src/s6-frontend/deps-exe/s6 new file mode 100644 index 0000000..e7187fe --- /dev/null +++ b/src/s6-frontend/deps-exe/s6 @@ -0,0 +1 @@ +-lskarnet diff --git a/src/s6-frontend/deps-exe/s6-frontend b/src/s6-frontend/deps-exe/s6-frontend new file mode 100644 index 0000000..e87e35a --- /dev/null +++ b/src/s6-frontend/deps-exe/s6-frontend @@ -0,0 +1,16 @@ +help.o +util.o +process.o +process_kill.o +process_restart.o +process_startstop.o +process_status.o +service.o +service_startstop.o +service_status.o +libs6f.a.xyzzy +${LIBNSSS} +-ls6rc +-ls6 +-lskarnet +${MAYBEPTHREAD_LIB} diff --git a/src/s6-frontend/help.c b/src/s6-frontend/help.c new file mode 100644 index 0000000..ac2205c --- /dev/null +++ b/src/s6-frontend/help.c @@ -0,0 +1,37 @@ +/* ISC license. */ + +#include +#include + +#include "s6-internal.h" + +#define MAIN_HELP_MESSAGE "This is the main help message.\n" + +#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) +{ + 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-frontend/process.c b/src/s6-frontend/process.c new file mode 100644 index 0000000..1dca89d --- /dev/null +++ b/src/s6-frontend/process.c @@ -0,0 +1,89 @@ +/* ISC license. */ + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include "s6-internal.h" + +#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->dirs.scan, 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->dirs.scan) ; + for (size_t i = 0 ; i < argc ; i++) + { + int r = check_service(argv[i], scandirlen) ; + if (r == -1) + strerr_diefu4sys(111, "stat ", g->dirs.scan, "/", argv[i]) ; + else if (!r) + strerr_dief3x(100, argv[i], "is not registered as a supervised service in ", g->dirs.scan) ; + } +} + +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->dirs.scan) ; + 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->dirs.scan, 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 }, + { .s = "kill", .f = &process_kill }, + { .s = "restart", .f = &process_restart }, + { .s = "start", .f = &process_start }, + { .s = "status", .f = &process_status }, + { .s = "stop", .f = &process_stop }, +} ; + +int process (char const *const *argv) +{ + struct command_s *cmd ; + + PROG = "s6 process" ; + if (!*argv) dieusage() ; + cmd = BSEARCH(struct command_s, *argv, process_commands) ; + if (!cmd) dieusage() ; + return (*cmd->f)(++argv) ; +} diff --git a/src/s6-frontend/process_kill.c b/src/s6-frontend/process_kill.c new file mode 100644 index 0000000..64f7ffb --- /dev/null +++ b/src/s6-frontend/process_kill.c @@ -0,0 +1,93 @@ +/* ISC license. */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "s6-internal.h" + +#define USAGE "s6 process kill [ --signal=sig ] services..." +#define dieusage() strerr_dieusage(100, USAGE) + +static int process_kill_hack_kill (int sig, char const *const *argv) +{ + size_t scandirlen = strlen(g->dirs.scan) ; + if (g->verbosity) + { + char fmt[INT_FMT] ; + fmt[int_fmt(fmt, sig)] = 0 ; + strerr_warnw3x("signal ", fmt, " is not natively supported by s6-svc, results may be unreliable") ; + } + + for (; *argv ; argv++) + { + s6_svstatus_t status ; + size_t arglen = strlen(*argv) ; + char path[scandirlen + arglen + 2] ; + memcpy(path, g->dirs.scan, scandirlen) ; + path[scandirlen] = '/' ; + memcpy(path + scandirlen + 1, *argv, arglen) ; + path[scandirlen + 1 + arglen] = 0 ; + if (!s6_svstatus_read(path, &status)) + strerr_diefu2sys(111, "read status file for service ", path) ; + if (status.pid && !status.flagfinishing) kill(status.pid, sig) ; + } + return 0 ; +} + + +enum gola_e +{ + GOLA_SIGNAL, + GOLA_N +} ; + +static gol_arg const rgola[GOLA_N] = +{ + { .so = 's', .lo = "signal", .i = GOLA_SIGNAL }, +} ; + +int process_kill (char const *const *argv) +{ + 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, rgola, GOLA_N, 0, wgola) ; + if (!argv) dieusage() ; + if (wgola[GOLA_SIGNAL]) + { + 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) ; + process_check_services(argv, argc) ; + switch (sig) + { + case SIGALRM : svcopt = "-a" ; break ; + case SIGABRT : svcopt = "-b" ; break ; + case SIGQUIT : svcopt = "-q" ; break ; + case SIGHUP : svcopt = "-h" ; break ; + case SIGKILL : svcopt = "-k" ; break ; + case SIGTERM : svcopt = "-t" ; break ; + case SIGINT : svcopt = "-i" ; break ; + case SIGUSR1 : svcopt = "-1" ; break ; + case SIGUSR2 : svcopt = "-2" ; break ; + case SIGSTOP : svcopt = "-p" ; break ; + case SIGCONT : svcopt = "-c" ; break ; + case SIGWINCH: svcopt = "-y" ; break ; + } + return svcopt ? process_send_svc(svcopt, argv, argc) : process_kill_hack_kill(sig, argv) ; +} diff --git a/src/s6-frontend/process_restart.c b/src/s6-frontend/process_restart.c new file mode 100644 index 0000000..73e66f3 --- /dev/null +++ b/src/s6-frontend/process_restart.c @@ -0,0 +1,38 @@ +/* ISC license. */ + +#include + +#include +#include +#include +#include + +#include "s6-internal.h" + +#define USAGE "s6 process restart [ -W|--nowait ] services..." +#define dieusage() strerr_dieusage(100, USAGE) + +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 } +} ; + +int process_restart (char const *const *argv) +{ + uint64_t wgolb = 1 << GOLB_WAIT ; + size_t argc ; + PROG = "s6 process restart" ; + + 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(wgolb & 1 << GOLB_WAIT ? "-rwR" : "-r", argv, argc) ; +} diff --git a/src/s6-frontend/process_startstop.c b/src/s6-frontend/process_startstop.c new file mode 100644 index 0000000..8a5089e --- /dev/null +++ b/src/s6-frontend/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-frontend/process_status.c b/src/s6-frontend/process_status.c new file mode 100644 index 0000000..a13938d --- /dev/null +++ b/src/s6-frontend/process_status.c @@ -0,0 +1,108 @@ +/* ISC license. */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "s6-internal.h" + +#define USAGE "s6 process status [ -l|--with-logs ] services..." +#define dieusage() strerr_dieusage(100, USAGE) + +static int spawn_and_wait (char const *const *argv) +{ + int wstat ; + pid_t r ; + pid_t pid = cspawn(argv[0], argv, (char const *const *)environ, 0, 0, 0) ; + if (!pid) + { + if (g->verbosity) strerr_warnwu2sys("spawn ", argv[0]) ; + return 1 ; + } + r = wait_pid(pid, &wstat) ; + if (r != pid) + { + if (g->verbosity) strerr_warnwu2sys("wait for ", argv[0]) ; + return 1 ; + } + return !!WIFSIGNALED(wstat) || !!WEXITSTATUS(wstat) ; +} + +static int do_status (char const *dir, int withlog) +{ + int e ; + char const *argv[4] = { S6_EXTBINPREFIX "s6-svstat", "--", dir, 0 } ; + size_t dirlen = strlen(dir) ; + buffer_puts(buffer_1, dir) ; + buffer_putsflush(buffer_1, ": ") ; + e = spawn_and_wait(argv) ; + if (withlog && (dirlen < 5 || strcmp(dir + dirlen - 4, "/log"))) + { + struct stat st ; + char log[dirlen + 5] ; + memcpy(log, dir, dirlen) ; + memcpy(log + dirlen, "/log", 5) ; + if (stat(log, &st) < 0) + { + if (errno != ENOENT) + { + if (g->verbosity) strerr_warnwu2sys("stat", log) ; + e = 1 ; + } + } + else if (S_ISDIR(st.st_mode)) + { + argv[2] = log ; + buffer_puts(buffer_1, log) ; + buffer_putsflush(buffer_1, ": ") ; + e |= spawn_and_wait(argv) ; + } + } + return e ; +} + + +enum golb_e +{ + GOLB_WITHLOGS, + GOLB_N +} ; + +static gol_bool const rgolb[1] = +{ + { .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 wgolb = 0 ; + int e = 0 ; + PROG = "s6 process status" ; + + argv += gol_argv(argv, rgolb, 1, 0, 0, &wgolb, 0) ; + if (!argv) dieusage() ; + process_check_services(argv, env_len(argv)) ; + for (; *argv ; argv++) + { + size_t len = strlen(*argv) ; + char path[scandirlen + len + 2] ; + memcpy(path, g->dirs.scan, scandirlen) ; + path[scandirlen] = '/' ; + memcpy(path + scandirlen + 1, *argv, len+1) ; + if (do_status(path, !!(wgolb & 1 << GOLB_WITHLOGS))) e = 1 ; + } + return e ; +} diff --git a/src/s6-frontend/s6-frontend.c b/src/s6-frontend/s6-frontend.c new file mode 100644 index 0000000..ad55e8d --- /dev/null +++ b/src/s6-frontend/s6-frontend.c @@ -0,0 +1,142 @@ +/* ISC license. */ + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include "s6-internal.h" + +#define USAGE "s6-frontend [ 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 golb_e +{ + GOLB_HELP, + GOLB_VERSION, + GOLB_USER, + GOLB_N +} ; + +enum gola_e +{ + GOLA_SCANDIR, + GOLA_LIVEDIR, + GOLA_REPODIR, + GOLA_BOOTDIR, + GOLA_STMPDIR, + GOLA_VERBOSITY, + GOLA_COLOR, + GOLA_N +} ; + +static gol_bool const rgolb[GOLB_N] = +{ + { .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 rgola[GOLA_N] = +{ + { .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 commands[] = +{ + { .s = "help", .f = &help }, + { .s = "process", .f = &process }, + { .s = "service", .f = &service }, + { .s = "version", .f = &version }, +} ; + +int main (int argc, char const *const *argv, char const *const *envp) +{ + struct global_s globals_in_the_stack = GLOBAL_ZERO ; + uint64_t wgolb = 0 ; + unsigned int golc ; + struct command_s *cmd ; + char const *wgola[GOLA_N] = + { + [GOLA_SCANDIR] = getenv("scandir"), + [GOLA_LIVEDIR] = getenv("livedir"), + [GOLA_REPODIR] = getenv("repodir"), + [GOLA_BOOTDIR] = getenv("bootdir"), + [GOLA_STMPDIR] = getenv("stmpdir"), + [GOLA_VERBOSITY] = 0, + [GOLA_COLOR] = 0 + } ; + PROG = "s6-frontend" ; + g = &globals_in_the_stack ; + + golc = gol_main(argc, argv, rgolb, GOLB_N, rgola, GOLA_N, &wgolb, wgola) ; + argc -= golc ; argv += golc ; + + if (wgola[GOLA_VERBOSITY] && !uint0_scan(wgola[GOLA_VERBOSITY], &g->verbosity)) + strerr_dief1x(100, "verbosity must be an unsigned integer") ; + + 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 (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 (wgola[GOLA_COLOR]) + { + if (!strcmp(wgola[GOLA_COLOR], "yes")) + { + force_color = 1 ; + g->color = 1 ; + } + else if (!strcmp(wgola[GOLA_COLOR], "no")) + { + force_color = 1 ; + g->color = 0 ; + } + 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 = !!(wgolb & 1 << GOLB_USER) ; + if (g->isuser) s6f_user_get_confdirs(&g->dirs, &g->userstorage) ; + + if (!*argv) dieusage() ; + cmd = BSEARCH(struct command_s, *argv, commands) ; + if (!cmd) dieusage() ; + return (*cmd->f)(++argv) ; +} diff --git a/src/s6-frontend/s6-internal.h b/src/s6-frontend/s6-internal.h new file mode 100644 index 0000000..6ee3939 --- /dev/null +++ b/src/s6-frontend/s6-internal.h @@ -0,0 +1,92 @@ +/* ISC license. */ + +#ifndef S6_INTERNAL_H +#define S6_INTERNAL_H + +#include +#include +#include + +#include +#include + +#include +#include "s6f.h" + + /* util */ + +extern int keycmp (void const *, void const *) ; +#define BSEARCH(type, key, array) bsearch(key, (array), sizeof(array)/sizeof(type), sizeof(type), &keycmp) + + + /* help */ + +extern int process_help (char const *const *) ; +extern int service_help (char const *const *) ; + +extern int help (char const *const *) ; + + + /* process */ + +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_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 */ + +struct global_s +{ + unsigned int verbosity ; + s6f_confdirs dirs ; + stralloc userstorage ; + uint8_t isuser : 1 ; + uint8_t istty : 1 ; + uint8_t color : 1 ; +} ; +#define GLOBAL_ZERO \ +{ \ + .verbosity = 1, \ + .dirs = \ + { \ + .scan = S6_FRONTEND_SCANDIR, \ + .live = S6_FRONTEND_LIVEDIR, \ + .repo = S6_FRONTEND_REPODIR, \ + .boot = S6_FRONTEND_BOOTDIR, \ + .stmp = S6_FRONTEND_STMPDIR, \ + }, \ + .userstorage = STRALLOC_ZERO, \ + .isuser = 0, \ + .istty = 0, \ + .color = 0 \ +} + +struct command_s +{ + char const *s ; + main_func_ref f ; +} ; +#define COMMAND_ZERO { .s = 0, .f = 0 } + +extern struct global_s *g ; + +extern int version (char const *const *) ; + +#endif diff --git a/src/s6-frontend/s6.c b/src/s6-frontend/s6.c new file mode 100644 index 0000000..9c9de9c --- /dev/null +++ b/src/s6-frontend/s6.c @@ -0,0 +1,31 @@ +/* ISC license. */ + +#include + +#include +#include +#include + +#include + +#include + +int main (int argc, char const *const *argv) +{ + char const *conffile = getenv("S6_FRONTEND_CONFFILE") ; + PROG = "s6 service" ; + if (!conffile) conffile = S6_FRONTEND_CONFFILE ; + if (!argc--) strerr_dief1x(103, "invalid argc/argv") ; + argv++ ; + + unsigned int m = 0 ; + char const *newargv[6 + argc] ; + newargv[m++] = EXECLINE_EXTBINPREFIX "envfile" ; + newargv[m++] = "-I" ; + newargv[m++] = "--" ; + newargv[m++] = conffile ; + newargv[m++] = S6_FRONTEND_BINPREFIX "s6-frontend" ; + while (argc--) newargv[m++] = *argv++ ; + newargv[m++] = 0 ; + xexec(newargv) ; +} diff --git a/src/s6-frontend/service.c b/src/s6-frontend/service.c new file mode 100644 index 0000000..5ac453b --- /dev/null +++ b/src/s6-frontend/service.c @@ -0,0 +1,28 @@ +/* ISC license. */ + +#include +#include + +#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-frontend/service_startstop.c b/src/s6-frontend/service_startstop.c new file mode 100644 index 0000000..c4946fc --- /dev/null +++ b/src/s6-frontend/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-frontend/service_status.c b/src/s6-frontend/service_status.c new file mode 100644 index 0000000..5bf71b5 --- /dev/null +++ b/src/s6-frontend/service_status.c @@ -0,0 +1,31 @@ +/* ISC license. */ + +#include +#include +#include + +#include "s6-internal.h" + +#define USAGE "s6 service status services..." +#define dieusage() strerr_dieusage(100, USAGE) + +enum golb_e +{ + GOLB_WAIT, + GOLB_N +} ; + +static gol_bool const rgolb[2] = +{ + { .so = 'w', .lo = "wait", .clear = 0, .set = 1 << GOLB_WAIT } +} ; + +int service_status (char const *const *argv) +{ + uint64_t wgolb = 0 ; + PROG = "s6 service status" ; + + argv += gol_argv(argv, rgolb, 0, 0, 0, &wgolb, 0) ; + if (!argv) dieusage() ; + return 0 ; +} diff --git a/src/s6-frontend/util.c b/src/s6-frontend/util.c new file mode 100644 index 0000000..699f976 --- /dev/null +++ b/src/s6-frontend/util.c @@ -0,0 +1,15 @@ +/* ISC license. */ + +#include + +#include "s6-internal.h" + +struct starts_with_a_string_key_s +{ + char const *s ; +} ; + +int keycmp (void const *a, void const *b) +{ + return strcmp((char const *)a, ((struct starts_with_a_string_key_s const *)b)->s) ; +} diff --git a/src/s6/deps-exe/s6 b/src/s6/deps-exe/s6 deleted file mode 100644 index ad88372..0000000 --- a/src/s6/deps-exe/s6 +++ /dev/null @@ -1,15 +0,0 @@ -help.o -util.o -process.o -process_kill.o -process_restart.o -process_startstop.o -process_status.o -service.o -service_startstop.o -service_status.o -libs6f.a.xyzzy --ls6rc --ls6 -${LIBNSSS} --lskarnet diff --git a/src/s6/help.c b/src/s6/help.c deleted file mode 100644 index ac2205c..0000000 --- a/src/s6/help.c +++ /dev/null @@ -1,37 +0,0 @@ -/* ISC license. */ - -#include -#include - -#include "s6-internal.h" - -#define MAIN_HELP_MESSAGE "This is the main help message.\n" - -#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) -{ - 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 deleted file mode 100644 index 1dca89d..0000000 --- a/src/s6/process.c +++ /dev/null @@ -1,89 +0,0 @@ -/* ISC license. */ - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include "s6-internal.h" - -#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->dirs.scan, 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->dirs.scan) ; - for (size_t i = 0 ; i < argc ; i++) - { - int r = check_service(argv[i], scandirlen) ; - if (r == -1) - strerr_diefu4sys(111, "stat ", g->dirs.scan, "/", argv[i]) ; - else if (!r) - strerr_dief3x(100, argv[i], "is not registered as a supervised service in ", g->dirs.scan) ; - } -} - -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->dirs.scan) ; - 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->dirs.scan, 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 }, - { .s = "kill", .f = &process_kill }, - { .s = "restart", .f = &process_restart }, - { .s = "start", .f = &process_start }, - { .s = "status", .f = &process_status }, - { .s = "stop", .f = &process_stop }, -} ; - -int process (char const *const *argv) -{ - struct command_s *cmd ; - - PROG = "s6 process" ; - if (!*argv) dieusage() ; - cmd = BSEARCH(struct command_s, *argv, process_commands) ; - if (!cmd) dieusage() ; - return (*cmd->f)(++argv) ; -} diff --git a/src/s6/process_kill.c b/src/s6/process_kill.c deleted file mode 100644 index 64f7ffb..0000000 --- a/src/s6/process_kill.c +++ /dev/null @@ -1,93 +0,0 @@ -/* ISC license. */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "s6-internal.h" - -#define USAGE "s6 process kill [ --signal=sig ] services..." -#define dieusage() strerr_dieusage(100, USAGE) - -static int process_kill_hack_kill (int sig, char const *const *argv) -{ - size_t scandirlen = strlen(g->dirs.scan) ; - if (g->verbosity) - { - char fmt[INT_FMT] ; - fmt[int_fmt(fmt, sig)] = 0 ; - strerr_warnw3x("signal ", fmt, " is not natively supported by s6-svc, results may be unreliable") ; - } - - for (; *argv ; argv++) - { - s6_svstatus_t status ; - size_t arglen = strlen(*argv) ; - char path[scandirlen + arglen + 2] ; - memcpy(path, g->dirs.scan, scandirlen) ; - path[scandirlen] = '/' ; - memcpy(path + scandirlen + 1, *argv, arglen) ; - path[scandirlen + 1 + arglen] = 0 ; - if (!s6_svstatus_read(path, &status)) - strerr_diefu2sys(111, "read status file for service ", path) ; - if (status.pid && !status.flagfinishing) kill(status.pid, sig) ; - } - return 0 ; -} - - -enum gola_e -{ - GOLA_SIGNAL, - GOLA_N -} ; - -static gol_arg const rgola[GOLA_N] = -{ - { .so = 's', .lo = "signal", .i = GOLA_SIGNAL }, -} ; - -int process_kill (char const *const *argv) -{ - 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, rgola, GOLA_N, 0, wgola) ; - if (!argv) dieusage() ; - if (wgola[GOLA_SIGNAL]) - { - 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) ; - process_check_services(argv, argc) ; - switch (sig) - { - case SIGALRM : svcopt = "-a" ; break ; - case SIGABRT : svcopt = "-b" ; break ; - case SIGQUIT : svcopt = "-q" ; break ; - case SIGHUP : svcopt = "-h" ; break ; - case SIGKILL : svcopt = "-k" ; break ; - case SIGTERM : svcopt = "-t" ; break ; - case SIGINT : svcopt = "-i" ; break ; - case SIGUSR1 : svcopt = "-1" ; break ; - case SIGUSR2 : svcopt = "-2" ; break ; - case SIGSTOP : svcopt = "-p" ; break ; - case SIGCONT : svcopt = "-c" ; break ; - case SIGWINCH: svcopt = "-y" ; break ; - } - return svcopt ? process_send_svc(svcopt, argv, argc) : process_kill_hack_kill(sig, argv) ; -} diff --git a/src/s6/process_restart.c b/src/s6/process_restart.c deleted file mode 100644 index 73e66f3..0000000 --- a/src/s6/process_restart.c +++ /dev/null @@ -1,38 +0,0 @@ -/* ISC license. */ - -#include - -#include -#include -#include -#include - -#include "s6-internal.h" - -#define USAGE "s6 process restart [ -W|--nowait ] services..." -#define dieusage() strerr_dieusage(100, USAGE) - -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 } -} ; - -int process_restart (char const *const *argv) -{ - uint64_t wgolb = 1 << GOLB_WAIT ; - size_t argc ; - PROG = "s6 process restart" ; - - 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(wgolb & 1 << GOLB_WAIT ? "-rwR" : "-r", argv, argc) ; -} diff --git a/src/s6/process_startstop.c b/src/s6/process_startstop.c deleted file mode 100644 index 8a5089e..0000000 --- a/src/s6/process_startstop.c +++ /dev/null @@ -1,45 +0,0 @@ -/* 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 deleted file mode 100644 index a13938d..0000000 --- a/src/s6/process_status.c +++ /dev/null @@ -1,108 +0,0 @@ -/* ISC license. */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "s6-internal.h" - -#define USAGE "s6 process status [ -l|--with-logs ] services..." -#define dieusage() strerr_dieusage(100, USAGE) - -static int spawn_and_wait (char const *const *argv) -{ - int wstat ; - pid_t r ; - pid_t pid = cspawn(argv[0], argv, (char const *const *)environ, 0, 0, 0) ; - if (!pid) - { - if (g->verbosity) strerr_warnwu2sys("spawn ", argv[0]) ; - return 1 ; - } - r = wait_pid(pid, &wstat) ; - if (r != pid) - { - if (g->verbosity) strerr_warnwu2sys("wait for ", argv[0]) ; - return 1 ; - } - return !!WIFSIGNALED(wstat) || !!WEXITSTATUS(wstat) ; -} - -static int do_status (char const *dir, int withlog) -{ - int e ; - char const *argv[4] = { S6_EXTBINPREFIX "s6-svstat", "--", dir, 0 } ; - size_t dirlen = strlen(dir) ; - buffer_puts(buffer_1, dir) ; - buffer_putsflush(buffer_1, ": ") ; - e = spawn_and_wait(argv) ; - if (withlog && (dirlen < 5 || strcmp(dir + dirlen - 4, "/log"))) - { - struct stat st ; - char log[dirlen + 5] ; - memcpy(log, dir, dirlen) ; - memcpy(log + dirlen, "/log", 5) ; - if (stat(log, &st) < 0) - { - if (errno != ENOENT) - { - if (g->verbosity) strerr_warnwu2sys("stat", log) ; - e = 1 ; - } - } - else if (S_ISDIR(st.st_mode)) - { - argv[2] = log ; - buffer_puts(buffer_1, log) ; - buffer_putsflush(buffer_1, ": ") ; - e |= spawn_and_wait(argv) ; - } - } - return e ; -} - - -enum golb_e -{ - GOLB_WITHLOGS, - GOLB_N -} ; - -static gol_bool const rgolb[1] = -{ - { .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 wgolb = 0 ; - int e = 0 ; - PROG = "s6 process status" ; - - argv += gol_argv(argv, rgolb, 1, 0, 0, &wgolb, 0) ; - if (!argv) dieusage() ; - process_check_services(argv, env_len(argv)) ; - for (; *argv ; argv++) - { - size_t len = strlen(*argv) ; - char path[scandirlen + len + 2] ; - memcpy(path, g->dirs.scan, scandirlen) ; - path[scandirlen] = '/' ; - memcpy(path + scandirlen + 1, *argv, len+1) ; - if (do_status(path, !!(wgolb & 1 << GOLB_WITHLOGS))) e = 1 ; - } - return e ; -} diff --git a/src/s6/s6-internal.h b/src/s6/s6-internal.h deleted file mode 100644 index 6ee3939..0000000 --- a/src/s6/s6-internal.h +++ /dev/null @@ -1,92 +0,0 @@ -/* ISC license. */ - -#ifndef S6_INTERNAL_H -#define S6_INTERNAL_H - -#include -#include -#include - -#include -#include - -#include -#include "s6f.h" - - /* util */ - -extern int keycmp (void const *, void const *) ; -#define BSEARCH(type, key, array) bsearch(key, (array), sizeof(array)/sizeof(type), sizeof(type), &keycmp) - - - /* help */ - -extern int process_help (char const *const *) ; -extern int service_help (char const *const *) ; - -extern int help (char const *const *) ; - - - /* process */ - -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_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 */ - -struct global_s -{ - unsigned int verbosity ; - s6f_confdirs dirs ; - stralloc userstorage ; - uint8_t isuser : 1 ; - uint8_t istty : 1 ; - uint8_t color : 1 ; -} ; -#define GLOBAL_ZERO \ -{ \ - .verbosity = 1, \ - .dirs = \ - { \ - .scan = S6_FRONTEND_SCANDIR, \ - .live = S6_FRONTEND_LIVEDIR, \ - .repo = S6_FRONTEND_REPODIR, \ - .boot = S6_FRONTEND_BOOTDIR, \ - .stmp = S6_FRONTEND_STMPDIR, \ - }, \ - .userstorage = STRALLOC_ZERO, \ - .isuser = 0, \ - .istty = 0, \ - .color = 0 \ -} - -struct command_s -{ - char const *s ; - main_func_ref f ; -} ; -#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 deleted file mode 100644 index e7ecd6f..0000000 --- a/src/s6/s6.c +++ /dev/null @@ -1,133 +0,0 @@ -/* ISC license. */ - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include "s6-internal.h" - -#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 golb_e -{ - GOLB_HELP, - GOLB_VERSION, - GOLB_USER, - GOLB_N -} ; - -enum gola_e -{ - GOLA_SCANDIR, - GOLA_LIVEDIR, - GOLA_REPODIR, - GOLA_BOOTDIR, - GOLA_STMPDIR, - GOLA_VERBOSITY, - GOLA_COLOR, - GOLA_N -} ; - -static gol_bool const rgolb[GOLB_N] = -{ - { .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 rgola[GOLA_N] = -{ - { .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 commands[] = -{ - { .s = "help", .f = &help }, - { .s = "process", .f = &process }, - { .s = "service", .f = &service }, - { .s = "version", .f = &version }, -} ; - -int main (int argc, char const *const *argv, char const *const *envp) -{ - struct global_s globals_in_the_stack = GLOBAL_ZERO ; - 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, rgolb, GOLB_N, rgola, GOLA_N, &wgolb, wgola) ; - argc -= golc ; argv += golc ; - - if (wgola[GOLA_VERBOSITY] && !uint0_scan(wgola[GOLA_VERBOSITY], &g->verbosity)) - strerr_dief1x(100, "verbosity must be an unsigned integer") ; - - 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 (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 (wgola[GOLA_COLOR]) - { - if (!strcmp(wgola[GOLA_COLOR], "yes")) - { - force_color = 1 ; - g->color = 1 ; - } - else if (!strcmp(wgola[GOLA_COLOR], "no")) - { - force_color = 1 ; - g->color = 0 ; - } - 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 = !!(wgolb & 1 << GOLB_USER) ; - if (g->isuser) s6f_user_get_confdirs(&g->dirs, &g->userstorage) ; - - if (!*argv) dieusage() ; - cmd = BSEARCH(struct command_s, *argv, commands) ; - if (!cmd) dieusage() ; - return (*cmd->f)(++argv) ; -} diff --git a/src/s6/service.c b/src/s6/service.c deleted file mode 100644 index 5ac453b..0000000 --- a/src/s6/service.c +++ /dev/null @@ -1,28 +0,0 @@ -/* ISC license. */ - -#include -#include - -#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_startstop.c b/src/s6/service_startstop.c deleted file mode 100644 index c4946fc..0000000 --- a/src/s6/service_startstop.c +++ /dev/null @@ -1,129 +0,0 @@ -/* 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 deleted file mode 100644 index 5bf71b5..0000000 --- a/src/s6/service_status.c +++ /dev/null @@ -1,31 +0,0 @@ -/* ISC license. */ - -#include -#include -#include - -#include "s6-internal.h" - -#define USAGE "s6 service status services..." -#define dieusage() strerr_dieusage(100, USAGE) - -enum golb_e -{ - GOLB_WAIT, - GOLB_N -} ; - -static gol_bool const rgolb[2] = -{ - { .so = 'w', .lo = "wait", .clear = 0, .set = 1 << GOLB_WAIT } -} ; - -int service_status (char const *const *argv) -{ - uint64_t wgolb = 0 ; - PROG = "s6 service status" ; - - argv += gol_argv(argv, rgolb, 0, 0, 0, &wgolb, 0) ; - if (!argv) dieusage() ; - return 0 ; -} diff --git a/src/s6/util.c b/src/s6/util.c deleted file mode 100644 index 699f976..0000000 --- a/src/s6/util.c +++ /dev/null @@ -1,15 +0,0 @@ -/* ISC license. */ - -#include - -#include "s6-internal.h" - -struct starts_with_a_string_key_s -{ - char const *s ; -} ; - -int keycmp (void const *a, void const *b) -{ - return strcmp((char const *)a, ((struct starts_with_a_string_key_s const *)b)->s) ; -} diff --git a/tools/gen-deps.sh b/tools/gen-deps.sh index aa84388..134484b 100755 --- a/tools/gen-deps.sh +++ b/tools/gen-deps.sh @@ -61,10 +61,8 @@ for dir in $(ls -1 src | grep -v ^include) ; do deps= libs= while read dep ; do - if echo $dep | grep -q -e '^-l' -e '^\${.*_LIB}' ; then + if echo $dep | grep -q -e '^\${LIB' -e '^-l' -e '^\${.*_LIB}' ; then libs="$libs $dep" - elif echo $dep | grep -q '^\${LIB' ; then - deps="$deps $dep" else deps="$deps src/$dir/$dep" fi -- cgit v1.3.1