less,klogd,syslogd,nc,tcpudp: exit on signal by killing itself, not exit(1)
authorDenis Vlasenko <vda.linux@googlemail.com>
Sun, 24 Feb 2008 13:36:01 +0000 (13:36 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sun, 24 Feb 2008 13:36:01 +0000 (13:36 -0000)
*: minor shrink

14 files changed:
coreutils/dd.c
e2fsprogs/fsck.c
include/libbb.h
ipsvd/tcpudp.c
libbb/signals.c
loginutils/login.c
miscutils/less.c
miscutils/rx.c
networking/inetd.c
networking/nc_bloaty.c
networking/slattach.c
shell/hush.c
sysklogd/klogd.c
sysklogd/syslogd.c

index 7552c8518807b42377b75cdf830e79cae33863dc..961b1fff7cf3e4edf1c13dfd907fae3cec017b07 100644 (file)
@@ -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);
index 012285103a5aa72661a503d1b3808d943a09b5ba..de2d61eefcdf1bf68282db8c754e4d3c843f9a22 100644 (file)
@@ -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);
 
index 873ab879885af00d52ead8bcaff65f47470e9492..48937c4b1b868832a8500989c29d5c4327fb6569 100644 (file)
@@ -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);
index dc61d6f76092e701214d52d2f551f2ffb6a81cba..b3a2c7a77702c45dd3629bdad52245a6002e712c 100644 (file)
@@ -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.
index f7e4908e7a5e95bef082b063a987925d6e5f6e5b..b46b595da33471ac9b6af844a8a9556612f12a23 100644 (file)
@@ -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 */
+}
index a5b6369ff4463fa9111d64703ad26bcd119260b4..bc437bb6b7d6c7da2554b745833bf448921b4042 100644 (file)
@@ -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;
index f3be2cfbf4690f122eb98ed7e13adb87e594466e..7351a634d763892b9a750e667961b0bb827a8aba 100644 (file)
@@ -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;
index 898703c592a377a80361e54955934048be271f44..8ccea497438e8e67d73334b9370d901423b99943 100644 (file)
@@ -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;
index a7259f3d43ce084a2c80702bccaf84a5056bb6a6..fd865efd15f333f77a0bfce7815e841865b8bc84 100644 (file)
@@ -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);
index 853577aef4368148f2dcc582934f4b74085a35f1..dd62e5df737dc633189799b402f15f27a406b952 100644 (file)
@@ -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  */
index e501d82e1d42df6ca8329b2c5b89aaef2e71ff0d..1987eb39c31561cd58c5afc142fe2af29661a8b6 100644 (file)
@@ -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;
index 820fd888d6cee67068bff25a014c2aaf09befead..d9ef2390e4d9407beac14210544e47da20f723e1 100644 (file)
@@ -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. */
index 6a675b8b3fdb5faa5c18e7896de2a26344420652..01d5971781c3226941115ba9a42cb0c2626f9136 100644 (file)
@@ -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
index c713507504299ce9e5f42953e946b79f27d71c61..0dc69d8cc7d086c6a52b18cae4ad326f57e44940 100644 (file)
@@ -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