about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2015-03-06 19:36:09 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2015-03-06 19:36:09 +0000
commit5d169a719b1614774a86b837b4bc9a7c41fa1110 (patch)
tree298e298f76ed1f2560c8d392b6a26bf7baa75143 /src
parentc8edbcd86c1f4157e3998fb0d81c9a576b0f1f0a (diff)
downloads6-portable-utils-5d169a719b1614774a86b837b4bc9a7c41fa1110.tar.gz
s6-portable-utils-5d169a719b1614774a86b837b4bc9a7c41fa1110.tar.xz
s6-portable-utils-5d169a719b1614774a86b837b4bc9a7c41fa1110.zip
- Added new options to s6-pause v2.0.4.0
 - version: 2.0.4.0
Diffstat (limited to 'src')
-rw-r--r--src/skaembutils/deps-exe/s6-pause1
-rw-r--r--src/skaembutils/s6-pause.c43
2 files changed, 43 insertions, 1 deletions
diff --git a/src/skaembutils/deps-exe/s6-pause b/src/skaembutils/deps-exe/s6-pause
index e69de29..e7187fe 100644
--- a/src/skaembutils/deps-exe/s6-pause
+++ b/src/skaembutils/deps-exe/s6-pause
@@ -0,0 +1 @@
+-lskarnet
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 ;
 }