aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2008-03-12 23:19:35 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2008-03-12 23:19:35 +0000
commit8e2cfec1cdf34068f2378aae9fe8f5ec0f821e21 (patch)
treecf328e6b8bbdc608228da528f661124e364edb85
parent4cf1d08fc2e50f9abda999d468c5e972ff4995c2 (diff)
downloadbusybox-w32-8e2cfec1cdf34068f2378aae9fe8f5ec0f821e21.tar.gz
busybox-w32-8e2cfec1cdf34068f2378aae9fe8f5ec0f821e21.tar.bz2
busybox-w32-8e2cfec1cdf34068f2378aae9fe8f5ec0f821e21.zip
libbb: introduse and use signal_[no_]SA_RESTART_empty_mask and sigaction_set
signal_SA_RESTART_empty_mask - 65 +65 signal_no_SA_RESTART_empty_mask - 54 +54 dd_main 1325 1369 +44 sigaction_set - 19 +19 dname_enc 373 377 +4 UNSPEC_print 64 66 +2 setsignal 296 294 -2 bb_signals_recursive 95 92 -3 bb_askpass 367 361 -6 inetd_main 1810 1797 -13 rx_main 912 883 -29 sigdelset 32 - -32 __sigdelset 32 - -32 __GI_sigdelset 32 - -32 sighup_handler 84 37 -47 arping_main 1844 1797 -47 fsck_main 1869 1807 -62 run_list 1917 1844 -73 vlock_main 492 409 -83 progressmeter 883 798 -85 handle_incoming_and_exit 2737 2651 -86 ------------------------------------------------------------------------------ (add/remove: 3/3 grow/shrink: 3/12 up/down: 188/-632) Total: -444 bytes
-rw-r--r--coreutils/dd.c9
-rw-r--r--e2fsprogs/fsck.c7
-rw-r--r--include/libbb.h7
-rw-r--r--libbb/bb_askpass.c4
-rw-r--r--libbb/signals.c28
-rw-r--r--loginutils/vlock.c15
-rw-r--r--miscutils/devfsd.c4
-rw-r--r--miscutils/rx.c5
-rw-r--r--networking/arping.c14
-rw-r--r--networking/httpd.c15
-rw-r--r--networking/inetd.c12
-rw-r--r--networking/wget.c9
-rw-r--r--shell/ash.c2
-rw-r--r--shell/hush.c12
14 files changed, 60 insertions, 83 deletions
diff --git a/coreutils/dd.c b/coreutils/dd.c
index 961b1fff7..f3330e624 100644
--- a/coreutils/dd.c
+++ b/coreutils/dd.c
@@ -121,9 +121,6 @@ int dd_main(int argc, char **argv)
121 off_t count; 121 off_t count;
122 off_t seek, skip; 122 off_t seek, skip;
123 const char *infile, *outfile; 123 const char *infile, *outfile;
124#if ENABLE_FEATURE_DD_SIGNAL_HANDLING
125 struct sigaction sigact;
126#endif
127 } Z; 124 } Z;
128#define flags (Z.flags ) 125#define flags (Z.flags )
129#define oc (Z.oc ) 126#define oc (Z.oc )
@@ -132,17 +129,13 @@ int dd_main(int argc, char **argv)
132#define skip (Z.skip ) 129#define skip (Z.skip )
133#define infile (Z.infile ) 130#define infile (Z.infile )
134#define outfile (Z.outfile) 131#define outfile (Z.outfile)
135#define sigact (Z.sigact )
136 132
137 memset(&Z, 0, sizeof(Z)); 133 memset(&Z, 0, sizeof(Z));
138 INIT_G(); 134 INIT_G();
139 //fflush(NULL); - is this needed because of NOEXEC? 135 //fflush(NULL); - is this needed because of NOEXEC?
140 136
141#if ENABLE_FEATURE_DD_SIGNAL_HANDLING 137#if ENABLE_FEATURE_DD_SIGNAL_HANDLING
142 sigact.sa_handler = dd_output_status; 138 signal_SA_RESTART_empty_mask(SIGUSR1, dd_output_status);
143 sigact.sa_flags = SA_RESTART;
144 /*sigemptyset(&sigact.sa_mask); - memset did it */
145 sigaction(SIGUSR1, &sigact, NULL);
146#endif 139#endif
147 140
148 for (n = 1; n < argc; n++) { 141 for (n = 1; n < argc; n++) {
diff --git a/e2fsprogs/fsck.c b/e2fsprogs/fsck.c
index de2d61eef..037a563f4 100644
--- a/e2fsprogs/fsck.c
+++ b/e2fsprogs/fsck.c
@@ -1164,12 +1164,9 @@ int fsck_main(int argc, char **argv)
1164 int interactive; 1164 int interactive;
1165 const char *fstab; 1165 const char *fstab;
1166 struct fs_info *fs; 1166 struct fs_info *fs;
1167 struct sigaction sa;
1168 1167
1169 memset(&sa, 0, sizeof(sa)); 1168 signal_no_SA_RESTART_empty_mask(SIGINT, signal_cancel);
1170 sa.sa_handler = signal_cancel; 1169 signal_no_SA_RESTART_empty_mask(SIGTERM, signal_cancel);
1171 sigaction(SIGINT, &sa, NULL);
1172 sigaction(SIGTERM, &sa, NULL);
1173 1170
1174 setbuf(stdout, NULL); 1171 setbuf(stdout, NULL);
1175 1172
diff --git a/include/libbb.h b/include/libbb.h
index 3c53e5e68..505396b86 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -275,6 +275,7 @@ char *xrealloc_getcwd_or_warn(char *cwd);
275 275
276char *xmalloc_follow_symlinks(const char *path); 276char *xmalloc_follow_symlinks(const char *path);
277 277
278
278enum { 279enum {
279 /* bb_signals(BB_SIGS_FATAL, handler) catches all signals which 280 /* bb_signals(BB_SIGS_FATAL, handler) catches all signals which
280 * otherwise would kill us, except for those resulting from bugs: 281 * otherwise would kill us, except for those resulting from bugs:
@@ -306,6 +307,12 @@ void bb_signals(int sigs, void (*f)(int));
306 * and in a way that while signal handler is run, no other signals 307 * and in a way that while signal handler is run, no other signals
307 * will be blocked: */ 308 * will be blocked: */
308void bb_signals_recursive(int sigs, void (*f)(int)); 309void bb_signals_recursive(int sigs, void (*f)(int));
310/* syscalls like read() will be interrupted with EINTR: */
311void signal_no_SA_RESTART_empty_mask(int sig, void (*handler)(int));
312/* syscalls like read() won't be interrupted (though select/poll will be): */
313void signal_SA_RESTART_empty_mask(int sig, void (*handler)(int));
314/* Will do sigaction(signum, act, NULL): */
315int sigaction_set(int signum, const struct sigaction *act);
309void sig_block(int); 316void sig_block(int);
310void sig_unblock(int); 317void sig_unblock(int);
311/* UNUSED: void sig_blocknone(void); */ 318/* UNUSED: void sig_blocknone(void); */
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}
diff --git a/loginutils/vlock.c b/loginutils/vlock.c
index 846733ea8..ff60d78ff 100644
--- a/loginutils/vlock.c
+++ b/loginutils/vlock.c
@@ -34,7 +34,6 @@ static void acquire_vt(int signo)
34int vlock_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 34int vlock_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
35int vlock_main(int argc, char **argv) 35int vlock_main(int argc, char **argv)
36{ 36{
37 struct sigaction sa;
38 struct vt_mode vtm; 37 struct vt_mode vtm;
39 struct termios term; 38 struct termios term;
40 struct termios oterm; 39 struct termios oterm;
@@ -63,17 +62,11 @@ int vlock_main(int argc, char **argv)
63 62
64 /* We will use SIGUSRx for console switch control: */ 63 /* We will use SIGUSRx for console switch control: */
65 /* 1: set handlers */ 64 /* 1: set handlers */
66 sigemptyset(&sa.sa_mask); 65 signal_SA_RESTART_empty_mask(SIGUSR1, release_vt);
67 sa.sa_flags = SA_RESTART; 66 signal_SA_RESTART_empty_mask(SIGUSR2, acquire_vt);
68 sa.sa_handler = release_vt;
69 sigaction(SIGUSR1, &sa, NULL);
70 sa.sa_handler = acquire_vt;
71 sigaction(SIGUSR2, &sa, NULL);
72 /* 2: unmask them */ 67 /* 2: unmask them */
73 sigprocmask(SIG_SETMASK, NULL, &sa.sa_mask); 68 sig_unblock(SIGUSR1);
74 sigdelset(&sa.sa_mask, SIGUSR1); 69 sig_unblock(SIGUSR2);
75 sigdelset(&sa.sa_mask, SIGUSR2);
76 sigprocmask(SIG_SETMASK, &sa.sa_mask, NULL);
77 70
78 /* Revert stdin/out to our controlling tty 71 /* Revert stdin/out to our controlling tty
79 * (or die if we have none) */ 72 * (or die if we have none) */
diff --git a/miscutils/devfsd.c b/miscutils/devfsd.c
index 50c8203cb..1b88f050e 100644
--- a/miscutils/devfsd.c
+++ b/miscutils/devfsd.c
@@ -390,8 +390,8 @@ int devfsd_main(int argc, char **argv)
390 sigemptyset(&new_action.sa_mask); 390 sigemptyset(&new_action.sa_mask);
391 new_action.sa_flags = 0; 391 new_action.sa_flags = 0;
392 new_action.sa_handler = signal_handler; 392 new_action.sa_handler = signal_handler;
393 sigaction(SIGHUP, &new_action, NULL); 393 sigaction_set(SIGHUP, &new_action);
394 sigaction(SIGUSR1, &new_action, NULL); 394 sigaction_set(SIGUSR1, &new_action);
395 395
396 printf("%s v%s started for %s\n", applet_name, DEVFSD_VERSION, mount_point); 396 printf("%s v%s started for %s\n", applet_name, DEVFSD_VERSION, mount_point);
397 397
diff --git a/miscutils/rx.c b/miscutils/rx.c
index 9a8fcaa20..48867b83c 100644
--- a/miscutils/rx.c
+++ b/miscutils/rx.c
@@ -220,7 +220,6 @@ static void sigalrm_handler(int ATTRIBUTE_UNUSED signum)
220int rx_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 220int rx_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
221int rx_main(int argc, char **argv) 221int rx_main(int argc, char **argv)
222{ 222{
223 struct sigaction act;
224 struct termios tty, orig_tty; 223 struct termios tty, orig_tty;
225 int termios_err; 224 int termios_err;
226 int file_fd; 225 int file_fd;
@@ -243,9 +242,7 @@ int rx_main(int argc, char **argv)
243 } 242 }
244 243
245 /* No SA_RESTART: we want ALRM to interrupt read() */ 244 /* No SA_RESTART: we want ALRM to interrupt read() */
246 memset(&act, 0, sizeof(act)); 245 signal_no_SA_RESTART_empty_mask(SIGALRM, sigalrm_handler);
247 act.sa_handler = sigalrm_handler;
248 sigaction(SIGALRM, &act, NULL);
249 246
250 n = receive(file_fd); 247 n = receive(file_fd);
251 248
diff --git a/networking/arping.c b/networking/arping.c
index c89b97567..2277ec55e 100644
--- a/networking/arping.c
+++ b/networking/arping.c
@@ -377,18 +377,8 @@ int arping_main(int argc, char **argv)
377 printf(" from %s via %s\n", inet_ntoa(src), device); 377 printf(" from %s via %s\n", inet_ntoa(src), device);
378 } 378 }
379 379
380 { 380 signal_SA_RESTART_empty_mask(SIGINT, (void (*)(int))finish);
381 struct sigaction sa; 381 signal_SA_RESTART_empty_mask(SIGALRM, (void (*)(int))catcher);
382
383 memset(&sa, 0, sizeof(sa));
384 sa.sa_flags = SA_RESTART;
385
386 sa.sa_handler = (void (*)(int)) finish;
387 sigaction(SIGINT, &sa, NULL);
388
389 sa.sa_handler = (void (*)(int)) catcher;
390 sigaction(SIGALRM, &sa, NULL);
391 }
392 382
393 catcher(); 383 catcher();
394 384
diff --git a/networking/httpd.c b/networking/httpd.c
index e9137287c..7b7446ed9 100644
--- a/networking/httpd.c
+++ b/networking/httpd.c
@@ -1788,7 +1788,6 @@ static void handle_incoming_and_exit(const len_and_sockaddr *fromAddr)
1788 char *header_ptr = header_ptr; 1788 char *header_ptr = header_ptr;
1789 Htaccess_Proxy *proxy_entry; 1789 Htaccess_Proxy *proxy_entry;
1790#endif 1790#endif
1791 struct sigaction sa;
1792#if ENABLE_FEATURE_HTTPD_BASIC_AUTH 1791#if ENABLE_FEATURE_HTTPD_BASIC_AUTH
1793 int credentials = -1; /* if not required this is Ok */ 1792 int credentials = -1; /* if not required this is Ok */
1794#endif 1793#endif
@@ -1819,11 +1818,7 @@ static void handle_incoming_and_exit(const len_and_sockaddr *fromAddr)
1819 } 1818 }
1820 1819
1821 /* Install timeout handler */ 1820 /* Install timeout handler */
1822 memset(&sa, 0, sizeof(sa)); 1821 signal_no_SA_RESTART_empty_mask(SIGALRM, exit_on_signal);
1823 sa.sa_handler = exit_on_signal;
1824 /* sigemptyset(&sa.sa_mask); - memset should be enough */
1825 /*sa.sa_flags = 0; - no SA_RESTART */
1826 sigaction(SIGALRM, &sa, NULL);
1827 alarm(HEADER_READ_TIMEOUT); 1822 alarm(HEADER_READ_TIMEOUT);
1828 1823
1829 if (!get_line()) /* EOF or error or empty line */ 1824 if (!get_line()) /* EOF or error or empty line */
@@ -2247,15 +2242,9 @@ static void mini_httpd_inetd(void)
2247#if ENABLE_FEATURE_HTTPD_RELOAD_CONFIG_SIGHUP 2242#if ENABLE_FEATURE_HTTPD_RELOAD_CONFIG_SIGHUP
2248static void sighup_handler(int sig) 2243static void sighup_handler(int sig)
2249{ 2244{
2250 struct sigaction sa;
2251
2252 parse_conf(default_path_httpd_conf, sig == SIGHUP ? SIGNALED_PARSE : FIRST_PARSE); 2245 parse_conf(default_path_httpd_conf, sig == SIGHUP ? SIGNALED_PARSE : FIRST_PARSE);
2253 2246
2254 memset(&sa, 0, sizeof(sa)); 2247 signal_SA_RESTART_empty_mask(SIGHUP, sighup_handler);
2255 sa.sa_handler = sighup_handler;
2256 /*sigemptyset(&sa.sa_mask); - memset should be enough */
2257 sa.sa_flags = SA_RESTART;
2258 sigaction(SIGHUP, &sa, NULL);
2259} 2248}
2260#endif 2249#endif
2261 2250
diff --git a/networking/inetd.c b/networking/inetd.c
index 463c7cfcf..196f6d29d 100644
--- a/networking/inetd.c
+++ b/networking/inetd.c
@@ -1179,15 +1179,15 @@ int inetd_main(int argc, char **argv)
1179 sigaddset(&sa.sa_mask, SIGCHLD); 1179 sigaddset(&sa.sa_mask, SIGCHLD);
1180 sigaddset(&sa.sa_mask, SIGHUP); 1180 sigaddset(&sa.sa_mask, SIGHUP);
1181 sa.sa_handler = retry_network_setup; 1181 sa.sa_handler = retry_network_setup;
1182 sigaction(SIGALRM, &sa, NULL); 1182 sigaction_set(SIGALRM, &sa);
1183 sa.sa_handler = reread_config_file; 1183 sa.sa_handler = reread_config_file;
1184 sigaction(SIGHUP, &sa, NULL); 1184 sigaction_set(SIGHUP, &sa);
1185 sa.sa_handler = reap_child; 1185 sa.sa_handler = reap_child;
1186 sigaction(SIGCHLD, &sa, NULL); 1186 sigaction_set(SIGCHLD, &sa);
1187 sa.sa_handler = clean_up_and_exit; 1187 sa.sa_handler = clean_up_and_exit;
1188 sigaction(SIGTERM, &sa, NULL); 1188 sigaction_set(SIGTERM, &sa);
1189 sa.sa_handler = clean_up_and_exit; 1189 sa.sa_handler = clean_up_and_exit;
1190 sigaction(SIGINT, &sa, NULL); 1190 sigaction_set(SIGINT, &sa);
1191 sa.sa_handler = SIG_IGN; 1191 sa.sa_handler = SIG_IGN;
1192 sigaction(SIGPIPE, &sa, &saved_pipe_handler); 1192 sigaction(SIGPIPE, &sa, &saved_pipe_handler);
1193 1193
@@ -1382,7 +1382,7 @@ int inetd_main(int argc, char **argv)
1382 * for nowait stream children */ 1382 * for nowait stream children */
1383 for (sep2 = serv_list; sep2; sep2 = sep2->se_next) 1383 for (sep2 = serv_list; sep2; sep2 = sep2->se_next)
1384 maybe_close(sep2->se_fd); 1384 maybe_close(sep2->se_fd);
1385 sigaction(SIGPIPE, &saved_pipe_handler, NULL); 1385 sigaction_set(SIGPIPE, &saved_pipe_handler);
1386 unblock_sigs(&omask); 1386 unblock_sigs(&omask);
1387 BB_EXECVP(sep->se_program, sep->se_argv); 1387 BB_EXECVP(sep->se_program, sep->se_argv);
1388 bb_perror_msg("exec %s", sep->se_program); 1388 bb_perror_msg("exec %s", sep->se_program);
diff --git a/networking/wget.c b/networking/wget.c
index 36a83560a..a77a2add7 100644
--- a/networking/wget.c
+++ b/networking/wget.c
@@ -144,13 +144,8 @@ static void progressmeter(int flag)
144 transferred = 0; 144 transferred = 0;
145 fputc('\n', stderr); 145 fputc('\n', stderr);
146 } else { 146 } else {
147 if (flag == -1) { 147 if (flag == -1) { /* first call to progressmeter */
148 /* first call to progressmeter */ 148 signal_SA_RESTART_empty_mask(SIGALRM, progressmeter);
149 struct sigaction sa;
150 sa.sa_handler = progressmeter;
151 sigemptyset(&sa.sa_mask);
152 sa.sa_flags = SA_RESTART;
153 sigaction(SIGALRM, &sa, NULL);
154 } 149 }
155 alarm(1); 150 alarm(1);
156 } 151 }
diff --git a/shell/ash.c b/shell/ash.c
index 9b1a73024..6f675ce69 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -3340,7 +3340,7 @@ setsignal(int signo)
3340 *t = action; 3340 *t = action;
3341 act.sa_flags = 0; 3341 act.sa_flags = 0;
3342 sigfillset(&act.sa_mask); 3342 sigfillset(&act.sa_mask);
3343 sigaction(signo, &act, NULL); 3343 sigaction_set(signo, &act);
3344} 3344}
3345 3345
3346/* mode flags for set_curjob */ 3346/* mode flags for set_curjob */
diff --git a/shell/hush.c b/shell/hush.c
index b44f35bdd..baa2db780 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -699,16 +699,6 @@ static const struct built_in_command bltins[] = {
699 699
700#if ENABLE_HUSH_JOB 700#if ENABLE_HUSH_JOB
701 701
702/* move to libbb? */
703static void signal_SA_RESTART(int sig, void (*handler)(int))
704{
705 struct sigaction sa;
706 sa.sa_handler = handler;
707 sa.sa_flags = SA_RESTART;
708 sigemptyset(&sa.sa_mask);
709 sigaction(sig, &sa, NULL);
710}
711
712/* Signals are grouped, we handle them in batches */ 702/* Signals are grouped, we handle them in batches */
713static void set_fatal_sighandler(void (*handler)(int)) 703static void set_fatal_sighandler(void (*handler)(int))
714{ 704{
@@ -2115,7 +2105,7 @@ static int run_list(struct pipe *pi)
2115#if ENABLE_FEATURE_SH_STANDALONE 2105#if ENABLE_FEATURE_SH_STANDALONE
2116 nofork_save.saved = 0; /* in case we will run a nofork later */ 2106 nofork_save.saved = 0; /* in case we will run a nofork later */
2117#endif 2107#endif
2118 signal_SA_RESTART(SIGTSTP, handler_ctrl_z); 2108 signal_SA_RESTART_empty_mask(SIGTSTP, handler_ctrl_z);
2119 signal(SIGINT, handler_ctrl_c); 2109 signal(SIGINT, handler_ctrl_c);
2120 } 2110 }
2121#endif /* JOB */ 2111#endif /* JOB */