diff options
Diffstat (limited to 'src/skaembutils/s6-pause.c')
-rw-r--r-- | src/skaembutils/s6-pause.c | 43 |
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 ; } |