aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--package/deps.mak3
-rw-r--r--package/modes1
-rw-r--r--package/targets.mak1
-rw-r--r--src/helpers/deps-exe/s6-frontend-helper-echore1
-rw-r--r--src/helpers/s6-frontend-helper-echore.c63
-rw-r--r--src/s6-frontend/live_status.c112
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) ;
}