From 10d06f7d21b7ab7400ea94936712d7dcb2ed94ca Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Mon, 21 Sep 2015 12:49:39 +0000 Subject: Add s6-rc-oneshot-run (without using it in s6-rc-compile or s6-rc yet) --- doc/index.html | 3 +- doc/s6-rc-oneshot-run.html | 65 ++++++++++++++++++++++ package/deps.mak | 3 ++ package/modes | 1 + package/targets.mak | 3 +- src/s6-rc/deps-exe/s6-rc-oneshot-run | 2 + src/s6-rc/s6-rc-oneshot-run.c | 102 +++++++++++++++++++++++++++++++++++ 7 files changed, 177 insertions(+), 2 deletions(-) create mode 100644 doc/s6-rc-oneshot-run.html create mode 100644 src/s6-rc/deps-exe/s6-rc-oneshot-run create mode 100644 src/s6-rc/s6-rc-oneshot-run.c diff --git a/doc/index.html b/doc/index.html index 3e66a90..58e60e3 100644 --- a/doc/index.html +++ b/doc/index.html @@ -106,8 +106,9 @@ the previous versions of s6-rc and the current one.

Related resources

diff --git a/doc/s6-rc-oneshot-run.html b/doc/s6-rc-oneshot-run.html new file mode 100644 index 0000000..c2b422f --- /dev/null +++ b/doc/s6-rc-oneshot-run.html @@ -0,0 +1,65 @@ + + + + + + s6-rc: the s6-rc-oneshot-run program + + + + + + +

+s6-rc
+Software
+skarnet.org +

+ +

The s6-rc-oneshot-run internal program

+ +

+ s6-rc-oneshot-run executes a oneshot service's up or +down script taken from the current live compiled database. +

+ +

+ s6-rc-oneshot-run is not meant to be used directly; it is used +in internal scripts created by +s6-rc-compile, which are invoked during an +s6-rc execution. +

+ +

Interface

+ +
+     s6-rc-oneshot-run [ -l live ] up|down n
+
+ + + +

Options

+ + + +

Exit codes

