s6

Mirror/fork of https://skarnet.org/software/s6/
git clone https://ccx.te2000.cz/git/s6
Log | Files | Refs | README | LICENSE

commit ab926cf88440b7e6827f778968ec2d88443bdb26
parent bc0de652fc2e261b0e22ea82dae2e5003875c40a
Author: Laurent Bercot <ska-skaware@skarnet.org>
Date:   Sun, 17 Sep 2017 12:01:37 +0000

 Cosmetic fix: start s6-ftrigrd from the child s6-notifyoncheck

Diffstat:
Msrc/supervision/s6-notifyoncheck.c | 27++++++++++++++++++++++-----
1 file changed, 22 insertions(+), 5 deletions(-)

diff --git a/src/supervision/s6-notifyoncheck.c b/src/supervision/s6-notifyoncheck.c @@ -7,6 +7,7 @@ #include <limits.h> #include <sys/wait.h> #include <skalibs/types.h> +#include <skalibs/allreadwrite.h> #include <skalibs/bytestr.h> #include <skalibs/sgetopt.h> #include <skalibs/strerr2.h> @@ -79,6 +80,7 @@ int main (int argc, char const *const *argv, char const *const *envp) unsigned int fd ; int df = 0 ; int autodetect = 1 ; + int p[2] ; tain_t globaldeadline, sleeptto, localtto, waittto ; unsigned int tries = 7 ; uint16_t id ; @@ -155,28 +157,43 @@ int main (int argc, char const *const *argv, char const *const *envp) fifodir. It's much heavier, but temporary - it doesn't use permanent resources in the daemon - and we're polling anyway, so the user doesn't care about being 100% lightweight. + + We need some voodoo synchronization so ftrigr_start can be started + from the child without a race condition. + */ - if (!ftrigr_startf_g(&a, &globaldeadline)) - strerr_diefu1sys(111, "ftrigr_startf") ; - id = ftrigr_subscribe_g(&a, "event", "d", 0, &globaldeadline) ; - if (!id) strerr_diefu1sys(111, "ftrigr_subscribe to event fifodir") ; + if (pipe(p) < 0) strerr_diefu1sys(111, "pipe") ; switch (df ? doublefork() : fork()) { case -1: strerr_diefu1sys(111, df ? "doublefork" : "fork") ; case 0 : break ; default: { + char c ; close((int)fd) ; + close(p[1]) ; + if (read(p[0], &c, 1) < 1) strerr_diefu1x(111, "synchronize with child") ; + close(p[0]) ; xpathexec_run(argv[0], argv, envp) ; } } + + PROG = "s6-notifyoncheck (child)" ; + close(p[0]) ; + if (!ftrigr_startf_g(&a, &globaldeadline)) + strerr_diefu1sys(111, "ftrigr_startf") ; + id = ftrigr_subscribe_g(&a, "event", "d", 0, &globaldeadline) ; + if (!id) strerr_diefu1sys(111, "ftrigr_subscribe to event fifodir") ; + x[0].fd = selfpipe_init() ; if (x[0].fd < 0) strerr_diefu1sys(111, "selfpipe_init") ; if (selfpipe_trap(SIGCHLD) < 0) strerr_diefu1sys(111, "trap SIGCHLD") ; x[1].fd = ftrigr_fd(&a) ; + if (fd_write(p[1], "", 1) < 1) strerr_diefu1sys(2, "synchronize with parent") ; + fd_close(p[1]) ; /* Loop around a sleep and a ./data/check invocation */ @@ -230,7 +247,7 @@ int main (int argc, char const *const *argv, char const *const *envp) { if (WIFEXITED(wstat) && !WEXITSTATUS(wstat)) { - write((int)fd, "\n", 1) ; + fd_write((int)fd, "\n", 1) ; return 0 ; } else break ;