--- src/include/s6/s6-supervise.h | 6 ++++-- src/libs6/s6_svstatus_pack.c | 3 ++- src/libs6/s6_svstatus_unpack.c | 4 ++++ src/supervision/s6-supervise.c | 13 +++++++------ src/supervision/s6-svstat.c | 20 +++++++++++++++++++- 5 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/include/s6/s6-supervise.h b/src/include/s6/s6-supervise.h index c8d72d7..f2b64d8 100644 --- a/src/include/s6/s6-supervise.h +++ b/src/include/s6/s6-supervise.h _at_@ -10,7 +10,7 @@ #define S6_SVSCAN_CTLDIR ".s6-svscan" #define S6_SVSTATUS_FILENAME S6_SUPERVISE_CTLDIR "/status" #define S6_SUPERVISE_READY_FILENAME S6_SUPERVISE_CTLDIR "/ready" -#define S6_SVSTATUS_SIZE 18 +#define S6_SVSTATUS_SIZE 22 extern int s6_svc_write (char const *, char const *, unsigned int) ; extern int s6_svc_main (int, char const *const *, char const *, char const *, char const *) ; _at_@ -24,9 +24,11 @@ struct s6_svstatus_s unsigned int flagwantup : 1 ; unsigned int flagpaused : 1 ; unsigned int flagfinishing : 1 ; + unsigned int felldown : 1 ; + unsigned int wstat ; } ; -#define S6_SVSTATUS_ZERO { .stamp = TAIN_ZERO, .pid = 0, .flagwant = 0, .flagwantup = 0, .flagpaused = 0, .flagfinishing = 0 } +#define S6_SVSTATUS_ZERO { .stamp = TAIN_ZERO, .pid = 0, .flagwant = 0, .flagwantup = 0, .flagpaused = 0, .flagfinishing = 0, .felldown = 0, .wstat = 0 } extern void s6_svstatus_pack (char *, s6_svstatus_t const *) ; diff --git a/src/libs6/s6_svstatus_pack.c b/src/libs6/s6_svstatus_pack.c index 2d5baf6..bebbcf9 100644 --- a/src/libs6/s6_svstatus_pack.c +++ b/src/libs6/s6_svstatus_pack.c _at_@ -8,6 +8,7 @@ void s6_svstatus_pack (char *pack, s6_svstatus_t const *sv) { tain_pack(pack, &sv->stamp) ; uint32_pack(pack + 12, (uint32)sv->pid) ; - pack[16] = sv->flagpaused | (sv->flagfinishing << 1) ; + pack[16] = sv->flagpaused | (sv->flagfinishing << 1) | (sv->felldown << 2) ; pack[17] = sv->flagwant ? sv->flagwantup ? 'u' : 'd' : 0 ; + uint32_pack(pack + 18, (uint32)sv->wstat) ; } diff --git a/src/libs6/s6_svstatus_unpack.c b/src/libs6/s6_svstatus_unpack.c index cce6989..d7aac26 100644 --- a/src/libs6/s6_svstatus_unpack.c +++ b/src/libs6/s6_svstatus_unpack.c _at_@ -7,11 +7,13 @@ void s6_svstatus_unpack (char const *pack, s6_svstatus_t_ref sv) { uint32 pid ; + uint32 wstat ; tain_unpack(pack, &sv->stamp) ; uint32_unpack(pack + 12, &pid) ; sv->pid = (int)pid ; sv->flagpaused = pack[16] & 1 ; sv->flagfinishing = (pack[16] >> 1) & 1 ; + sv->felldown = (pack[16] >> 2) & 1 ; switch (pack[17]) { case 'u' : _at_@ -26,4 +28,6 @@ void s6_svstatus_unpack (char const *pack, s6_svstatus_t_ref sv) sv->flagwant = 0 ; sv->flagwantup = 0 ; } + uint32_unpack(pack + 18, &wstat) ; + sv->wstat = (int)wstat ; } diff --git a/src/supervision/s6-supervise.c b/src/supervision/s6-supervise.c index 1ea45d0..3776be6 100644 --- a/src/supervision/s6-supervise.c +++ b/src/supervision/s6-supervise.c _at_@ -192,6 +192,7 @@ static void trystart (void) settimeout_infinite() ; state = UP ; status.pid = pid ; + status.felldown = 0 ; tain_copynow(&status.stamp) ; announce() ; ftrigw_notify(S6_SUPERVISE_EVENTDIR, 'u') ; _at_@ -230,7 +231,7 @@ static void down_d (void) announce() ; } -static void tryfinish (int wstat, int islast) +static void tryfinish (int islast) { register pid_t pid = fork() ; if (pid < 0) _at_@ -248,8 +249,8 @@ static void tryfinish (int wstat, int islast) char fmt1[UINT_FMT] ; char *cargv[4] = { "finish", fmt0, fmt1, 0 } ; selfpipe_finish() ; - fmt0[uint_fmt(fmt0, WIFSIGNALED(wstat) ? 256 : WEXITSTATUS(wstat))] = 0 ; - fmt1[uint_fmt(fmt1, WTERMSIG(wstat))] = 0 ; + fmt0[uint_fmt(fmt0, WIFSIGNALED(status.wstat) ? 256 : WEXITSTATUS(status.wstat))] = 0 ; + fmt1[uint_fmt(fmt1, WTERMSIG(status.wstat))] = 0 ; if (flagsetsid) setsid() ; execve("./finish", cargv, (char *const *)environ) ; _exit(111) ; _at_@ -268,14 +269,14 @@ static void uptimeout (void) static void uplastup_z (int islast) { - int wstat = status.pid ; status.pid = 0 ; + status.felldown = 1 ; tain_copynow(&status.stamp) ; announce() ; ftrigw_notify(S6_SUPERVISE_EVENTDIR, 'd') ; if (unlink(S6_SUPERVISE_READY_FILENAME) < 0 && errno != ENOENT) strerr_warnwu1sys("unlink " S6_SUPERVISE_READY_FILENAME) ; - tryfinish(wstat, islast) ; + tryfinish(islast) ; } static void up_z (void) _at_@ -401,7 +402,7 @@ static void handle_signals (void) if (errno != ECHILD) strerr_diefu1sys(111, "wait_pid_nohang") ; else break ; else if (!r) break ; - status.pid = wstat ; + if (!status.flagfinishing) status.wstat = wstat ; (*actions[state][V_CHLD])() ; } break ; diff --git a/src/supervision/s6-svstat.c b/src/supervision/s6-svstat.c index bc27c32..b98e69e 100644 --- a/src/supervision/s6-svstat.c +++ b/src/supervision/s6-svstat.c _at_@ -60,7 +60,25 @@ int main (int argc, char const *const *argv) if (ready) buffer_putnoflush(buffer_1small,"; ready", 7) ; buffer_putnoflush(buffer_1small, ") ", 2) ; } - else buffer_putnoflush(buffer_1small, "down ", 5) ; + else + { + buffer_putnoflush(buffer_1small, "down ", 5) ; + if (status.felldown) + { + buffer_putnoflush(buffer_1small, "(", 1) ; + if (WIFSIGNALED(status.wstat)) + { + buffer_putnoflush(buffer_1small, "signal=", 7) ; + buffer_putnoflush(buffer_1small, fmt, uint_fmt(fmt, WTERMSIG(status.wstat))) ; + } + else + { + buffer_putnoflush(buffer_1small, "rc=", 3) ; + buffer_putnoflush(buffer_1small, fmt, uint_fmt(fmt, WEXITSTATUS(status.wstat))) ; + } + buffer_putnoflush(buffer_1small, ") ", 2) ; + } + } buffer_putnoflush(buffer_1small, fmt, uint64_fmt(fmt, status.stamp.sec.x)) ; buffer_putnoflush(buffer_1small," seconds", 8) ; -- 2.2.2Received on Sun Jan 18 2015 - 20:13:57 UTC
This archive was generated by hypermail 2.3.0 : Sun May 09 2021 - 19:44:19 UTC