+ + + + + diff --git a/package/deps.mak b/package/deps.mak index d97c2c5..53af35a 100644 --- a/package/deps.mak +++ b/package/deps.mak @@ -26,6 +26,7 @@ src/s6-rc/s6-rc-db.o src/s6-rc/s6-rc-db.lo: src/s6-rc/s6-rc-db.c src/include/s6- src/s6-rc/s6-rc-dryrun.o src/s6-rc/s6-rc-dryrun.lo: src/s6-rc/s6-rc-dryrun.c src/s6-rc/s6-rc-fdholder-filler.o src/s6-rc/s6-rc-fdholder-filler.lo: src/s6-rc/s6-rc-fdholder-filler.c src/s6-rc/s6-rc-init.o src/s6-rc/s6-rc-init.lo: src/s6-rc/s6-rc-init.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h +src/s6-rc/s6-rc-oneshot-run.o src/s6-rc/s6-rc-oneshot-run.lo: src/s6-rc/s6-rc-oneshot-run.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h src/s6-rc/s6-rc-update.o src/s6-rc/s6-rc-update.lo: src/s6-rc/s6-rc-update.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h src/s6-rc/s6-rc.o src/s6-rc/s6-rc.lo: src/s6-rc/s6-rc.c src/include/s6-rc/config.h src/include/s6-rc/s6rc.h @@ -46,5 +47,7 @@ s6-rc-fdholder-filler: private EXTRA_LIBS := ${TAINNOW_LIB} ${SOCKET_LIB} s6-rc-fdholder-filler: src/s6-rc/s6-rc-fdholder-filler.o -ls6 -lskarnet s6-rc-init: private EXTRA_LIBS := ${TAINNOW_LIB} ${SOCKET_LIB} s6-rc-init: src/s6-rc/s6-rc-init.o ${LIBS6RC} -ls6 -lskarnet +s6-rc-oneshot-run: private EXTRA_LIBS := +s6-rc-oneshot-run: src/s6-rc/s6-rc-oneshot-run.o ${LIBS6RC} -lskarnet s6-rc-update: private EXTRA_LIBS := ${TAINNOW_LIB} ${SOCKET_LIB} s6-rc-update: src/s6-rc/s6-rc-update.o ${LIBS6RC} -ls6 -lexecline -lskarnet diff --git a/package/modes b/package/modes index 967fa37..64109f7 100644 --- a/package/modes +++ b/package/modes @@ -6,3 +6,4 @@ s6-rc-init 0755 s6-rc 0755 s6-rc-update 0755 s6-rc-fdholder-filler 0755 +s6-rc-oneshot-run 0755 diff --git a/package/targets.mak b/package/targets.mak index 1dcce9e..9953c80 100644 --- a/package/targets.mak +++ b/package/targets.mak @@ -10,6 +10,7 @@ s6-rc \ s6-rc-update LIBEXEC_TARGETS := \ -s6-rc-fdholder-filler +s6-rc-fdholder-filler \ +s6-rc-oneshot-run LIB_DEFS := S6RC=s6rc diff --git a/src/s6-rc/deps-exe/s6-rc-oneshot-run b/src/s6-rc/deps-exe/s6-rc-oneshot-run new file mode 100644 index 0000000..152b051 --- /dev/null +++ b/src/s6-rc/deps-exe/s6-rc-oneshot-run @@ -0,0 +1,2 @@ +${LIBS6RC} +-lskarnet diff --git a/src/s6-rc/s6-rc-oneshot-run.c b/src/s6-rc/s6-rc-oneshot-run.c new file mode 100644 index 0000000..60834c8 --- /dev/null +++ b/src/s6-rc/s6-rc-oneshot-run.c @@ -0,0 +1,102 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include + +#define USAGE "s6-rc-oneshot-run [ -l live ] up|down servicenumber" +#define dieusage() strerr_dieusage(100, USAGE) + +int main (int argc, char const *const *argv, char const *const *envp) +{ + char const *live = S6RC_LIVE_BASE ; + unsigned int number ; + int up ; + PROG = "s6-rc-db" ; + { + subgetopt_t l = SUBGETOPT_ZERO ; + for (;;) + { + register int opt = subgetopt_r(argc, argv, "l:", &l) ; + if (opt == -1) break ; + switch (opt) + { + case 'l' : live = l.arg ; break ; + default : dieusage() ; + } + } + argc -= l.ind ; argv += l.ind ; + } + + if (argc < 2) dieusage() ; + if (!case_diffs(argv[0], "up")) up = 1 ; + else if (!case_diffs(argv[0], "down")) up = 0 ; + else dieusage() ; + if (!uint0_scan(argv[1], &number)) dieusage() ; + + { + unsigned int livelen = str_len(live) ; + int fdcompiled, compiledlock ; + s6rc_db_t db ; + char compiled[livelen + 10] ; + byte_copy(compiled, livelen, live) ; + byte_copy(compiled + livelen, 10, "/compiled") ; + + if (!s6rc_lock(0, 0, 0, compiled, 1, &compiledlock)) + strerr_diefu2sys(111, "take lock on ", compiled) ; + fdcompiled = open_readb(compiled) ; + if (fdcompiled < 0) + strerr_diefu2sys(111, "open ", compiled) ; + + + /* Read the sizes of the compiled db */ + + fdcompiled = open_readb(compiled) ; + if (!s6rc_db_read_sizes(fdcompiled, &db)) + strerr_diefu3sys(111, "read ", compiled, "/n") ; + + if (number >= db.nshort) + strerr_dief1x(3, "invalid oneshot number") ; + + + /* Allocate enough stack for the db */ + + { + s6rc_service_t serviceblob[db.nshort + db.nlong] ; + char const *argvblob[db.nargvs] ; + uint32 depsblob[db.ndeps << 1] ; + char stringblob[db.stringlen] ; + register int r ; + + db.services = serviceblob ; + db.argvs = argvblob ; + db.deps = depsblob ; + db.string = stringblob ; + + + /* Read the db from the file */ + + r = s6rc_db_read(fdcompiled, &db) ; + if (r < 0) strerr_diefu3sys(111, "read ", compiled, "/db") ; + if (!r) strerr_dief3x(4, "invalid service database in ", compiled, "/db") ; + + + /* Run the script */ + + { + register unsigned int sargc = db.services[number].x.oneshot.argc[up] ; + char const *const *sargv = db.argvs + db.services[number].x.oneshot.argv[up] ; + char const *newargv[sargc + 1] ; + register char const **p = newargv ; + while (sargc--) *p++ = *sargv++ ; + *p = 0 ; + pathexec_run(newargv[0], newargv, envp) ; + strerr_dieexec(111, newargv[0]) ; + } + } + } +} -- cgit v1.3.1