aboutsummaryrefslogtreecommitdiff
path: root/libbb
diff options
context:
space:
mode:
Diffstat (limited to 'libbb')
-rw-r--r--libbb/bb_askpass.c4
-rw-r--r--libbb/signals.c28
2 files changed, 29 insertions, 3 deletions
diff --git a/libbb/bb_askpass.c b/libbb/bb_askpass.c
index fd12f92dc..3ad0e97cd 100644
--- a/libbb/bb_askpass.c
+++ b/libbb/bb_askpass.c
@@ -45,7 +45,7 @@ char *bb_askpass(int timeout, const char *prompt)
45 sa.sa_handler = askpass_timeout; 45 sa.sa_handler = askpass_timeout;
46 sigaction(SIGINT, &sa, &oldsa); 46 sigaction(SIGINT, &sa, &oldsa);
47 if (timeout) { 47 if (timeout) {
48 sigaction(SIGALRM, &sa, NULL); 48 sigaction_set(SIGALRM, &sa);
49 alarm(timeout); 49 alarm(timeout);
50 } 50 }
51 51
@@ -68,7 +68,7 @@ char *bb_askpass(int timeout, const char *prompt)
68 if (timeout) { 68 if (timeout) {
69 alarm(0); 69 alarm(0);
70 } 70 }
71 sigaction(SIGINT, &oldsa, NULL); 71 sigaction_set(SIGINT, &oldsa);
72 72
73 tcsetattr(STDIN_FILENO, TCSANOW, &oldtio); 73 tcsetattr(STDIN_FILENO, TCSANOW, &oldtio);
74 bb_putchar('\n'); 74 bb_putchar('\n');
diff --git a/libbb/signals.c b/libbb/signals.c
index a327e87c8..719beab63 100644
--- a/libbb/signals.c
+++ b/libbb/signals.c
@@ -11,6 +11,12 @@
11 11
12#include "libbb.h" 12#include "libbb.h"
13 13
14/* Saves 2 bytes on x86! Oh my... */
15int sigaction_set(int signum, const struct sigaction *act)
16{
17 return sigaction(signum, act, NULL);
18}
19
14void bb_signals(int sigs, void (*f)(int)) 20void bb_signals(int sigs, void (*f)(int))
15{ 21{
16 int sig_no = 0; 22 int sig_no = 0;
@@ -40,7 +46,7 @@ void bb_signals_recursive(int sigs, void (*f)(int))
40 while (sigs) { 46 while (sigs) {
41 if (sigs & bit) { 47 if (sigs & bit) {
42 sigs &= ~bit; 48 sigs &= ~bit;
43 sigaction(sig_no, &sa, NULL); 49 sigaction_set(sig_no, &sa);
44 } 50 }
45 sig_no++; 51 sig_no++;
46 bit <<= 1; 52 bit <<= 1;
@@ -87,3 +93,23 @@ void kill_myself_with_sig(int sig)
87 raise(sig); 93 raise(sig);
88 _exit(1); /* Should not reach it */ 94 _exit(1); /* Should not reach it */
89} 95}
96
97void signal_SA_RESTART_empty_mask(int sig, void (*handler)(int))
98{
99 struct sigaction sa;
100 memset(&sa, 0, sizeof(sa));
101 /*sigemptyset(&sa.sa_mask);*/
102 sa.sa_flags = SA_RESTART;
103 sa.sa_handler = handler;
104 sigaction_set(sig, &sa);
105}
106
107void signal_no_SA_RESTART_empty_mask(int sig, void (*handler)(int))
108{
109 struct sigaction sa;
110 memset(&sa, 0, sizeof(sa));
111 /*sigemptyset(&sa.sa_mask);*/
112 /*sa.sa_flags = 0;*/
113 sa.sa_handler = handler;
114 sigaction_set(sig, &sa);
115}