about summary refs log tree commit diff
path: root/src/skaembutils/s6-pause.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/skaembutils/s6-pause.c')
-rw-r--r--src/skaembutils/s6-pause.c43
1 files changed, 42 insertions, 1 deletions
diff --git a/src/skaembutils/s6-pause.c b/src/skaembutils/s6-pause.c
index 8eafdce..acb1f41 100644
--- a/src/skaembutils/s6-pause.c
+++ b/src/skaembutils/s6-pause.c
@@ -1,9 +1,50 @@
 /* ISC license. */
 
 #include <unistd.h>
+#include <signal.h>
+#include <skalibs/uint.h>
+#include <skalibs/sgetopt.h>
+#include <skalibs/strerr2.h>
+#include <skalibs/sig.h>
 
-int main ()
+#define USAGE "s6-pause [ -t ] [ -h ] [ -a ] [ -q ] [ -b ] [ -i ] [ -p signal,signal... ]"
+#define dieusage() strerr_dieusage(100, USAGE)
+
+#define MAX 64
+
+int main (int argc, char const *const *argv)
 {
+  PROG = "s6-pause" ;
+  unsigned int sigs[MAX] ;
+  unsigned int nsig = 0 ;
+  {
+    subgetopt_t l = SUBGETOPT_ZERO ;
+    for (;;)
+    {
+      register int opt = subgetopt_r(argc, argv, "thaqbip:", &l) ;
+      if (opt == -1) break ;
+      switch (opt)
+      {
+        case 't' : if (nsig >= MAX) dieusage() ; sigs[nsig++] = SIGTERM ;
+        case 'h' : if (nsig >= MAX) dieusage() ; sigs[nsig++] = SIGHUP ;
+        case 'a' : if (nsig >= MAX) dieusage() ; sigs[nsig++] = SIGALRM ;
+        case 'q' : if (nsig >= MAX) dieusage() ; sigs[nsig++] = SIGQUIT ;
+        case 'b' : if (nsig >= MAX) dieusage() ; sigs[nsig++] = SIGABRT ;
+        case 'i' : if (nsig >= MAX) dieusage() ; sigs[nsig++] = SIGINT ;
+        case 'p' :
+        {
+          unsigned int n ;
+          if (!uint_scanlist(sigs + nsig, MAX - nsig, l.arg, &n)) dieusage() ;
+          nsig += n ;
+          break ;
+        }
+        default : dieusage() ;
+      }
+    }
+    argc -= l.ind ; argv += l.ind ;
+  }
+
+  while (nsig--) sig_ignore(sigs[nsig]) ;
   pause() ;
   return 0 ;
 }