diff options
-rw-r--r-- | src/daemontools-extras/s6-setlock.c | 1 | ||||
-rw-r--r-- | src/libs6/s6_ucspiserver_spawn.c | 110 | ||||
-rw-r--r-- | src/libs6/s6lockd.c | 1 | ||||
-rw-r--r-- | src/pipe-tools/s6-ftrig-listen.c | 3 | ||||
-rw-r--r-- | src/pipe-tools/s6-ftrig-listen1.c | 3 | ||||
-rw-r--r-- | src/supervision/s6-notifyoncheck.c | 3 | ||||
-rw-r--r-- | src/supervision/s6-svlisten.c | 4 | ||||
-rw-r--r-- | src/supervision/s6-svlisten1.c | 4 | ||||
-rw-r--r-- | src/supervision/s6-svscan.c | 54 |
9 files changed, 49 insertions, 134 deletions
diff --git a/src/daemontools-extras/s6-setlock.c b/src/daemontools-extras/s6-setlock.c index 8eeb95b..fea6a11 100644 --- a/src/daemontools-extras/s6-setlock.c +++ b/src/daemontools-extras/s6-setlock.c @@ -10,6 +10,7 @@ #include <skalibs/types.h> #include <skalibs/tai.h> #include <skalibs/iopause.h> +#include <skalibs/cspawn.h> #include <skalibs/djbunix.h> #include <skalibs/exec.h> diff --git a/src/libs6/s6_ucspiserver_spawn.c b/src/libs6/s6_ucspiserver_spawn.c index 7fd4116..23f102d 100644 --- a/src/libs6/s6_ucspiserver_spawn.c +++ b/src/libs6/s6_ucspiserver_spawn.c @@ -1,112 +1,18 @@ /* ISC license. */ -#include <skalibs/sysdeps.h> - -#include <stdint.h> -#include <string.h> -#include <unistd.h> - -#include <skalibs/uint16.h> -#include <skalibs/fmtscan.h> -#include <skalibs/djbunix.h> +#include <skalibs/env.h> +#include <skalibs/cspawn.h> #include <s6/ucspiserver.h> -#ifdef SKALIBS_HASPOSIXSPAWN - -#include <errno.h> -#include <signal.h> -#include <stdlib.h> -#include <spawn.h> - -#include <skalibs/config.h> -#include <skalibs/env.h> - pid_t s6_ucspiserver_spawn (int fd, char const *const *argv, char const *const *envp, size_t envlen, char const *modifs, size_t modiflen, size_t modifn) { - pid_t pid ; - posix_spawn_file_actions_t actions ; - posix_spawnattr_t attr ; - sigset_t set ; - int e ; - int nopath = !getenv("PATH") ; -#ifdef SKALIBS_HASPOSIXSPAWNEARLYRETURN - int p[2] ; -#endif - char const *newenvp[envlen + modifn + 1] ; - -#ifdef SKALIBS_HASPOSIXSPAWNEARLYRETURN - if (pipecoe(p) == -1) return 0 ; -#endif - e = posix_spawnattr_init(&attr) ; - if (e) goto err ; - sigemptyset(&set) ; - e = posix_spawnattr_setsigmask(&attr, &set) ; - if (e) goto errattr ; - e = posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETSIGMASK) ; - if (e) goto errattr ; - e = posix_spawn_file_actions_init(&actions) ; - if (e) goto errattr ; - e = posix_spawn_file_actions_adddup2(&actions, fd, 0) ; - if (e) goto erractions ; - e = posix_spawn_file_actions_adddup2(&actions, fd, 1) ; - if (e) goto erractions ; - if (fd > 1) + cspawn_fileaction fa[2] = { - e = posix_spawn_file_actions_addclose(&actions, fd) ; - if (e) goto erractions ; - } - + [0] = { .type = CSPAWN_FA_MOVE, .x = { .fd2 = { [0] = 0, [1] = fd } } }, + [1] = { .type = CSPAWN_FA_COPY, .x = { .fd2 = { [0] = 1, [1] = 0 } } } + } ; + char const *newenvp[envlen + modifn + 1] ; env_mergen(newenvp, envlen + modifn + 1, envp, envlen, modifs, modiflen, modifn) ; - if (nopath && (setenv("PATH", SKALIBS_DEFAULTPATH, 0) < 0)) { e = errno ; goto erractions ; } - e = posix_spawnp(&pid, argv[0], &actions, &attr, (char *const *)argv, (char *const *)newenvp) ; - if (nopath) unsetenv("PATH") ; - if (e) goto erractions ; - - posix_spawn_file_actions_destroy(&actions) ; - posix_spawnattr_destroy(&attr) ; -#ifdef SKALIBS_HASPOSIXSPAWNEARLYRETURN - return child_spawn_workaround(pid, p) ; -#else - return pid ; -#endif - - erractions: - posix_spawn_file_actions_destroy(&actions) ; - errattr: - posix_spawnattr_destroy(&attr) ; - err: -#ifdef SKALIBS_HASPOSIXSPAWNEARLYRETURN - fd_close(p[1]) ; - fd_close(p[0]) ; -#endif - errno = e ; - return 0 ; -} - -#else - -#include <skalibs/strerr.h> -#include <skalibs/selfpipe.h> -#include <skalibs/exec.h> - -pid_t s6_ucspiserver_spawn (int fd, char const *const *argv, char const *const *envp, size_t envlen, char const *modifs, size_t modiflen, size_t modifn) -{ - pid_t pid = fork() ; - if (pid == -1) return 0 ; - if (!pid) - { - size_t proglen = strlen(PROG) ; - char newprog[proglen + 9] ; - memcpy(newprog, PROG, proglen) ; - memcpy(newprog, " (child)", 9) ; - PROG = newprog ; - if ((fd_move(1, fd) == -1) || (fd_copy(0, 1) == -1)) - strerr_diefu1sys(111, "move fds") ; - selfpipe_finish() ; - xmexec_fn(argv, envp, envlen, modifs, modiflen, modifn) ; - } - return pid ; + return cspawn(argv[0], argv, newenvp, CSPAWN_FLAGS_SELFPIPE_FINISH, fa, 2) ; } - -#endif diff --git a/src/libs6/s6lockd.c b/src/libs6/s6lockd.c index e7303af..8cc767a 100644 --- a/src/libs6/s6lockd.c +++ b/src/libs6/s6lockd.c @@ -15,6 +15,7 @@ #include <skalibs/sig.h> #include <skalibs/selfpipe.h> #include <skalibs/tai.h> +#include <skalibs/cspawn.h> #include <skalibs/djbunix.h> #include <skalibs/iopause.h> #include <skalibs/textmessage.h> diff --git a/src/pipe-tools/s6-ftrig-listen.c b/src/pipe-tools/s6-ftrig-listen.c index 92e257e..041226e 100644 --- a/src/pipe-tools/s6-ftrig-listen.c +++ b/src/pipe-tools/s6-ftrig-listen.c @@ -13,6 +13,7 @@ #include <skalibs/djbunix.h> #include <skalibs/sig.h> #include <skalibs/selfpipe.h> +#include <skalibs/cspawn.h> #include <s6/compat.h> #include <s6/ftrigr.h> @@ -81,7 +82,7 @@ int main (int argc, char const **argv, char const *const *envp) if (!ids[i]) strerr_diefu4sys(111, "subscribe to ", argv[i<<1], " with regexp ", argv[(i<<1)+1]) ; } - pid = child_spawn0(argv[argc1 + 1], argv + argc1 + 1, envp) ; + pid = cspawn(argv[argc1 + 1], argv + argc1 + 1, envp, CSPAWN_FLAGS_SELFPIPE_FINISH, 0, 0) ; if (!pid) strerr_diefu2sys(111, "spawn ", argv[argc1 + 1]) ; for (;;) diff --git a/src/pipe-tools/s6-ftrig-listen1.c b/src/pipe-tools/s6-ftrig-listen1.c index b81b484..4c42820 100644 --- a/src/pipe-tools/s6-ftrig-listen1.c +++ b/src/pipe-tools/s6-ftrig-listen1.c @@ -14,6 +14,7 @@ #include <skalibs/djbunix.h> #include <skalibs/sig.h> #include <skalibs/selfpipe.h> +#include <skalibs/cspawn.h> #include <s6/ftrigr.h> @@ -69,7 +70,7 @@ int main (int argc, char const *const *argv, char const *const *envp) if (!selfpipe_trap(SIGCHLD)) strerr_diefu1sys(111, "selfpipe_trap") ; x[1].fd = ftrigr_fd(&a) ; - pid = child_spawn0(argv[2], argv+2, envp) ; + pid = cspawn(argv[2], argv+2, envp, CSPAWN_FLAGS_SELFPIPE_FINISH, 0, 0) ; if (!pid) strerr_diefu2sys(111, "spawn ", argv[2]) ; for (;;) diff --git a/src/supervision/s6-notifyoncheck.c b/src/supervision/s6-notifyoncheck.c index 592502c..8c139af 100644 --- a/src/supervision/s6-notifyoncheck.c +++ b/src/supervision/s6-notifyoncheck.c @@ -13,6 +13,7 @@ #include <skalibs/sgetopt.h> #include <skalibs/strerr.h> #include <skalibs/tai.h> +#include <skalibs/cspawn.h> #include <skalibs/djbunix.h> #include <skalibs/selfpipe.h> #include <skalibs/iopause.h> @@ -230,7 +231,7 @@ int main (int argc, char const *const *argv, char const *const *envp) if (handle_event(&a, id, 0)) return 2 ; } - pid = child_spawn0(childargv[0], childargv, envp) ; + pid = cspawn(childargv[0], childargv, envp, CSPAWN_FLAGS_SELFPIPE_FINISH, 0, 0) ; if (!pid) { strerr_warnwu2sys("spawn ", childargv[0]) ; diff --git a/src/supervision/s6-svlisten.c b/src/supervision/s6-svlisten.c index 2ab1d9b..0774ef2 100644 --- a/src/supervision/s6-svlisten.c +++ b/src/supervision/s6-svlisten.c @@ -7,7 +7,7 @@ #include <skalibs/bitarray.h> #include <skalibs/tai.h> #include <skalibs/strerr.h> -#include <skalibs/djbunix.h> +#include <skalibs/cspawn.h> #include <skalibs/selfpipe.h> #include <skalibs/exec.h> @@ -71,7 +71,7 @@ int main (int argc, char const **argv, char const *const *envp) unsigned char upstate[bitarray_div8(argc1)] ; unsigned char readystate[bitarray_div8(argc1)] ; s6_svlisten_init(argc1, argv, &foo, ids, upstate, readystate, &deadline) ; - pid = child_spawn0(argv[argc1 + 1], argv + argc1 + 1, envp) ; + pid = cspawn(argv[argc1 + 1], argv + argc1 + 1, envp, CSPAWN_FLAGS_SELFPIPE_FINISH, 0, 0) ; if (!pid) strerr_diefu2sys(111, "spawn ", argv[argc1 + 1]) ; if (wantup == 2) { diff --git a/src/supervision/s6-svlisten1.c b/src/supervision/s6-svlisten1.c index ab4f44c..4289e8c 100644 --- a/src/supervision/s6-svlisten1.c +++ b/src/supervision/s6-svlisten1.c @@ -6,7 +6,7 @@ #include <skalibs/types.h> #include <skalibs/tai.h> #include <skalibs/strerr.h> -#include <skalibs/djbunix.h> +#include <skalibs/cspawn.h> #include <skalibs/selfpipe.h> #include "s6-svlisten.h" @@ -50,7 +50,7 @@ int main (int argc, char const *const *argv, char const *const *envp) tain_add_g(&deadline, &tto) ; s6_svlisten_selfpipe_init() ; s6_svlisten_init(1, argv, &foo, &id, &upstate, &readystate, &deadline) ; - pid = child_spawn0(argv[1], argv + 1, envp) ; + pid = cspawn(argv[1], argv + 1, envp, CSPAWN_FLAGS_SELFPIPE_FINISH, 0, 0) ; if (!pid) strerr_diefu2sys(111, "spawn ", argv[1]) ; if (wantrestart) if (s6_svlisten_loop(&foo, 0, 1, 1, &deadline, selfpipe_fd(), &s6_svlisten_signal_handler)) diff --git a/src/supervision/s6-svscan.c b/src/supervision/s6-svscan.c index b2edc93..92f4d7a 100644 --- a/src/supervision/s6-svscan.c +++ b/src/supervision/s6-svscan.c @@ -17,6 +17,7 @@ #include <skalibs/tai.h> #include <skalibs/iopause.h> #include <skalibs/devino.h> +#include <skalibs/cspawn.h> #include <skalibs/djbunix.h> #include <skalibs/direntry.h> #include <skalibs/sig.h> @@ -242,7 +243,8 @@ static void handle_signals (unsigned int *what) memcpy(fn + SIGNAL_PROG_LEN, name, len + 1) ; if (access(newargv[0], X_OK) == 0) /* avoids a fork, don't care about the toctou */ { - if (child_spawn0(newargv[0], newargv, (char const **)environ)) usebuiltin = 0 ; + if (cspawn(newargv[0], newargv, (char const **)environ, CSPAWN_FLAGS_SELFPIPE_FINISH, 0, 0)) + usebuiltin = 0 ; else if (errno != ENOENT) strerr_warnwu2sys("spawn ", newargv[0]) ; } if (usebuiltin) switch (sig) @@ -530,34 +532,36 @@ static int start_iter (void *data, void *aux) { service *sv = data ; uint32_t i = sv - SERVICE(0) ; + char const *const cargv[3] = { "s6-supervise", NAME(i), 0 } ; + cspawn_fileaction fa[2] = + { + [0] = { .type = CSPAWN_FA_MOVE }, + [1] = { .type = CSPAWN_FA_MOVE } + } ; + size_t j = 0 ; + if (!bitarray_peek(active, i) || sv->pid || tain_future(&sv->start)) return 1 ; - sv->pid = fork() ; - switch (sv->pid) + if (sv->peer < max) { - case -1 : - sv->pid = 0 ; - strerr_warnwu2sys("fork", NAME(i)) ; - tain_addsec_g(&start_deadline, 10) ; - return 0 ; - case 0 : - { - char const *cargv[3] = { "s6-supervise", NAME(i), 0 } ; - PROG = "s6-svscan (child)" ; - if (sv->peer < max) - { - if (fd_move(!is_logger(i), sv->p) == -1) - strerr_diefu2sys(111, "dup2 pipe for ", NAME(i)) ; - } - if (consoleholder && i == special) - { - if (fd_move(2, consoleholder) == -1) - strerr_diefu2sys(111, "restore console fd for service ", NAME(i)) ; - } - selfpipe_finish() ; - xexec_a(S6_BINPREFIX "s6-supervise", cargv) ; - } + fa[j].x.fd2[0] = !is_logger(i) ; + fa[j].x.fd2[1] = sv->p ; + j++ ; + } + if (consoleholder && i == special) + { + fa[j].x.fd2[0] = 2 ; + fa[j].x.fd2[1] = consoleholder ; + j++ ; + } + + sv->pid = cspawn(S6_BINPREFIX "s6-supervise", cargv, (char const *const *)environ, CSPAWN_FLAGS_SELFPIPE_FINISH, fa, j) ; + if (!sv->pid) + { + strerr_warnwu2sys("spawn s6-supervise for ", NAME(i)) ; + tain_addsec_g(&start_deadline, 10) ; + return 0 ; } avltreen_insert(by_pid, i) ; tain_addsec_g(&sv->start, 1) ; |