--- man/runsv.8 | 1 + man/sv.8 | 1 + package/CHANGES | 2 ++ src/runsv.c | 25 ++++++++++++++----------- src/sv.c | 5 ++++- 5 files changed, 22 insertions(+), 12 deletions(-) diff --git a/man/runsv.8 b/man/runsv.8 index 7c5abfc..8d364c6 100644 --- a/man/runsv.8 +++ b/man/runsv.8 _at_@ -150,6 +150,7 @@ exits. If the service is down and a log service exists, .B runsv closes the standard input of the log service, and waits for it to terminate. +No more control characters will be processed. If the log service is down, .B runsv exits. diff --git a/man/sv.8 b/man/sv.8 index 7b09602..0c9f4c3 100644 --- a/man/sv.8 +++ b/man/sv.8 _at_@ -78,6 +78,7 @@ exits. If the service is down and a log service exists, .BR runsv (8) closes the standard input of the log service and waits for it to terminate. +No more commands will be processed. If the log service is down, .BR runsv (8) exits. diff --git a/package/CHANGES b/package/CHANGES index 82d117c..1286c8f 100644 --- a/package/CHANGES +++ b/package/CHANGES _at_@ -1,5 +1,7 @@ 2.1.2 + * runsv.c, sv.c: on exit, properly wait for log service to terminate. + * man/runsv.8, man/sv.8: adapt. * man/sv.8: "sv exit" does not send a TERM signal to the log service (thx Jonathan Nieder). * fmt_ptime.c: 64 bits time_t fix for svlogd (tnx Jérémie diff --git a/src/runsv.c b/src/runsv.c index ecf4677..dc628fa 100644 --- a/src/runsv.c +++ b/src/runsv.c _at_@ -31,6 +31,7 @@ int selfpipe[2]; #define S_DOWN 0 #define S_RUN 1 #define S_FINISH 2 +#define S_WAIT 3 /* ctrl */ #define C_NOOP 0 #define C_TERM 1 _at_@ -149,6 +150,9 @@ void update_status(struct svdir *s) { case S_FINISH: buffer_puts(&b, "finish"); break; + case S_WAIT: + buffer_puts(&b, "wait"); + break; } if (s->ctrl & C_PAUSE) buffer_puts(&b, ", paused"); if (s->ctrl & C_TERM) buffer_puts(&b, ", got TERM"); _at_@ -566,6 +570,13 @@ int main(int argc, char **argv) { continue; } svd[0].state =S_DOWN; + if (svd[0].want == W_EXIT) { + svd[0].state =S_WAIT; + svd[1].want =W_EXIT; + update_status(&svd[1]); + if (close(logpipe[1]) == -1) warn("unable to close logpipe[1]"); + if (close(logpipe[0]) == -1) warn("unable to close logpipe[0]"); + } taia_uint(&deadline, 1); taia_add(&deadline, &svd[0].start, &deadline); taia_now(&svd[0].start); _at_@ -586,22 +597,14 @@ int main(int argc, char **argv) { } } } - if (read(svd[0].fdcontrol, &ch, 1) == 1) ctrl(&svd[0], ch); + if (read(svd[0].fdcontrol, &ch, 1) == 1) + if (svd[0].state != S_WAIT) ctrl(&svd[0], ch); if (haslog) if (read(svd[1].fdcontrol, &ch, 1) == 1) ctrl(&svd[1], ch); if (sigterm) { ctrl(&svd[0], 'x'); sigterm =0; } - if ((svd[0].want == W_EXIT) && (svd[0].state == S_DOWN)) { - if (svd[1].pid == 0) _exit(0); - if (svd[1].want != W_EXIT) { - svd[1].want =W_EXIT; - /* stopservice(&svd[1]); */ - update_status(&svd[1]); - if (close(logpipe[1]) == -1) warn("unable to close logpipe[1]"); - if (close(logpipe[0]) == -1) warn("unable to close logpipe[0]"); - } - } + if (svd[0].state == S_WAIT) if (svd[1].pid == 0) _exit(0); } _exit(0); } diff --git a/src/sv.c b/src/sv.c index 06b2e41..db0bd1d 100644 --- a/src/sv.c +++ b/src/sv.c _at_@ -26,6 +26,7 @@ #define RUN "run: " #define FINISH "finish: " #define DOWN "down: " +#define WAIT "wait: " #define TIMEOUT "timeout: " #define KILL "kill: " _at_@ -132,9 +133,10 @@ unsigned int svstatus_print(char *m) { case 0: outs(DOWN); break; case 1: outs(RUN); break; case 2: outs(FINISH); break; + case 3: outs(WAIT); break; } outs(m); outs(": "); - if (svstatus[19]) { + if (pid) { outs("(pid "); sulong[fmt_ulong(sulong, pid)] =0; outs(sulong); outs(") "); } _at_@ -146,6 +148,7 @@ unsigned int svstatus_print(char *m) { if (pid && svstatus[16]) outs(", paused"); if (!pid && (svstatus[17] == 'u')) outs(", want up"); if (pid && (svstatus[17] == 'd')) outs(", want down"); + if (svstatus[19] == 3) outs(", want exit"); if (pid && svstatus[18]) outs(", got TERM"); return(pid ? 1 : 2); }Received on Fri Aug 01 2014 - 05:32:16 UTC
This archive was generated by hypermail 2.3.0 : Sun May 09 2021 - 19:44:18 UTC