From 8e8d652a5461a4616c680ae96ffc5b1fc0b40188 Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Tue, 12 Sep 2023 03:36:09 +0000 Subject: Defork s6-fghack Signed-off-by: Laurent Bercot --- src/daemontools-extras/deps-exe/s6-fghack | 1 + src/daemontools-extras/s6-fghack.c | 67 +++++++++---------------------- 2 files changed, 20 insertions(+), 48 deletions(-) (limited to 'src/daemontools-extras') diff --git a/src/daemontools-extras/deps-exe/s6-fghack b/src/daemontools-extras/deps-exe/s6-fghack index e7187fe..39597dd 100644 --- a/src/daemontools-extras/deps-exe/s6-fghack +++ b/src/daemontools-extras/deps-exe/s6-fghack @@ -1 +1,2 @@ -lskarnet +${SPAWN_LIB} diff --git a/src/daemontools-extras/s6-fghack.c b/src/daemontools-extras/s6-fghack.c index c90792a..fec2962 100644 --- a/src/daemontools-extras/s6-fghack.c +++ b/src/daemontools-extras/s6-fghack.c @@ -7,63 +7,34 @@ #include #include #include -#include +#include #define USAGE "s6-fghack prog..." -int main (int argc, char const *const *argv) +#define N 30 + +int main (int argc, char const *const *argv, char const *const *envp) { int p[2] ; - int pcoe[2] ; + int fds[N] ; pid_t pid ; - char dummy ; + cspawn_fileaction fa = { .type = CSPAWN_FA_CLOSE } ; + char c ; + PROG = "s6-fghack" ; if (argc < 2) strerr_dieusage(100, USAGE) ; - if (pipe(p) < 0) strerr_diefu1sys(111, "create hackpipe") ; - if (pipe(pcoe) < 0) strerr_diefu1sys(111, "create coepipe") ; - - switch (pid = fork()) - { - case -1 : strerr_diefu1sys(111, "fork") ; - case 0 : - { - int i = 0 ; - close(p[0]) ; - close(pcoe[0]) ; - if (coe(pcoe[1]) < 0) _exit(111) ; - for (; i < 30 ; i++) dup(p[1]) ; /* hack. gcc's warning is justified. */ - exec(argv+1) ; - i = errno ; - if (fd_write(pcoe[1], "", 1) < 1) _exit(111) ; - _exit(i) ; - } - } - + if (pipe(p) == -1) strerr_diefu1sys(111, "create hackpipe") ; + for (size_t i = 0 ; i < N ; i++) + fds[i] = dup(p[1]) ; + fa.x.fd = p[0] ; + pid = cspawn(argv[1], argv + 1, envp, 0, &fa, 1) ; + if (!pid) strerr_diefu2sys(111, "spawn ", argv[1]) ; close(p[1]) ; - close(pcoe[1]) ; + for (size_t i = 0 ; i < N ; i++) close(fds[i]) ; - switch (fd_read(pcoe[0], &dummy, 1)) - { - case -1 : strerr_diefu1sys(111, "read on coepipe") ; - case 1 : - { - int wstat ; - if (wait_pid(pid, &wstat) < 0) strerr_diefu1sys(111, "wait_pid") ; - errno = WEXITSTATUS(wstat) ; - strerr_dieexec(111, argv[1]) ; - } - } - - fd_close(pcoe[0]) ; - - p[1] = fd_read(p[0], &dummy, 1) ; - if (p[1] < 0) strerr_diefu1sys(111, "read on hackpipe") ; + p[1] = fd_read(p[0], &c, 1) ; + if (p[1] == -1) strerr_diefu1sys(111, "read on hackpipe") ; if (p[1]) strerr_dief2x(102, argv[1], " wrote on hackpipe") ; - - { - int wstat ; - if (wait_pid(pid, &wstat) < 0) strerr_diefu1sys(111, "wait_pid") ; - if (WIFSIGNALED(wstat)) strerr_dief2x(111, argv[2], " crashed") ; - return WEXITSTATUS(wstat) ; - } + if (wait_pid(pid, &p[1]) < 0) strerr_diefu1sys(111, "wait_pid") ; + return wait_estatus(p[1]) ; } -- cgit v1.2.3