nc: remove a bit of bloat
[oweals/busybox.git] / libbb / signals.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * Utility routines.
4  *
5  * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
6  * Copyright (C) 2006 Rob Landley
7  * Copyright (C) 2006 Denys Vlasenko
8  *
9  * Licensed under GPL version 2, see file LICENSE in this tarball for details.
10  */
11
12 #include "libbb.h"
13
14 void bb_signals(int sigs, void (*f)(int))
15 {
16         int sig_no = 0;
17         int bit = 1;
18
19         while (sigs) {
20                 if (sigs & bit) {
21                         sigs &= ~bit;
22                         signal(sig_no, f);
23                 }
24                 sig_no++;
25                 bit <<= 1;
26         }
27 }
28
29 void bb_signals_recursive(int sigs, void (*f)(int))
30 {
31         int sig_no = 0;
32         int bit = 1;
33         struct sigaction sa;
34
35         memset(&sa, 0, sizeof(sa));
36         sa.sa_handler = f;
37         /*sa.sa_flags = 0;*/
38         /*sigemptyset(&sa.sa_mask); - hope memset did it*/
39
40         while (sigs) {
41                 if (sigs & bit) {
42                         sigs &= ~bit;
43                         sigaction(sig_no, &sa, NULL);
44                 }
45                 sig_no++;
46                 bit <<= 1;
47         }
48 }
49
50 void sig_block(int sig)
51 {
52         sigset_t ss;
53         sigemptyset(&ss);
54         sigaddset(&ss, sig);
55         sigprocmask(SIG_BLOCK, &ss, NULL);
56 }
57
58 void sig_unblock(int sig)
59 {
60         sigset_t ss;
61         sigemptyset(&ss);
62         sigaddset(&ss, sig);
63         sigprocmask(SIG_UNBLOCK, &ss, NULL);
64 }
65
66 #if 0
67 void sig_blocknone(void)
68 {
69         sigset_t ss;
70         sigemptyset(&ss);
71         sigprocmask(SIG_SETMASK, &ss, NULL);
72 }
73 #endif
74
75 void sig_pause(void)
76 {
77         sigset_t ss;
78         sigemptyset(&ss);
79         sigsuspend(&ss);
80 }
81
82 /* Assuming the sig is fatal */
83 void kill_myself_with_sig(int sig)
84 {
85         signal(sig, SIG_DFL);
86         sig_unblock(sig);
87         raise(sig);
88         _exit(1); /* Should not reach it */
89 }