diff options
Diffstat (limited to 'src/alias')
| -rw-r--r-- | src/alias/deps-exe/s6-frontend-alias | 1 | ||||
| -rw-r--r-- | src/alias/deps-exe/s6-frontend-alias-chpst | 3 | ||||
| -rw-r--r-- | src/alias/deps-exe/s6-frontend-alias-sv | 3 | ||||
| -rw-r--r-- | src/alias/s6-frontend-alias-chpst.c | 344 | ||||
| -rw-r--r-- | src/alias/s6-frontend-alias-sv.c | 448 | ||||
| -rw-r--r-- | src/alias/s6-frontend-alias.c | 229 |
6 files changed, 0 insertions, 1028 deletions
diff --git a/src/alias/deps-exe/s6-frontend-alias b/src/alias/deps-exe/s6-frontend-alias deleted file mode 100644 index e7187fe..0000000 --- a/src/alias/deps-exe/s6-frontend-alias +++ /dev/null @@ -1 +0,0 @@ --lskarnet diff --git a/src/alias/deps-exe/s6-frontend-alias-chpst b/src/alias/deps-exe/s6-frontend-alias-chpst deleted file mode 100644 index ee4ed0b..0000000 --- a/src/alias/deps-exe/s6-frontend-alias-chpst +++ /dev/null @@ -1,3 +0,0 @@ -${LIBNSSS} --lskarnet -${MAYBEPTHREAD_LIB} diff --git a/src/alias/deps-exe/s6-frontend-alias-sv b/src/alias/deps-exe/s6-frontend-alias-sv deleted file mode 100644 index b3e8440..0000000 --- a/src/alias/deps-exe/s6-frontend-alias-sv +++ /dev/null @@ -1,3 +0,0 @@ --ls6 --lskarnet -${SPAWN_LIB} diff --git a/src/alias/s6-frontend-alias-chpst.c b/src/alias/s6-frontend-alias-chpst.c deleted file mode 100644 index 7232d60..0000000 --- a/src/alias/s6-frontend-alias-chpst.c +++ /dev/null @@ -1,344 +0,0 @@ - /* ISC license. */ - -#include <string.h> -#include <stdint.h> -#include <stdlib.h> -#include <limits.h> -#include <errno.h> -#include <pwd.h> -#include <grp.h> - -#include <skalibs/uint64.h> -#include <skalibs/types.h> -#include <skalibs/bytestr.h> -#include <skalibs/sgetopt.h> -#include <skalibs/buffer.h> -#include <skalibs/strerr.h> -#include <skalibs/exec.h> - -#include <execline/config.h> - -#include <s6/config.h> - -#define USAGE "s6-frontend-alias-chpst [ -v ] [ -P ] [ -0 ] [ -1 ] [ -2 ] [ -u user ] [ -U user ] [ -b argv0 ] [ -e dir ] [ -n niceness ] [ -l lock | -L lock ] [ -m bytes ] [ -d bytes ] [ -o n ] [ -p n ] [ -f bytes ] [ -c bytes ] prog..." - -#define dienomem() strerr_diefu1sys(111, "stralloc_catb") -#define dieusage() strerr_dieusage(100, USAGE) - -static unsigned int verbosity = 0 ; - -static void printit (char const *const *argv) -{ - buffer_puts(buffer_2, PROG) ; - buffer_puts(buffer_2, ": info: executing the following command line:") ; - for (; *argv ; argv++) - { - buffer_puts(buffer_2, " ") ; - buffer_puts(buffer_2, *argv) ; - } - buffer_putsflush(buffer_2, "\n") ; -} - -static inline size_t parseuggnum (char const *s, uint32_t *flags, uid_t *uid, gid_t *gid, gid_t *tab) -{ - size_t n = 0 ; - size_t pos = uid_scan(s, uid) ; - if (!pos) dieusage() ; - if (!s[pos]) return 0 ; - if (s[pos] != ':') dieusage() ; - s += pos+1 ; - pos = gid_scan(s, gid) ; - if (!pos) dieusage() ; - *flags |= 32768 ; - if (!s[pos]) return 0 ; - if (s[pos] != ':') dieusage() ; - s += pos+1 ; - if (!gid_scanlist(tab, NGROUPS_MAX, s, &n)) dieusage() ; - return n ; -} - -static struct passwd *do_getpwnam (char const *s) -{ - struct passwd *pw = getpwnam(s) ; - if (!pw) - { - if (errno) strerr_diefu1sys(111, "read user database") ; - else strerr_dief2x(100, "user not found in user database: ", s) ; - } - return pw ; -} - -static struct group *do_getgrnam (char const *s) -{ - struct group *gr = getgrnam(s) ; - if (!gr) - { - if (errno) strerr_diefu1sys(111, "read group database") ; - else strerr_dief2x(100, "group not found in group database: ", s) ; - } - return gr ; -} - -static inline size_t parseuggsym (char const *s, uint32_t *flags, uid_t *uid, gid_t *gid, gid_t *tab) -{ - size_t n = 0 ; - struct passwd *pw ; - struct group *gr ; - size_t pos = str_chr(s, ':') ; - *flags |= 32768 ; - errno = 0 ; - if (!s[pos]) pw = do_getpwnam(s) ; - else - { - char tmp[pos+1] ; - memcpy(tmp, s, pos) ; - tmp[pos] = 0 ; - pw = do_getpwnam(tmp) ; - } - *uid = pw->pw_uid ; - if (!s[pos]) - { - *gid = pw->pw_gid ; - return 0 ; - } - s += pos+1 ; - pos = str_chr(s, ':') ; - errno = 0 ; - if (!s[pos]) gr = do_getgrnam(s) ; - else - { - char tmp[pos+1] ; - memcpy(tmp, s, pos) ; - tmp[pos] = 0 ; - gr = do_getgrnam(tmp) ; - } - *gid = gr->gr_gid ; - if (!s[pos]) return 0 ; - s += pos+1 ; - while (*s) - { - if (n >= NGROUPS_MAX) - strerr_dief1x(100, "too many supplementary groups listed for the -u option") ; - pos = str_chr(s, ':') ; - errno = 0 ; - if (!s[pos]) gr = do_getgrnam(s) ; - else - { - char tmp[pos+1] ; - memcpy(tmp, s, pos) ; - tmp[pos] = 0 ; - gr = do_getgrnam(tmp) ; - } - tab[n++] = gr->gr_gid ; - s += s[pos] ? pos+1 : pos ; - } - return n ; -} - -int main (int argc, char const *const *argv) -{ - static char const *valopt[6] = { "-m", "-d", "-o", "-p", "-f", "-c" } ; - unsigned int newargc = 0 ; - char const *newroot = 0 ; - char const *edir = 0 ; - char const *argv0 = 0 ; - char const *lockfile = 0 ; - char const *envug = 0 ; - uint32_t flags = 0 ; - int niceval = 0 ; - char valfmt[6][UINT64_FMT] ; - char nicefmt[INT_FMT] ; - char uidfmt[UID_FMT] ; - char gidfmt[GID_FMT] ; - char gidlistfmt[GID_FMT * NGROUPS_MAX] ; - PROG = "s6-frontend-alias-chpst" ; - - { - subgetopt l = SUBGETOPT_ZERO ; - for (;;) - { - int opt = subgetopt_r(argc, argv, "vP012u:U:b:e:/:n:l:L:m:d:o:p:f:c:", &l) ; - if (opt == -1) break ; - switch (opt) - { - case 'v' : verbosity++ ; break ; - case '0' : flags |= 1 ; newargc += 2 ; break ; - case '1' : flags |= 2 ; newargc += 2 ; break ; - case '2' : flags |= 4 ; newargc += 2 ; break ; - case 'P' : flags |= 8 ; newargc += 2 ; break ; - case 'b' : argv0 = l.arg ; newargc += 4 ; break ; - case 'u' : - { - size_t n ; - uid_t uid ; - gid_t gid ; - gid_t tab[NGROUPS_MAX] ; - newargc += 6 ; - flags |= 16384 ; flags &= ~32768 ; - n = l.arg[0] == ':' ? - parseuggnum(l.arg + 1, &flags, &uid, &gid, tab) : - parseuggsym(l.arg, &flags, &uid, &gid, tab) ; - uidfmt[uid_fmt(uidfmt, uid)] = 0 ; - if (flags & 32768) - { - newargc += 2 ; - gidfmt[gid_fmt(gidfmt, gid)] = 0 ; - } - gidlistfmt[gid_fmtlist(gidlistfmt, tab, n)] = 0 ; - break ; - } - case 'U' : - envug = l.arg ; - newargc += 3 ; - if (envug[0] == ':') { flags |= 4096 ; envug++ ; newargc++ ; } else flags &= ~4096 ; - if (strchr(envug, ':')) { flags |= 8192 ; newargc++ ; } else flags &= ~8192 ; - break ; - case 'e' : edir = l.arg ; newargc += 3 ; break ; - case '/' : newroot = l.arg ; newargc += 2 ; break ; - case 'n' : - if (!int0_scan(l.arg, &niceval)) dieusage() ; - newargc += 3 ; - break ; - case 'l' : lockfile = l.arg ; flags &= ~16 ; newargc += 4 ; break ; - case 'L' : lockfile = l.arg ; flags |= 16 ; newargc += 4 ; break ; - case 'm' : - case 'd' : - case 'o' : - case 'p' : - case 'f' : - case 'c' : - { - uint64_t val ; - size_t pos = byte_chr("mdopfc", 6, opt) ; - if (!uint640_scan(l.arg, &val)) dieusage() ; - valfmt[pos][uint64_fmt(valfmt[pos], val)] = 0 ; - flags |= 32 | (1 << (6 + pos)) ; - newargc += 2 ; - break ; - } - default : dieusage() ; - } - } - argc -= l.ind ; argv += l.ind ; - } - - if (newroot) - { - newroot = realpath(newroot, 0) ; - if (!newroot) dienomem() ; - } - if (flags & 32) newargc += 2 ; - newargc += argc ; - - { - unsigned int m = 0 ; - char const *newargv[newargc + 1] ; - - if (niceval) - { - nicefmt[int_fmt(nicefmt, niceval)] = 0 ; - newargv[m++] = "nice" ; - newargv[m++] = "-n" ; - newargv[m++] = nicefmt ; - newargv[m++] = "--" ; - } - - if (flags & 8) - { - newargv[m++] = S6_EXTBINPREFIX "s6-setsid" ; - newargv[m++] = "--" ; - } - - if (edir) - { - newargv[m++] = S6_EXTBINPREFIX "s6-envdir" ; - newargv[m++] = "--" ; - newargv[m++] = edir ; - } - - if (lockfile) - { - newargv[m++] = S6_EXTBINPREFIX "s6-setlock" ; - newargv[m++] = flags & 16 ? "-n" : "-N" ; - newargv[m++] = "--" ; - newargv[m++] = lockfile ; - } - - if (flags & 16384) - { - newargv[m++] = S6_EXTBINPREFIX "s6-applyuidgid" ; - newargv[m++] = "-u" ; - newargv[m++] = uidfmt ; - if (flags & 32768) - { - newargv[m++] = "-g" ; - newargv[m++] = gidfmt ; - } - newargv[m++] = "-G" ; - newargv[m++] = gidlistfmt ; - newargv[m++] = "--" ; - } - - if (envug) - { - newargv[m++] = S6_EXTBINPREFIX "s6-envuidgid" ; - if (flags & 4096) newargv[m++] = "-n" ; - if (flags & 8192) newargv[m++] = "-B" ; - newargv[m++] = "--" ; - newargv[m++] = envug ; - } - - if (flags & 32) - { - newargv[m++] = S6_EXTBINPREFIX "s6-softlimit" ; - for (unsigned int i = 0 ; i < 6 ; i++) if (flags & (1 << (i + 6))) - { - newargv[m++] = valopt[i] ; - newargv[m++] = valfmt[i] ; - } - newargv[m++] = "--" ; - } - - if (flags & 1) - { - newargv[m++] = EXECLINE_EXTBINPREFIX "fdclose" ; - newargv[m++] = "0" ; - } - - if (flags & 2) - { - newargv[m++] = EXECLINE_EXTBINPREFIX "fdclose" ; - newargv[m++] = "1" ; - } - - if (flags & 4) - { - newargv[m++] = EXECLINE_EXTBINPREFIX "fdclose" ; - newargv[m++] = "2" ; - } - - if (argv0 && newroot) - { - argv0 = 0 ; - strerr_warnw1x("the -b option is ineffective when the -/ option is also given") ; - } - - if (argv0) - { - newargv[m++] = EXECLINE_BINPREFIX "exec" ; - newargv[m++] = "-a" ; - newargv[m++] = argv0 ; - newargv[m++] = "--" ; - } - - if (newroot) - { - newargv[m++] = "chroot" ; - newargv[m++] = newroot ; - } - - for (int i = 0 ; i < argc+1 ; i++) newargv[m++] = argv[i] ; - if (verbosity) printit(newargv) ; - xexec0(newargv) ; - } -} diff --git a/src/alias/s6-frontend-alias-sv.c b/src/alias/s6-frontend-alias-sv.c deleted file mode 100644 index e55aaaa..0000000 --- a/src/alias/s6-frontend-alias-sv.c +++ /dev/null @@ -1,448 +0,0 @@ - /* ISC license. */ - -#include <stdint.h> -#include <string.h> -#include <stdlib.h> -#include <errno.h> -#include <sys/stat.h> -#include <sys/wait.h> - -#include <skalibs/uint32.h> -#include <skalibs/sgetopt.h> -#include <skalibs/buffer.h> -#include <skalibs/strerr.h> -#include <skalibs/cspawn.h> -#include <skalibs/djbunix.h> - -#include <s6/config.h> -#include <s6/supervise.h> - -#define USAGE "s6-frontend-alias-sv [ -v ] [ -w sec ] command services..." -#define dieusage() strerr_dieusage(100, USAGE) -#define dienomem() strerr_diefu1sys(111, "stralloc_catb") - -typedef int exec_func (char const *, char const *const *) ; -typedef exec_func *exec_func_ref ; - -typedef struct info_s info_t, *info_t_ref ; -struct info_s -{ - char const *name ; - exec_func_ref f ; -} ; - -static int dowait = 0 ; -static uint32_t secs = 7 ; - -static void warnnolog (void) -{ - strerr_warnw1x("s6-svc only sends commands to a single service, even if it has a dedicated logger") ; -} - -static void warnnokill (void) -{ - strerr_warnw1x("s6-supervise pilots a kill signal via the timeout-kill file in the service directory") ; -} - -static int info_cmp (void const *a, void const *b) -{ - char const *name = a ; - info_t const *info = b ; - return strcmp(name, info->name) ; -} - -static int spawnit (char const *const *argv, char const *const *envp) -{ - int wstat ; - pid_t r ; - pid_t pid = cspawn(argv[0], argv, envp, 0, 0, 0) ; - if (!pid) - { - strerr_warnwu2sys("spawn ", argv[0]) ; - return 1 ; - } - r = wait_pid(pid, &wstat) ; - if (r != pid) - { - strerr_warnwu2sys("wait for ", argv[0]) ; - return 1 ; - } - return !!WIFSIGNALED(wstat) || !!WEXITSTATUS(wstat) ; -} - -static int simple_svc (char const *dir, char const *options, char const *const *envp) -{ - char const *argv[5] = { S6_EXTBINPREFIX "s6-svc", options, "--", dir, 0 } ; - return spawnit(argv, envp) ; -} - -static int complex_svc (char const *dir, char const *order, char waitfor, char const *const *envp) -{ - char warg[4] = "-w?" ; - char fmt[2 + UINT32_FMT] = "-T" ; - char const *argv[7] = { S6_EXTBINPREFIX "s6-svc", warg, fmt, order, "--", dir, 0 } ; - fmt[2 + uint32_fmt(fmt + 2, 1000 * secs)] = 0 ; - warg[2] = waitfor ; - return spawnit(argv, envp) ; -} - -static int status (char const *dir, char const *const *envp) -{ - 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 = spawnit(argv, envp) ; - if (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) - { - 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 |= spawnit(argv, envp) ; - } - } - return e ; -} - -static int action (char const *dir, char const *simple, char const *cplx, char waitchar, char const *const *envp) -{ - if (dowait) - { - int e = complex_svc(dir, cplx, waitchar, envp) ; - return e | status(dir, envp) ; - } - else return simple_svc(dir, simple, envp) ; -} - -static int usr1_h (char const *dir, char const *const *envp) -{ - return simple_svc(dir, "-1", envp) ; -} - -static int usr2_h (char const *dir, char const *const *envp) -{ - return simple_svc(dir, "-2", envp) ; -} - -static int alarm_h (char const *dir, char const *const *envp) -{ - return simple_svc(dir, "-a", envp) ; -} - -static int cont_h (char const *dir, char const *const *envp) -{ - return action(dir, "-c", "-o", 'U', envp) ; -} - -static int down (char const *dir, char const *const *envp) -{ - return action(dir, "-d", "-d", 'D', envp) ; -} - -static int forcedown (char const *dir, char const *const *envp) -{ - warnnokill() ; - return down(dir, envp) ; -} - -static int bail (char const *dir, char const *const *envp) -{ - int e ; - warnnolog() ; - e = action(dir, "-xd", "-d", 'D', envp) ; - if (dowait) e |= simple_svc(dir, "-x", envp) ; - return e ; -} - -static int forcebail (char const *dir, char const *const *envp) -{ - warnnokill() ; - return bail(dir, envp) ; -} - -static int hup_h (char const *dir, char const *const *envp) -{ - return simple_svc(dir, "-h", envp) ; -} - -static int int_h (char const *dir, char const *const *envp) -{ - return simple_svc(dir, "-i", envp) ; -} - -static int kill_h (char const *dir, char const *const *envp) -{ - return simple_svc(dir, "-k", envp) ; -} - -static int once (char const *dir, char const *const *envp) -{ - return action(dir, "-o", "-o", 'U', envp) ; -} - -static int pause_h (char const *dir, char const *const *envp) -{ - return simple_svc(dir, "-p", envp) ; -} - -static int quit_h (char const *dir, char const *const *envp) -{ - return simple_svc(dir, "-q", envp) ; -} - -static int term_h (char const *dir, char const *const *envp) -{ - return action(dir, "-t", "-r", 'R', envp) ; -} - -static int up (char const *dir, char const *const *envp) -{ - return action(dir, "-u", "-u", 'U', envp) ; -} - -static int check (char const *dir, char const *const *envp) -{ - int e ; - s6_svstatus_t svst ; - char warg[3] = "-?" ; - char fmt[2 + UINT32_FMT] = "-t" ; - char const *argv[6] = { S6_EXTBINPREFIX "s6-svwait", warg, fmt, "--", dir, 0 } ; - fmt[2 + uint32_fmt(fmt + 2, 1000 * secs)] = 0 ; - if (!s6_svstatus_read(dir, &svst)) return 1 ; - warg[1] = svst.flagwantup ? 'U' : 'D' ; - e = spawnit(argv, envp) ; - return e | status(dir, envp) ; -} - -static int lsb_reload (char const *dir, char const *const *envp) -{ - hup_h(dir, envp) ; - return status(dir, envp) ; -} - -static int lsb_restart (char const *dir, char const *const *envp) -{ - int e = complex_svc(dir, "-ru", 'U', envp) ; - return e | status(dir, envp) ; -} - -static int lsb_start (char const *dir, char const *const *envp) -{ - int e = complex_svc(dir, "-u", 'U', envp) ; - return e | status(dir, envp) ; -} - -static int lsb_stop (char const *dir, char const *const *envp) -{ - int e = complex_svc(dir, "-d", 'D', envp) ; - return e | status(dir, envp) ; -} - -static int lsb_shutdown (char const *dir, char const *const *envp) -{ - int e ; - warnnolog() ; - e = complex_svc(dir, "-d", 'D', envp) ; - e |= status(dir, envp) ; - return e | simple_svc(dir, "-x", envp) ; -} - -static int lsb_forcereload (char const *dir, char const *const *envp) -{ - warnnokill() ; - return lsb_reload(dir, envp) ; -} - -static int lsb_forcerestart (char const *dir, char const *const *envp) -{ - warnnokill() ; - return lsb_restart(dir, envp) ; -} - -static int lsb_forcestop (char const *dir, char const *const *envp) -{ - warnnokill() ; - return lsb_stop(dir, envp) ; -} - -static int lsb_forceshutdown (char const *dir, char const *const *envp) -{ - warnnokill() ; - return lsb_shutdown(dir, envp) ; -} - -static int lsb_tryrestart (char const *dir, char const *const *envp) -{ - int e = 0 ; - s6_svstatus_t svst ; - if (s6_svstatus_read(dir, &svst) && svst.flagwantup && svst.pid && !svst.flagfinishing) - e = complex_svc(dir, "-r", 'U', envp) ; - return e | status(dir, envp) ; -} - -static int lsb_forcetryrestart (char const *dir, char const *const *envp) -{ - warnnokill() ; - return lsb_tryrestart(dir, envp) ; -} - -static info_t const commands[] = -{ - { .name = "1", .f = &usr1_h }, - { .name = "2", .f = &usr2_h }, - { .name = "D", .f = &forcedown }, - { .name = "E", .f = &forcebail }, - { .name = "T", .f = &lsb_forcetryrestart }, - { .name = "X", .f = &forcebail }, - { .name = "a", .f = &alarm_h }, - { .name = "al", .f = &alarm_h }, - { .name = "ala", .f = &alarm_h }, - { .name = "alar", .f = &alarm_h }, - { .name = "alarm", .f = &alarm_h }, - { .name = "c", .f = &cont_h }, - { .name = "check", .f = &check }, - { .name = "co", .f = &cont_h }, - { .name = "con", .f = &cont_h }, - { .name = "cont", .f = &cont_h }, - { .name = "d", .f = &down }, - { .name = "do", .f = &down }, - { .name = "dow", .f = &down }, - { .name = "down", .f = &down }, - { .name = "e", .f = &bail }, - { .name = "ex", .f = &bail }, - { .name = "exi", .f = &bail }, - { .name = "exit", .f = &bail }, - { .name = "force-reload", .f = &lsb_forcereload }, - { .name = "force-restart", .f = &lsb_forcerestart }, - { .name = "force-shutdown", .f = &lsb_forceshutdown }, - { .name = "force-stop", .f = &lsb_forcestop }, - { .name = "h", .f = &hup_h }, - { .name = "hu", .f = &hup_h }, - { .name = "hup", .f = &hup_h }, - { .name = "i", .f = &int_h }, - { .name = "in", .f = &int_h }, - { .name = "int", .f = &int_h }, - { .name = "inte", .f = &int_h }, - { .name = "inter", .f = &int_h }, - { .name = "interr", .f = &int_h }, - { .name = "interru", .f = &int_h }, - { .name = "interrup", .f = &int_h }, - { .name = "interrupt", .f = &int_h }, - { .name = "k", .f = &kill_h }, - { .name = "ki", .f = &kill_h }, - { .name = "kil", .f = &kill_h }, - { .name = "kill", .f = &kill_h }, - { .name = "o", .f = &once }, - { .name = "on", .f = &once }, - { .name = "onc", .f = &once }, - { .name = "once", .f = &once }, - { .name = "p", .f = &pause_h }, - { .name = "pa", .f = &pause_h }, - { .name = "pau", .f = &pause_h }, - { .name = "paus", .f = &pause_h }, - { .name = "pause", .f = &pause_h }, - { .name = "q", .f = &quit_h }, - { .name = "qu", .f = &quit_h }, - { .name = "qui", .f = &quit_h }, - { .name = "quit", .f = &quit_h }, - { .name = "reload", .f = &lsb_reload }, - { .name = "restart", .f = &lsb_restart }, - { .name = "s", .f = &status }, - { .name = "shutdown", .f = &lsb_shutdown }, - { .name = "st", .f = &status }, - { .name = "sta", .f = &status }, - { .name = "start", .f = &lsb_start }, - { .name = "stat", .f = &status }, - { .name = "statu", .f = &status }, - { .name = "status", .f = &status }, - { .name = "stop", .f = &lsb_stop }, - { .name = "t", .f = &term_h }, - { .name = "te", .f = &term_h }, - { .name = "ter", .f = &term_h }, - { .name = "term", .f = &term_h }, - { .name = "try-restart", .f = &lsb_tryrestart }, - { .name = "u", .f = &up }, - { .name = "up", .f = &up }, - { .name = "x", .f = &bail } -} ; - -int main (int argc, char const *const *argv, char const *const *envp) -{ - int e = 0 ; - info_t *p ; - char const *x = getenv("SVWAIT") ; - char const *scandir = getenv("SVDIR") ; - size_t scandirlen ; - PROG = "s6-frontend-alias-sv" ; - if (!scandir) scandir = "/run/service" ; /* TODO: infer from s6li config */ - scandirlen = strlen(scandir) ; - if (x) - { - if (!uint320_scan(x, &secs)) - strerr_warnw1x("invalid SVWAIT value") ; - } - - { - subgetopt l = SUBGETOPT_ZERO ; - for (;;) - { - int opt = subgetopt_r(argc, argv, "vw:", &l) ; - if (opt == -1) break ; - switch (opt) - { - case 'v' : dowait = 1 ; break ; - case 'w' : if (!uint320_scan(l.arg, &secs)) dieusage() ; break ; - default : dieusage() ; - } - } - argc -= l.ind ; argv += l.ind ; - } - - if (argc < 2) dieusage() ; - p = bsearch(argv[0], commands, sizeof(commands) / sizeof(info_t), sizeof(info_t), &info_cmp) ; - if (!p) strerr_dief2x(100, "unknown command: ", argv[0]) ; - - for (argv++ ; *argv ; argv++) - { - if (!argv[0][0]) continue ; - if (argv[0][0] == '/' || argv[0][strlen(argv[0]) - 1] == '/' || (argv[0][0] == '.' && (!argv[0][1] || argv[0][1] == '/' || (argv[0][1] == '.' && (!argv[0][2] || argv[0][2] == '/'))))) - e += (*p->f)(*argv, envp) ; - else - { - int what = 1 ; - struct stat st ; - size_t len = strlen(*argv) ; - char fn[scandirlen + len + 2] ; - memcpy(fn, scandir, scandirlen) ; - fn[scandirlen] = '/' ; - memcpy(fn + scandirlen + 1, *argv, len + 1) ; - if (stat(fn, &st) < 0) /* XXX: TOCTOU but we don't care */ - { - if (errno != ENOENT) - { - e++ ; - what = 0 ; - strerr_warnwu2sys("stat ", fn) ; - } - } - else if (S_ISDIR(st.st_mode)) what = 2 ; - if (what) e += (*p->f)(what > 1 ? fn : *argv, envp) ; - } - } - return e ; -} diff --git a/src/alias/s6-frontend-alias.c b/src/alias/s6-frontend-alias.c deleted file mode 100644 index ae07489..0000000 --- a/src/alias/s6-frontend-alias.c +++ /dev/null @@ -1,229 +0,0 @@ - /* ISC license. */ - -#include <string.h> -#include <stdlib.h> -#include <stdio.h> - -#include <skalibs/buffer.h> -#include <skalibs/sgetopt.h> -#include <skalibs/strerr.h> -#include <skalibs/stralloc.h> -#include <skalibs/djbunix.h> -#include <skalibs/skamisc.h> -#include <skalibs/exec.h> - -#include <s6/config.h> - -#include <s6-frontend/config.h> - -#define USAGE "s6-frontend-alias [ -v ] cmdname options..." -#define dienomem() strerr_diefu1sys(111, "stralloc_catb") -#define dieusage() strerr_dieusage(100, USAGE) - -static unsigned int verbosity = 0 ; - -typedef void exec_func (int, char const *const *) ; -typedef exec_func *exec_func_ref ; - -typedef struct info_s info_t, *info_t_ref ; -struct info_s -{ - char const *name ; - char const *cmd ; - exec_func_ref f ; -} ; - -static int info_cmp (void const *a, void const *b) -{ - char const *name = a ; - info_t const *info = b ; - return strcmp(name, info->name) ; -} - -#if defined(S6_FRONTEND_WRAP_DAEMONTOOLS) || defined (S6_FRONTEND_WRAP_RUNIT) -static void noboot (char const *name) -{ - strerr_dief3x(100, "s6 does not provide a ", name, " emulation. To boot on a s6 supervision tree, please consider the s6-linux-init package.") ; -} -#endif - -#ifdef S6_FRONTEND_WRAP_DAEMONTOOLS - -static void readproctitle (int argc, char const *const *argv) -{ - (void)argc ; - (void)argv ; - noboot("readproctitle") ; -} - -static void svscanboot (int argc, char const *const *argv) -{ - (void)argc ; - (void)argv ; - noboot("svscanboot") ; -} - -#endif - -#ifdef S6_FRONTEND_WRAP_RUNIT - -static void runit (int argc, char const *const *argv) -{ - (void)argc ; - (void)argv ; - noboot("runit") ; -} - -static void runit_init (int argc, char const *const *argv) -{ - (void)argc ; - (void)argv ; - noboot("runit-init") ; -} - -static void runsvchdir (int argc, char const *const *argv) -{ - (void)argc ; - (void)argv ; - strerr_dief1x(100, "s6 does not provide a runsvchdir emulation. To handle several different sets of services, please consider the s6-rc package.") ; -} - -static void runsvdir (int argc, char const *const *argv) -{ - char const *newargv[4] = { S6_EXTBINPREFIX "s6-svscan", "-t14000", 0, 0 } ; - int dosetsid = 0 ; - subgetopt l = SUBGETOPT_ZERO ; - for (;;) - { - int opt = subgetopt_r(argc, argv, "P", &l) ; - if (opt == -1) break ; - switch (opt) - { - case 'P' : dosetsid = 1 ; break ; - default : dieusage() ; - } - } - argc -= l.ind ; argv += l.ind ; - if (dosetsid) - strerr_warnw1x("-P option ignored: s6-svscan does not run its supervisor processes (s6-supervise) in a new session. However, by default, it runs every service in a new session.") ; - if (argc >= 2) - strerr_warnw1x("s6-svscan does not support logging to a readproctitle process. To log the output of your supervision tree, please consider using the s6-linux-init package.") ; - newargv[2] = argv[0] ; - if (verbosity) - { - buffer_puts(buffer_2, PROG) ; - buffer_puts(buffer_2, ": info: executing command line:") ; - for (char const *const *p = argv ; *p ; p++) - { - buffer_puts(buffer_2, " ") ; - buffer_puts(buffer_2, *p) ; - } - buffer_putsflush(buffer_2, "\n") ; - } - xexec(newargv) ; -} - -static void svlogd (int argc, char const *const *argv) -{ - (void)argc ; - (void)argv ; - strerr_dief1x(100, "the s6-log program is similar to svlogd, but uses a different filtering syntax and does not use a config file in the logdir. Please see https://skarnet.org/software/s6/s6-log.html") ; -} - -static void utmpset (int argc, char const *const *argv) -{ - (void)argc ; - (void)argv ; - strerr_dief1x(100, "s6 does not provide a utmpset emulation. To handle utmp records, please consider the s6-linux-init package, along with the utmps package if necessary.") ; -} - -#endif - -static info_t const aliases[] = -{ -#ifdef S6_FRONTEND_WRAP_RUNIT - { .name = "chpst", .cmd = S6_FRONTEND_BINPREFIX "s6-frontend-alias-chpst", .f = 0 }, -#endif -#ifdef S6_FRONTEND_WRAP_DAEMONTOOLS - { .name = "envdir", .cmd = S6_EXTBINPREFIX "s6-envdir", .f = 0 }, - { .name = "envuidgid", .cmd = S6_EXTBINPREFIX "s6-envuidgid", .f = 0 }, - { .name = "fghack", .cmd = S6_EXTBINPREFIX "s6-fghack", .f = 0 }, - { .name = "multilog", .cmd = S6_EXTBINPREFIX "s6-log", .f = 0 }, - { .name = "pgrphack", .cmd = S6_EXTBINPREFIX "s6-setsid", .f = 0 }, - { .name = "readproctitle", .cmd = 0, .f = &readproctitle }, -#endif -#ifdef S6_FRONTEND_WRAP_RUNIT - { .name = "runit", .cmd = 0, .f = &runit }, - { .name = "runit-init", .cmd = 0, .f = &runit_init }, - { .name = "runsv", .cmd = S6_EXTBINPREFIX "s6-supervise", .f = 0 }, - { .name = "runsvchdir", .cmd = 0, .f = &runsvchdir }, - { .name = "runsvdir", .cmd = 0, .f = &runsvdir }, -#endif -#ifdef S6_FRONTEND_WRAP_DAEMONTOOLS - { .name = "setlock", .cmd = S6_EXTBINPREFIX "s6-setlock", .f = 0 }, - { .name = "setuidgid", .cmd = S6_EXTBINPREFIX "s6-setuidgid", .f = 0 }, - { .name = "softlimit", .cmd = S6_EXTBINPREFIX "s6-softlimit", .f = 0 }, - { .name = "supervise", .cmd = S6_EXTBINPREFIX "s6-supervise", .f = 0 }, -#endif -#ifdef S6_FRONTEND_WRAP_RUNIT - { .name = "sv", .cmd = S6_FRONTEND_BINPREFIX "s6-frontend-alias-sv", .f = 0 }, -#endif -#ifdef S6_FRONTEND_WRAP_DAEMONTOOLS - { .name = "svc", .cmd = S6_EXTBINPREFIX "s6-svc", .f = 0 }, -#endif -#ifdef S6_FRONTEND_WRAP_RUNIT - { .name = "svlogd", .cmd = 0, .f = &svlogd }, -#endif -#ifdef S6_FRONTEND_WRAP_DAEMONTOOLS - { .name = "svok", .cmd = S6_EXTBINPREFIX "s6-svok", .f = 0 }, - { .name = "svscan", .cmd = S6_EXTBINPREFIX "s6-svscan", .f = 0 }, - { .name = "svscanboot", .cmd = 0, .f = &svscanboot }, - { .name = "svstat", .cmd = S6_EXTBINPREFIX "s6-svstat", .f = 0 }, - { .name = "tai64n", .cmd = S6_EXTBINPREFIX "s6-tai64n", .f = 0 }, - { .name = "tai64nlocal", .cmd = S6_EXTBINPREFIX "s6-tai64nlocal", .f = 0 }, -#endif -#ifdef S6_FRONTEND_WRAP_RUNIT - { .name = "utmpset", .cmd = 0, .f = &utmpset }, -#endif -} ; - -int main (int argc, char const **argv) -{ - char const *name = argv[0] ; - stralloc sa = STRALLOC_ZERO ; - info_t *p ; - PROG = "s6-frontend-alias" ; - - if (!sabasename(&sa, name, strlen(name)) || !stralloc_0(&sa)) dienomem() ; - if (!strcmp(sa.s, PROG)) - { - subgetopt l = SUBGETOPT_ZERO ; - for (;;) - { - int opt = subgetopt_r(argc, argv, "v", &l) ; - if (opt == -1) break ; - switch (opt) - { - case 'v' : verbosity++ ; break ; - default : strerr_dieusage(100, USAGE) ; - } - } - argc -= l.ind ; argv += l.ind ; - if (!argc) dieusage() ; - name = *argv ; - stralloc_free(&sa) ; - } - else name = sa.s ; - - p = bsearch(name, aliases, sizeof(aliases) / sizeof(info_t), sizeof(info_t), &info_cmp) ; - if (!p) strerr_dief2x(100, "unknown alias: ", name) ; - if (p->cmd) - { - argv[0] = p->cmd ; - if (verbosity) - strerr_warni4x("the s6 version of ", name, " is ", p->cmd) ; - xexec(argv) ; - } - else (*p->f)(argc, argv) ; - strerr_dief1x(101, "can't happen: incorrect alias handler. Please submit a bug-report.") ; -} |
