less,klogd,syslogd,nc,tcpudp: exit on signal by killing itself, not exit(1) *: minor shrink
No binary (build failed)
—
(log yok)
| @@ -141,7 +141,7 @@ int dd_main(int argc, char **argv) | |
| #if ENABLE_FEATURE_DD_SIGNAL_HANDLING | |
| sigact.sa_handler = dd_output_status; | |
| sigact.sa_flags = SA_RESTART; | |
| - | sigemptyset(&sigact.sa_mask); |
| + | /*sigemptyset(&sigact.sa_mask); - memset did it */ |
| sigaction(SIGUSR1, &sigact, NULL); | |
| #endif | |
| @@ -164,40 +164,40 @@ int dd_main(int argc, char **argv) | |
| if (what == 0) | |
| bb_show_usage(); | |
| arg += key_len; | |
| - | /* Must fit into positive ssize_t */ |
| #if ENABLE_FEATURE_DD_IBS_OBS | |
| - | if (what == OP_ibs) { |
| - | ibs = xatoul_range_sfx(arg, 1, ((size_t)-1L)/2, dd_suffixes); |
| - | continue; |
| - | } |
| - | if (what == OP_obs) { |
| - | obs = xatoul_range_sfx(arg, 1, ((size_t)-1L)/2, dd_suffixes); |
| - | continue; |
| - | } |
| - | if (what == OP_conv) { |
| - | while (1) { |
| - | /* find ',', replace them with nil so we can use arg for |
| - | * index_in_strings() without copying. |
| - | * We rely on arg being non-null, else strchr would fault. |
| - | */ |
| - | key = strchr(arg, ','); |
| - | if (key) |
| - | *key = '\0'; |
| - | what = index_in_strings(keywords, arg) + 1; |
| - | if (what < OP_conv_notrunc) |
| - | bb_error_msg_and_die(bb_msg_invalid_arg, arg, "conv"); |
| - | if (what == OP_conv_notrunc) |
| - | flags |= FLAG_NOTRUNC; |
| - | if (what == OP_conv_sync) |
| - | flags |= FLAG_SYNC; |
| - | if (what == OP_conv_noerror) |
| - | flags |= FLAG_NOERROR; |
| - | if (!key) /* no ',' left, so this was the last specifier */ |
| - | break; |
| - | arg = key + 1; /* skip this keyword and ',' */ |
| - | } |
| - | continue; |
| + | if (what == OP_ibs) { |
| + | /* Must fit into positive ssize_t */ |
| + | ibs = xatoul_range_sfx(arg, 1, ((size_t)-1L)/2, dd_suffixes); |
| + | continue; |
| + | } |
| + | if (what == OP_obs) { |
| + | obs = xatoul_range_sfx(arg, 1, ((size_t)-1L)/2, dd_suffixes); |
| + | continue; |
| + | } |
| + | if (what == OP_conv) { |
| + | while (1) { |
| + | /* find ',', replace them with NUL so we can use arg for |
| + | * index_in_strings() without copying. |
| + | * We rely on arg being non-null, else strchr would fault. |
| + | */ |
| + | key = strchr(arg, ','); |
| + | if (key) |
| + | *key = '\0'; |
| + | what = index_in_strings(keywords, arg) + 1; |
| + | if (what < OP_conv_notrunc) |
| + | bb_error_msg_and_die(bb_msg_invalid_arg, arg, "conv"); |
| + | if (what == OP_conv_notrunc) |
| + | flags |= FLAG_NOTRUNC; |
| + | if (what == OP_conv_sync) |
| + | flags |= FLAG_SYNC; |
| + | if (what == OP_conv_noerror) |
| + | flags |= FLAG_NOERROR; |
| + | if (!key) /* no ',' left, so this was the last specifier */ |
| + | break; |
| + | arg = key + 1; /* skip this keyword and ',' */ |
| } | |
| + | continue; |
| + | } |
| #endif | |
| if (what == OP_bs) { | |
| ibs = obs = xatoul_range_sfx(arg, 1, ((size_t)-1L)/2, dd_suffixes); | |
| @@ -1168,8 +1168,8 @@ int fsck_main(int argc, char **argv) | |
| memset(&sa, 0, sizeof(sa)); | |
| sa.sa_handler = signal_cancel; | |
| - | sigaction(SIGINT, &sa, 0); |
| - | sigaction(SIGTERM, &sa, 0); |
| + | sigaction(SIGINT, &sa, NULL); |
| + | sigaction(SIGTERM, &sa, NULL); |
| setbuf(stdout, NULL); | |
| @@ -309,6 +309,7 @@ void sig_block(int); | |
| void sig_unblock(int); | |
| /* UNUSED: void sig_blocknone(void); */ | |
| void sig_pause(void); | |
| + | void kill_myself_with_sig(int sig) ATTRIBUTE_NORETURN; |
| void xsetgid(gid_t gid); | |
| @@ -68,7 +68,7 @@ static void sig_term_handler(int sig) | |
| { | |
| if (verbose) | |
| printf("%s: info: sigterm received, exit\n", applet_name); | |
| - | exit(0); |
| + | kill_myself_with_sig(sig); |
| } | |
| /* Little bloated, but tries to give accurate info how child exited. | |
| @@ -78,3 +78,17 @@ void sig_pause(void) | |
| sigemptyset(&ss); | |
| sigsuspend(&ss); | |
| } | |
| + | |
| + | /* Assuming the sig is fatal */ |
| + | void kill_myself_with_sig(int sig) |
| + | { |
| + | sigset_t set; |
| + | |
| + | signal(sig, SIG_DFL); |
| + | |
| + | sigemptyset(&set); |
| + | sigaddset(&set, sig); |
| + | sigprocmask(SIG_UNBLOCK, &set, NULL); |
| + | raise(sig); |
| + | _exit(1); /* Should not reach it */ |
| + | } |
| @@ -214,13 +214,12 @@ static void alarm_handler(int sig ATTRIBUTE_UNUSED) | |
| * arrive here when their connection is broken. | |
| * We don't want to block here */ | |
| ndelay_on(1); | |
| - | ndelay_on(2); |
| printf("\r\nLogin timed out after %d seconds\r\n", TIMEOUT); | |
| + | fflush(stdout); |
| /* unix API is brain damaged regarding O_NONBLOCK, | |
| * we should undo it, or else we can affect other processes */ | |
| ndelay_off(1); | |
| - | ndelay_off(2); |
| - | exit(EXIT_SUCCESS); |
| + | _exit(EXIT_SUCCESS); |
| } | |
| int login_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | |
| @@ -174,7 +174,9 @@ static void less_exit(int code) | |
| { | |
| bb_putchar('\n'); | |
| set_tty_cooked(); | |
| - | exit(code); /* TODO: "suicide mode" for code == -signal */ |
| + | if (code < 0) |
| + | kill_myself_with_sig(- code); /* does not return */ |
| + | exit(code); |
| } | |
| /* Move the cursor to a position (x,y), where (0,0) is the | |
| @@ -1328,9 +1330,9 @@ static void keypress_process(int keypress) | |
| number_process(keypress); | |
| } | |
| - | static void sig_catcher(int sig ATTRIBUTE_UNUSED) |
| + | static void sig_catcher(int sig) |
| { | |
| - | less_exit(1) /* TODO: "suicide mode" for code == -signal */ |
| + | less_exit(- sig); |
| } | |
| int less_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | |
| @@ -43,7 +43,7 @@ Cf: | |
| #define TIMEOUT_LONG 10 | |
| #define MAXERRORS 10 | |
| - | static int read_byte(int fd, unsigned int timeout) |
| + | static int read_byte(int fd, unsigned timeout) |
| { | |
| char buf[1]; | |
| int n; | |
| @@ -1327,7 +1327,7 @@ int inetd_main(int argc, char **argv) | |
| } | |
| memset((char *) &sa, 0, sizeof(sa)); | |
| - | sigemptyset(&sa.sa_mask); |
| + | /*sigemptyset(&sa.sa_mask); - memset did it */ |
| sigaddset(&sa.sa_mask, SIGALRM); | |
| sigaddset(&sa.sa_mask, SIGCHLD); | |
| sigaddset(&sa.sa_mask, SIGHUP); | |
| @@ -163,7 +163,7 @@ static void catch(int sig) | |
| if (o_verbose > 1) /* normally we don't care */ | |
| fprintf(stderr, SENT_N_RECV_M, wrote_net, wrote_out); | |
| fprintf(stderr, "punt!\n"); | |
| - | exit(1); |
| + | kill_myself_with_sig(sig); |
| } | |
| /* unarm */ | |
| @@ -43,7 +43,7 @@ static void save_state(void) | |
| xioctl(handle, TIOCGETD, &saved_disc); | |
| } | |
| - | static int set_termios_state_and_warn(struct termios *state) |
| + | static int set_termios_state_or_warn(struct termios *state) |
| { | |
| int ret; | |
| @@ -78,12 +78,12 @@ static void restore_state_and_exit(int exitcode) | |
| memcpy(&state, &saved_state, sizeof(state)); | |
| cfsetispeed(&state, B0); | |
| cfsetospeed(&state, B0); | |
| - | if (set_termios_state_and_warn(&state)) |
| + | if (set_termios_state_or_warn(&state)) |
| exitcode = 1; | |
| sleep(1); | |
| /* Restore line status */ | |
| - | if (set_termios_state_and_warn(&saved_state)) |
| + | if (set_termios_state_or_warn(&saved_state)) |
| exit(EXIT_FAILURE); | |
| if (ENABLE_FEATURE_CLEAN_UP) | |
| close(handle); | |
| @@ -99,7 +99,7 @@ static void set_state(struct termios *state, int encap) | |
| int disc; | |
| /* Set line status */ | |
| - | if (set_termios_state_and_warn(state)) |
| + | if (set_termios_state_or_warn(state)) |
| goto bad; | |
| /* Set line discliple (N_SLIP always) */ | |
| disc = N_SLIP; | |
| @@ -808,12 +808,7 @@ static void sigexit(int sig) | |
| if (sig <= 0) | |
| _exit(- sig); | |
| - | /* Enable only this sig and kill ourself with it */ |
| - | signal(sig, SIG_DFL); |
| - | sigdelset(&block_all, sig); |
| - | sigprocmask(SIG_SETMASK, &block_all, NULL); |
| - | raise(sig); |
| - | _exit(1); /* Should not reach it */ |
| + | kill_myself_with_sig(sig); /* does not return */ |
| } | |
| /* Restores tty foreground process group, and exits. */ | |
| @@ -26,7 +26,7 @@ static void klogd_signal(int sig ATTRIBUTE_UNUSED) | |
| klogctl(7, NULL, 0); | |
| klogctl(0, NULL, 0); | |
| syslog(LOG_NOTICE, "klogd: exiting"); | |
| - | exit(EXIT_SUCCESS); |
| + | kill_myself_with_sig(sig); |
| } | |
| #define log_buffer bb_common_bufsiz1 | |
| @@ -475,7 +475,7 @@ static void quit_signal(int sig) | |
| puts("syslogd exiting"); | |
| if (ENABLE_FEATURE_IPC_SYSLOG) | |
| ipcsyslog_cleanup(); | |
| - | exit(1); |
| + | kill_myself_with_sig(sig); |
| } | |
| #ifdef SYSLOGD_MARK | |