summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2023-09-12 04:07:14 +0000
committerLaurent Bercot <ska@appnovation.com>2023-09-12 04:07:14 +0000
commit46fa8813a874a2372395a844c717293fd6edde1d (patch)
tree2647e9c4fe81ec4522acf870ca6ef6ccaa5d3351
parent8e8d652a5461a4616c680ae96ffc5b1fc0b40188 (diff)
downloads6-46fa8813a874a2372395a844c717293fd6edde1d.tar.xz
Defork s6-log
Signed-off-by: Laurent Bercot <ska@appnovation.com>
-rw-r--r--package/deps.mak2
-rw-r--r--src/daemontools-extras/deps-exe/s6-log1
-rw-r--r--src/daemontools-extras/s6-log.c48
3 files changed, 19 insertions, 32 deletions
diff --git a/package/deps.mak b/package/deps.mak
index f48a1d2..cb23cf7 100644
--- a/package/deps.mak
+++ b/package/deps.mak
@@ -177,7 +177,7 @@ s6-envuidgid: EXTRA_LIBS := -lskarnet ${MAYBEPTHREAD_LIB}
s6-envuidgid: src/daemontools-extras/s6-envuidgid.o ${LIBNSSS}
s6-fghack: EXTRA_LIBS := -lskarnet ${SPAWN_LIB}
s6-fghack: src/daemontools-extras/s6-fghack.o
-s6-log: EXTRA_LIBS := -lskarnet ${SYSCLOCK_LIB}
+s6-log: EXTRA_LIBS := -lskarnet ${SPAWN_LIB} ${SYSCLOCK_LIB}
s6-log: src/daemontools-extras/s6-log.o
s6-setlock: EXTRA_LIBS := -lskarnet ${TIMER_LIB}
s6-setlock: src/daemontools-extras/s6-setlock.o
diff --git a/src/daemontools-extras/deps-exe/s6-log b/src/daemontools-extras/deps-exe/s6-log
index a11a5f4..32c27dd 100644
--- a/src/daemontools-extras/deps-exe/s6-log
+++ b/src/daemontools-extras/deps-exe/s6-log
@@ -1,2 +1,3 @@
-lskarnet
+${SPAWN_LIB}
${SYSCLOCK_LIB}
diff --git a/src/daemontools-extras/s6-log.c b/src/daemontools-extras/s6-log.c
index 45a46f0..18a50be 100644
--- a/src/daemontools-extras/s6-log.c
+++ b/src/daemontools-extras/s6-log.c
@@ -31,7 +31,7 @@
#include <skalibs/sig.h>
#include <skalibs/selfpipe.h>
#include <skalibs/siovec.h>
-#include <skalibs/exec.h>
+#include <skalibs/cspawn.h>
#include <s6/config.h>
@@ -315,32 +315,6 @@ static int finish (logdir_t *ldp, char const *name, char suffix)
return logdir_trim(ldp) ;
}
-static inline void exec_processor (logdir_t *ldp)
-{
-#ifdef S6_USE_EXECLINE
- char const *cargv[4] = { ldp->flags & 4 ? "/bin/sh" : EXECLINE_EXTBINPREFIX "execlineb", ldp->flags & 4 ? "-c" : "-Pc", ldp->processor, 0 } ;
-#else
- char const *cargv[4] = { "/bin/sh", "-c", ldp->processor, 0 } ;
-#endif
- int fd ;
- PROG = "s6-log (processor child)" ;
- if (chdir(ldp->dir) < 0) strerr_diefu2sys(111, "chdir to ", ldp->dir) ;
- fd = open_readb("previous") ;
- if (fd < 0) strerr_diefu3sys(111, "open_readb ", ldp->dir, "/previous") ;
- if (fd_move(0, fd) < 0) strerr_diefu3sys(111, "fd_move ", ldp->dir, "/previous") ;
- fd = open_trunc("processed") ;
- if (fd < 0) strerr_diefu3sys(111, "open_trunc ", ldp->dir, "/processed") ;
- if (fd_move(1, fd) < 0) strerr_diefu3sys(111, "fd_move ", ldp->dir, "/processed") ;
- fd = open_readb("state") ;
- if (fd < 0) strerr_diefu3sys(111, "open_readb ", ldp->dir, "/state") ;
- if (fd_move(4, fd) < 0) strerr_diefu3sys(111, "fd_move ", ldp->dir, "/state") ;
- fd = open_trunc("newstate") ;
- if (fd < 0) strerr_diefu3sys(111, "open_trunc ", ldp->dir, "/newstate") ;
- if (fd_move(5, fd) < 0) strerr_diefu3sys(111, "fd_move ", ldp->dir, "/newstate") ;
- selfpipe_finish() ;
- xexec(cargv) ;
-}
-
static int rotator (logdir_t *ldp)
{
size_t dirlen = strlen(ldp->dir) ;
@@ -412,13 +386,25 @@ static int rotator (logdir_t *ldp)
ldp->rstate = ROTSTATE_RUNPROCESSOR ;
case ROTSTATE_RUNPROCESSOR :
{
- pid_t pid = fork() ;
- if (pid < 0)
+#ifdef S6_USE_EXECLINE
+ char const *cargv[4] = { ldp->flags & 4 ? "/bin/sh" : EXECLINE_EXTBINPREFIX "execlineb", ldp->flags & 4 ? "-c" : "-Pc", ldp->processor, 0 } ;
+#else
+ char const *cargv[4] = { "/bin/sh", "-c", ldp->processor, 0 } ;
+#endif
+ cspawn_fileaction fa[5] =
+ {
+ [0] = { .type = CSPAWN_FA_CHDIR, .x = { .path = ldp->dir } },
+ [1] = { .type = CSPAWN_FA_OPEN, .x = { .openinfo = { .fd = 0, .file = "previous", .oflag = O_RDONLY, .mode = 0644 } } },
+ [2] = { .type = CSPAWN_FA_OPEN, .x = { .openinfo = { .fd = 1, .file = "processed", .oflag = O_WRONLY | O_CREAT | O_TRUNC, .mode = 0666 } } },
+ [3] = { .type = CSPAWN_FA_OPEN, .x = { .openinfo = { .fd = 4, .file = "state", .oflag = O_RDONLY, .mode = 0644 } } },
+ [4] = { .type = CSPAWN_FA_OPEN, .x = { .openinfo = { .fd = 5, .file = "newstate", .oflag = O_WRONLY | O_CREAT | O_TRUNC, .mode = 0666 } } }
+ } ;
+ pid_t pid = cspawn(cargv[0], cargv, (char const *const *)environ, CSPAWN_FLAGS_SELFPIPE_FINISH, fa, 5) ;
+ if (!pid)
{
- if (verbosity) strerr_warnwu2sys("fork processor for logdir ", ldp->dir) ;
+ if (verbosity) strerr_warnwu2sys("spawn processor for logdir ", ldp->dir) ;
goto fail ;
}
- else if (!pid) exec_processor(ldp) ;
ldp->pid = pid ;
tain_add_g(&ldp->deadline, &tain_infinite_relative) ;
ldp->rstate = ROTSTATE_WAITPROCESSOR ;