about summary refs log tree commit diff
path: root/src/supervision
diff options
context:
space:
mode:
Diffstat (limited to 'src/supervision')
-rw-r--r--src/supervision/s6-svscan.c45
1 files changed, 33 insertions, 12 deletions
diff --git a/src/supervision/s6-svscan.c b/src/supervision/s6-svscan.c
index 91c9f14..8f1665e 100644
--- a/src/supervision/s6-svscan.c
+++ b/src/supervision/s6-svscan.c
@@ -229,6 +229,7 @@ static void handle_signals (unsigned int *what)
   for (;;)
   {
     int sig = selfpipe_read() ;
+    LOLDEBUG("handle_signals: got %d (%s%s)", sig, sig ? "SIG" : "", sig ? sig_name(sig) : "done") ;
     switch (sig)
     {
       case -1 : panic("selfpipe_read") ;
@@ -238,22 +239,25 @@ static void handle_signals (unsigned int *what)
       case SIGABRT : abrt() ; break ;
       default :
       {
+        int usebuiltin = 1 ;
         char const *name = sig_name(sig) ;
         size_t len = strlen(name) ;
         char fn[SIGNAL_PROG_LEN + len + 1] ;
         char const *const newargv[2] = { fn, 0 } ;
         memcpy(fn, SIGNAL_PROG, SIGNAL_PROG_LEN) ;
         memcpy(fn + SIGNAL_PROG_LEN, name, len + 1) ;
-        if (!child_spawn0(newargv[0], newargv, (char const **)environ))
+        if (access(newargv[0], X_OK) == 0)  /* avoids a fork, don't care about the toctou */
         {
-          if (errno != ENOENT) strerr_warnwu2sys("spawn ", newargv[0]) ;
-          switch (sig)
-          {
-            case SIGHUP : hup(what) ; break ;
-            case SIGINT :
-            case SIGTERM : term(what) ; break ;
-            case SIGQUIT : quit(what) ; break ;
-          }
+          LOLDEBUG("handle_signals: spawning custom handler for SIG%s", sig_name(sig)) ;
+          if (child_spawn0(newargv[0], newargv, (char const **)environ)) usebuiltin = 0 ;
+          else if (errno != ENOENT) strerr_warnwu2sys("spawn ", newargv[0]) ;
+        }
+        if (usebuiltin) switch (sig)
+        {
+          case SIGHUP : hup(what) ; break ;
+          case SIGINT :
+          case SIGTERM : term(what) ; break ;
+          case SIGQUIT : quit(what) ; break ;
         }
       }
     }
@@ -269,7 +273,8 @@ static void handle_control (int fd, unsigned int *what)
     ssize_t r = sanitize_read(fd_read(fd, &c, 1)) ;
     if (r < 0) panic("read control pipe") ;
     else if (!r) break ;
-    else switch (c)
+    LOLDEBUG("handle_control: got '%c'", c) ;
+    switch (c)
     {
       case 'z' : chld(what) ; break ;
       case 'a' : alrm() ; break ;
@@ -543,7 +548,6 @@ static void scan (void)
     uint32_t n = genset_n(services) - avltreen_len(by_devino) ;
     if (n) genset_iter(services, &remove_deadinactive_iter, &n) ;
   }
-  LOLDEBUG("scan: end") ;
 }
 
 
@@ -755,8 +759,25 @@ int main (int argc, char const *const *argv)
     {
       int r ;
       tain deadline = scan_deadline ;
-      LOLDEBUG("loop") ;
       tain_earliest1(&deadline, &start_deadline) ;
+#ifdef DEBUG
+      {
+        int ms = 0 ;
+        unsigned int flag = 0 ;
+        if (tain_future(&deadline))
+        {
+          tain t ;
+          tain_sub(&t, &deadline, &STAMP) ;
+          ms = tain_to_millisecs(&t) ;
+        }
+        else
+        {
+          if (!tain_future(&scan_deadline)) flag |= 1 ;
+          if (!tain_future(&start_deadline)) flag |= 2 ;
+        }
+        LOLDEBUG("loop: %d ms%s%s", ms, flag & 1 ? ", scan" : "", flag & 2 ? ", start" : "") ;
+      }
+#endif
       r = iopause_g(x, 2, &deadline) ;
       if (r < 0) panic("iopause") ;
       else if (!r)