diff options
author | Laurent Bercot <ska-skaware@skarnet.org> | 2023-09-12 03:36:09 +0000 |
---|---|---|
committer | Laurent Bercot <ska@appnovation.com> | 2023-09-12 03:36:09 +0000 |
commit | 8e8d652a5461a4616c680ae96ffc5b1fc0b40188 (patch) | |
tree | a46ce3fdcfcc313c47a4524a490e20b94e47181b /src/daemontools-extras/s6-fghack.c | |
parent | 970bbeb622573a80381f0f32e6f287195182c0e0 (diff) | |
download | s6-8e8d652a5461a4616c680ae96ffc5b1fc0b40188.tar.xz |
Defork s6-fghack
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src/daemontools-extras/s6-fghack.c')
-rw-r--r-- | src/daemontools-extras/s6-fghack.c | 67 |
1 files changed, 19 insertions, 48 deletions
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 <skalibs/strerr.h> #include <skalibs/allreadwrite.h> #include <skalibs/djbunix.h> -#include <skalibs/exec.h> +#include <skalibs/cspawn.h> #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]) ; } |