diff options
| -rw-r--r-- | coreutils/dd.c | 9 | ||||
| -rw-r--r-- | e2fsprogs/fsck.c | 7 | ||||
| -rw-r--r-- | include/libbb.h | 7 | ||||
| -rw-r--r-- | libbb/bb_askpass.c | 4 | ||||
| -rw-r--r-- | libbb/signals.c | 28 | ||||
| -rw-r--r-- | loginutils/vlock.c | 15 | ||||
| -rw-r--r-- | miscutils/devfsd.c | 4 | ||||
| -rw-r--r-- | miscutils/rx.c | 5 | ||||
| -rw-r--r-- | networking/arping.c | 14 | ||||
| -rw-r--r-- | networking/httpd.c | 15 | ||||
| -rw-r--r-- | networking/inetd.c | 12 | ||||
| -rw-r--r-- | networking/wget.c | 9 | ||||
| -rw-r--r-- | shell/ash.c | 2 | ||||
| -rw-r--r-- | shell/hush.c | 12 |
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 | ||
| 276 | char *xmalloc_follow_symlinks(const char *path); | 276 | char *xmalloc_follow_symlinks(const char *path); |
| 277 | 277 | ||
| 278 | |||
| 278 | enum { | 279 | enum { |
| 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: */ |
| 308 | void bb_signals_recursive(int sigs, void (*f)(int)); | 309 | void bb_signals_recursive(int sigs, void (*f)(int)); |
| 310 | /* syscalls like read() will be interrupted with EINTR: */ | ||
| 311 | void signal_no_SA_RESTART_empty_mask(int sig, void (*handler)(int)); | ||
| 312 | /* syscalls like read() won't be interrupted (though select/poll will be): */ | ||
| 313 | void signal_SA_RESTART_empty_mask(int sig, void (*handler)(int)); | ||
| 314 | /* Will do sigaction(signum, act, NULL): */ | ||
| 315 | int sigaction_set(int signum, const struct sigaction *act); | ||
| 309 | void sig_block(int); | 316 | void sig_block(int); |
| 310 | void sig_unblock(int); | 317 | void 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... */ | ||
| 15 | int sigaction_set(int signum, const struct sigaction *act) | ||
| 16 | { | ||
| 17 | return sigaction(signum, act, NULL); | ||
| 18 | } | ||
| 19 | |||
| 14 | void bb_signals(int sigs, void (*f)(int)) | 20 | void 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 | |||
| 97 | void 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 | |||
| 107 | void 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) | |||
| 34 | int vlock_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 34 | int vlock_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 35 | int vlock_main(int argc, char **argv) | 35 | int 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) | |||
| 220 | int rx_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 220 | int rx_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 221 | int rx_main(int argc, char **argv) | 221 | int 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 |
| 2248 | static void sighup_handler(int sig) | 2243 | static 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? */ | ||
| 703 | static 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 */ |
| 713 | static void set_fatal_sighandler(void (*handler)(int)) | 703 | static 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 */ |
