diff options
| -rw-r--r-- | package/deps.mak | 3 | ||||
| -rw-r--r-- | package/modes | 1 | ||||
| -rw-r--r-- | package/targets.mak | 1 | ||||
| -rw-r--r-- | src/helpers/deps-exe/s6-frontend-helper-echore | 1 | ||||
| -rw-r--r-- | src/helpers/s6-frontend-helper-echore.c | 63 | ||||
| -rw-r--r-- | src/s6-frontend/live_status.c | 112 |
6 files changed, 94 insertions, 87 deletions
diff --git a/package/deps.mak b/package/deps.mak index e26a563..001accc 100644 --- a/package/deps.mak +++ b/package/deps.mak @@ -4,6 +4,7 @@ src/s6-frontend/s6-frontend-internal.h: src/include/s6-frontend/config.h src/include-local/s6f.h src/helpers/s6-frontend-helper-echo.o src/helpers/s6-frontend-helper-echo.lo: src/helpers/s6-frontend-helper-echo.c +src/helpers/s6-frontend-helper-echore.o src/helpers/s6-frontend-helper-echore.lo: src/helpers/s6-frontend-helper-echore.c src/helpers/s6-frontend-helper-kill.o src/helpers/s6-frontend-helper-kill.lo: src/helpers/s6-frontend-helper-kill.c src/libs6f/s6f_confdir_open.o src/libs6f/s6f_confdir_open.lo: src/libs6f/s6f_confdir_open.c src/include-local/s6f.h src/libs6f/s6f_equote.o src/libs6f/s6f_equote.lo: src/libs6f/s6f_equote.c src/include-local/s6f.h @@ -46,6 +47,8 @@ src/s6-frontend/version_show.o src/s6-frontend/version_show.lo: src/s6-frontend/ s6-frontend-helper-echo: EXTRA_LIBS := s6-frontend-helper-echo: src/helpers/s6-frontend-helper-echo.o -lskarnet +s6-frontend-helper-echore: EXTRA_LIBS := +s6-frontend-helper-echore: src/helpers/s6-frontend-helper-echore.o -lskarnet s6-frontend-helper-kill: EXTRA_LIBS := s6-frontend-helper-kill: src/helpers/s6-frontend-helper-kill.o -lskarnet ifeq ($(strip $(STATIC_LIBS_ARE_PIC)),) diff --git a/package/modes b/package/modes index 0021ad6..c24e49d 100644 --- a/package/modes +++ b/package/modes @@ -2,3 +2,4 @@ s6 0755 s6-frontend 0755 s6-frontend-helper-kill 0755 s6-frontend-helper-echo 0755 +s6-frontend-helper-echore 0755 diff --git a/package/targets.mak b/package/targets.mak index eea22fc..6fb3b49 100644 --- a/package/targets.mak +++ b/package/targets.mak @@ -5,6 +5,7 @@ LIBEXEC_TARGETS := \ s6-frontend \ s6-frontend-helper-kill \ s6-frontend-helper-echo \ +s6-frontend-helper-echore \ EXTRA_TARGETS := \ src/s6-frontend/live_help.c \ diff --git a/src/helpers/deps-exe/s6-frontend-helper-echore b/src/helpers/deps-exe/s6-frontend-helper-echore new file mode 100644 index 0000000..e7187fe --- /dev/null +++ b/src/helpers/deps-exe/s6-frontend-helper-echore @@ -0,0 +1 @@ +-lskarnet diff --git a/src/helpers/s6-frontend-helper-echore.c b/src/helpers/s6-frontend-helper-echore.c new file mode 100644 index 0000000..28fcd73 --- /dev/null +++ b/src/helpers/s6-frontend-helper-echore.c @@ -0,0 +1,63 @@ +/* ISC license. */ + +#include <stdint.h> +#include <unistd.h> + +#include <skalibs/buffer.h> +#include <skalibs/prog.h> +#include <skalibs/strerr.h> + +#define USAGE "s6-frontend-helper-echore list" + +/* + 0 1 2 +st\ev \0 \n other + +0 ^p +START END START WORD + +1 n n p +WORD END START WORD + +^ 0x10 print ^ +n 0x20 print /\n +p 0x40 print cur +*/ + +static inline uint8_t cclass (char c) +{ + switch (c) + { + case '\0' : return 0 ; + case '\n' : return 1 ; + default : return 2 ; + } +} + +static void do_print (char const *s) +{ + static uint8_t const table[2][3] = + { + { 0x02, 0x00, 0x51 }, + { 0x22, 0x20, 0x41 }, + } ; + uint8_t state = 0 ; + while (state < 2) + { + char cur = *s++ ; + uint8_t c = table[state][cclass(cur)] ; + state = c & 0x03 ; + if (c & 0x10) if (buffer_put(buffer_1, "^", 1) < 1) strerr_diefusys(111, "write to stdout") ; + if (c & 0x20) if (buffer_put(buffer_1, "/\n", 2) < 2) strerr_diefusys(111, "write to stdout") ; + if (c & 0x40) if (buffer_put(buffer_1, &cur, 1) < 1) strerr_diefusys(111, "write to stdout") ; + } +} + +int main (int argc, char const *const *argv) +{ + PROG = "s6-frontend-helper-echore" ; + if (argc < 2) strerr_dieusage(100, USAGE) ; + do_print(argv[1]) ; + if (!buffer_flush(buffer_1)) strerr_diefusys(111, "write to stdout") ; + _exit(0) ; +} diff --git a/src/s6-frontend/live_status.c b/src/s6-frontend/live_status.c index ef584b4..76b6c91 100644 --- a/src/s6-frontend/live_status.c +++ b/src/s6-frontend/live_status.c @@ -30,7 +30,7 @@ static void live_status_all (int withe) { unsigned int m = 0 ; size_t llen = strlen(g->dirs.live) ; - char const *argv[21] ; + char const *argv[23] ; char llivedir[llen + 3] ; llivedir[0] = ' ' ; llivedir[1] = ' ' ; memcpy(llivedir + 2, g->dirs.live, llen + 1) ; @@ -40,57 +40,27 @@ static void live_status_all (int withe) argv[m++] = " " S6RC_EXTBINPREFIX "s6-rc" ; argv[m++] = " -l" ; argv[m++] = llivedir ; - argv[m++] = withe ? " -buaE" : " -buae" ; + argv[m++] = withe ? " -cbE" : " -cbe" ; argv[m++] = " list" ; argv[m++] = " " ; - argv[m++] = " sed" ; - argv[m++] = " s|$|/up|" ; + argv[m++] = " grep" ; + argv[m++] = " -F" ; + argv[m++] = " /up/" ; argv[m++] = "" ; argv[m++] = EXECLINE_EXTBINPREFIX "pipeline" ; argv[m++] = " " S6RC_EXTBINPREFIX "s6-rc" ; argv[m++] = " -l" ; argv[m++] = llivedir + 1 ; - argv[m++] = withe ? " -bdaE" : " -bdae" ; + argv[m++] = withe ? " -cbE" : " -cbe" ; argv[m++] = " list" ; argv[m++] = "" ; - argv[m++] = "sed" ; - argv[m++] = "s|$|/down|" ; + argv[m++] = "grep" ; + argv[m++] = " -F" ; + argv[m++] = "/down/" ; argv[m++] = 0 ; main_pretty_exec(argv) ; } -static int get_list_of_up (stralloc *storage, int withe) -{ - int swasnull = !storage->s ; - size_t sabase = storage->len ; - int fd ; - int wstat ; - char const *argv[7] = { S6RC_EXTBINPREFIX "s6-rc", "-l", g->dirs.live, withe ? "-baE" : "-bae", "--", "list", 0 } ; - /* XXX: runs with a modified env, but we know it doesn't matter for s6-rc */ - pid_t pid = child_spawn1_pipe(argv[0], argv, (char const *const *)environ, &fd, 1) ; - if (!pid) { strerr_warnfu2sys("spawn ", argv[0]) ; return 111 ; } - if (!slurpn(fd, storage, 0)) { strerr_warnfu2sys("read output from ", argv[0]) ; return 111 ; } - fd_close(fd) ; - if (wait_pid(pid, &wstat) == -1) - { - strerr_warnfu2sys("wait for ", argv[0]) ; - goto err ; - } - if (WIFSIGNALED(wstat)) - { - char fmt[UINT_FMT] ; - fmt[uint_fmt(fmt, WTERMSIG(wstat))] = 0 ; - strerr_warnf3x(argv[0], " crashed with signal ", fmt) ; - goto err ; - } - return wait_estatus(wstat) ; - - err: - if (swasnull) stralloc_free(storage) ; - else storage->len = sabase ; - return 111 ; -} - static int get_atomics (char const *const *services, unsigned int n, stralloc *storage, int withe) { int swasnull = !storage->s ; @@ -138,47 +108,17 @@ static void live_status_some (char const *const *services, int withe) { stralloc sa = STRALLOC_ZERO ; unsigned int m = 0 ; - size_t uplistpos ; int e ; - char const *argv[57] ; + size_t llen = strlen(g->dirs.live) ; + char llivedir[llen + 3] ; + llivedir[0] = ' ' ; llivedir[1] = ' ' ; + memcpy(llivedir + 2, g->dirs.live, llen + 1) ; + char const *argv[26] ; if (!stralloc_catb(&sa, " ", 1)) dienomem() ; e = get_atomics(services, env_len(services), &sa, withe) ; if (e) _exit(e) ; - if (!stralloc_catb(&sa, "\0 ", 3)) dienomem() ; - uplistpos = sa.len ; - e = get_list_of_up(&sa, withe) ; - if (e) _exit(e) ; if (!stralloc_0(&sa)) dienomem() ; - argv[m++] = EXECLINE_EXTBINPREFIX "if" ; - argv[m++] = " " EXECLINE_EXTBINPREFIX "piperw" ; - argv[m++] = " 3" ; - argv[m++] = " 4" ; - argv[m++] = " " EXECLINE_EXTBINPREFIX "background" ; - argv[m++] = " " EXECLINE_EXTBINPREFIX "fdclose" ; - argv[m++] = " 3" ; - argv[m++] = " " EXECLINE_EXTBINPREFIX "fdmove" ; - argv[m++] = " 1" ; - argv[m++] = " 4" ; - argv[m++] = " " S6_FRONTEND_LIBEXECPREFIX "s6-frontend-helper-echo" ; - argv[m++] = " -n" ; - argv[m++] = " --" ; - argv[m++] = sa.s + uplistpos - 2 ; - argv[m++] = " " ; - argv[m++] = " " EXECLINE_EXTBINPREFIX "fdclose" ; - argv[m++] = " 4" ; - argv[m++] = " " EXECLINE_EXTBINPREFIX "heredoc" ; - argv[m++] = " 0" ; - argv[m++] = sa.s ; - argv[m++] = " " EXECLINE_EXTBINPREFIX "pipeline" ; - argv[m++] = " grep" ; - argv[m++] = " -Fx" ; - argv[m++] = " -f" ; - argv[m++] = " /dev/fd/3" ; - argv[m++] = " " ; - argv[m++] = " sed" ; - argv[m++] = " s|$|/up|" ; - argv[m++] = "" ; argv[m++] = EXECLINE_EXTBINPREFIX "piperw" ; argv[m++] = "3" ; argv[m++] = "4" ; @@ -188,24 +128,22 @@ static void live_status_some (char const *const *services, int withe) argv[m++] = " " EXECLINE_EXTBINPREFIX "fdmove" ; argv[m++] = " 1" ; argv[m++] = " 4" ; - argv[m++] = " " S6_FRONTEND_LIBEXECPREFIX "s6-frontend-helper-echo" ; - argv[m++] = " -n" ; - argv[m++] = " --" ; - argv[m++] = sa.s + uplistpos - 1 ; + argv[m++] = " " S6_FRONTEND_LIBEXECPREFIX "s6-frontend-helper-echore" ; + argv[m++] = sa.s ; argv[m++] = "" ; argv[m++] = EXECLINE_EXTBINPREFIX "fdclose" ; argv[m++] = "4" ; - argv[m++] = EXECLINE_EXTBINPREFIX "heredoc" ; - argv[m++] = "0" ; - argv[m++] = sa.s + 1 ; argv[m++] = EXECLINE_EXTBINPREFIX "pipeline" ; - argv[m++] = " grep" ; - argv[m++] = " -vFx" ; - argv[m++] = " -f" ; - argv[m++] = " /dev/fd/3" ; + argv[m++] = " " S6RC_EXTBINPREFIX "s6-rc" ; + argv[m++] = " -l" ; + argv[m++] = llivedir ; + argv[m++] = withe ? " -cbE" : "-cbe" ; + argv[m++] = " --" ; + argv[m++] = " list" ; argv[m++] = "" ; - argv[m++] = "sed" ; - argv[m++] = "s|$|/down|" ; + argv[m++] = "grep" ; + argv[m++] = "-f" ; + argv[m++] = "/dev/fd/3" ; argv[m++] = 0 ; main_pretty_exec(argv) ; } |
