--- src/supervision/s6-supervise.c | 87 +++++++++++++++++++++++++++++++----------- 1 file changed, 65 insertions(+), 22 deletions(-) diff --git a/src/supervision/s6-supervise.c b/src/supervision/s6-supervise.c index 2e8fa38..7605a82 100644 --- a/src/supervision/s6-supervise.c +++ b/src/supervision/s6-supervise.c _at_@ -9,6 +9,9 @@ #include <errno.h> #include <fcntl.h> #include <signal.h> +#ifdef WANT_CLONE_NEWPID +# include <sched.h> +#endif #include <skalibs/allreadwrite.h> #include <skalibs/bytestr.h> #include <skalibs/uint.h> _at_@ -203,6 +206,67 @@ static int maybesetsid (void) return 1 ; } +static void exec_run(int p[2], int notifyp[2], int fd) gccattr_noreturn ; +static void exec_run(int p[2], int notifyp[2], int fd) +{ + char const *cargv[2] = { "run", 0 } ; + PROG = "s6-supervise (child)" ; + selfpipe_finish() ; + if (notifyp[0] >= 0) close(notifyp[0]) ; + close(p[0]) ; + if (notifyp[1] >= 0 && fd_move(fd, notifyp[1]) < 0) + { + failcoe(p[1]) ; + strerr_diefu1sys(127, "move notification descriptor") ; + } + if (!maybesetsid()) + { + failcoe(p[1]) ; + strerr_diefu1sys(127, "access ./nosetsid") ; + } + execve("./run", (char *const *)cargv, (char *const *)environ) ; + failcoe(p[1]) ; + strerr_dieexec(127, "run") ; +} + +static pid_t spawn_run_fork(int p[2], int notifyp[2], int fd) +{ + pid_t pid = fork() ; + if (!pid) exec_run(p, notifyp, fd) ; + return pid ; +} + +#ifdef WANT_CLONE_NEWPID +typedef struct +{ + int p[2] ; + int notifyp[2] ; + int fd ; +} exec_run_t ; + +static int exec_run_shim(void *ctx) gccattr_noreturn ; +static int exec_run_shim(void *ctx) +{ + exec_run_t *er = (exec_run_t *) ctx ; + exec_run(er->p, er->notifyp, er->fd) ; +} + +static pid_t spawn_run(int p[2], int notifyp[2], int fd) +{ + exec_run_t arg = { { p[0], p[1] }, { notifyp[0], notifyp[1] }, fd } ; + char child_stack[SIGSTKSZ] ; + if (access("clone-newpid", F_OK) < 0 && errno == ENOENT) + return spawn_run_fork(p, notifyp, fd) ; + return (pid_t) clone(&exec_run_shim, child_stack + sizeof(child_stack), + CLONE_NEWPID | SIGCHLD, &arg) ; +} +#else /* if !defined(WANT_CLONE_NEWPID) */ +static pid_t spawn_run(int p[2], int notifyp[2], int fd) +{ + return spawn_run_fork(p, notifyp, fd) ; +} +#endif /* defined(WANT_CLONE_NEWPID) */ + static void trystart (void) { int p[2] ; _at_@ -222,7 +286,7 @@ static void trystart (void) fd_close(p[1]) ; fd_close(p[0]) ; return ; } - pid = fork() ; + pid = spawn_run(p, notifyp, (int)fd) ; if (pid < 0) { settimeout(60) ; _at_@ -232,27 +296,6 @@ static void trystart (void) fd_close(p[1]) ; fd_close(p[0]) ; return ; } - else if (!pid) - { - char const *cargv[2] = { "run", 0 } ; - PROG = "s6-supervise (child)" ; - selfpipe_finish() ; - if (notifyp[0] >= 0) close(notifyp[0]) ; - close(p[0]) ; - if (notifyp[1] >= 0 && fd_move((int)fd, notifyp[1]) < 0) - { - failcoe(p[1]) ; - strerr_diefu1sys(127, "move notification descriptor") ; - } - if (!maybesetsid()) - { - failcoe(p[1]) ; - strerr_diefu1sys(127, "access ./nosetsid") ; - } - execve("./run", (char *const *)cargv, (char *const *)environ) ; - failcoe(p[1]) ; - strerr_dieexec(127, "run") ; - } if (notifyp[1] >= 0) fd_close(notifyp[1]) ; fd_close(p[1]) ; { -- 2.13.1Received on Sat Jul 15 2017 - 18:44:28 UTC
This archive was generated by hypermail 2.3.0 : Sun May 09 2021 - 19:38:49 UTC