diff options
-rw-r--r-- | package/deps.mak | 2 | ||||
-rw-r--r-- | src/daemontools-extras/deps-exe/s6-log | 1 | ||||
-rw-r--r-- | src/daemontools-extras/s6-log.c | 48 |
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 ; |