---
 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.2
Received 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