diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2009-03-10 16:01:57 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2009-03-10 16:01:57 +0000 |
commit | 4774179cb9e04030485773adf2b7b1055a10faeb (patch) | |
tree | 91bb5c51f9f4e3036298d7bb5490621b3e7a3ee6 /mailutils/mail.c | |
parent | 245f91b6494063c5fa1f3f586771e2ac100a69a9 (diff) | |
download | busybox-w32-4774179cb9e04030485773adf2b7b1055a10faeb.tar.gz busybox-w32-4774179cb9e04030485773adf2b7b1055a10faeb.tar.bz2 busybox-w32-4774179cb9e04030485773adf2b7b1055a10faeb.zip |
mail.c: more robust handling of SIGCHLD
init: more robust signal handling
Diffstat (limited to '')
-rw-r--r-- | mailutils/mail.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/mailutils/mail.c b/mailutils/mail.c index 71f46c86f..68883ff42 100644 --- a/mailutils/mail.c +++ b/mailutils/mail.c | |||
@@ -48,6 +48,12 @@ void FAST_FUNC launch_helper(const char **argv) | |||
48 | xpipe(pipes); | 48 | xpipe(pipes); |
49 | xpipe(pipes + 2); | 49 | xpipe(pipes + 2); |
50 | 50 | ||
51 | // NB: handler must be installed before vfork | ||
52 | bb_signals(0 | ||
53 | + (1 << SIGCHLD) | ||
54 | + (1 << SIGALRM) | ||
55 | , signal_handler); | ||
56 | |||
51 | G.helper_pid = vfork(); | 57 | G.helper_pid = vfork(); |
52 | if (G.helper_pid < 0) | 58 | if (G.helper_pid < 0) |
53 | bb_perror_msg_and_die("vfork"); | 59 | bb_perror_msg_and_die("vfork"); |
@@ -60,15 +66,12 @@ void FAST_FUNC launch_helper(const char **argv) | |||
60 | 66 | ||
61 | if (!G.helper_pid) { | 67 | if (!G.helper_pid) { |
62 | // child: try to execute connection helper | 68 | // child: try to execute connection helper |
69 | // NB: SIGCHLD & SIGALRM revert to SIG_DFL on exec | ||
63 | BB_EXECVP(*argv, (char **)argv); | 70 | BB_EXECVP(*argv, (char **)argv); |
64 | _exit(127); | 71 | _exit(127); |
65 | } | 72 | } |
66 | 73 | ||
67 | // parent | 74 | // parent |
68 | bb_signals(0 | ||
69 | + (1 << SIGCHLD) | ||
70 | + (1 << SIGALRM) | ||
71 | , signal_handler); | ||
72 | // check whether child is alive | 75 | // check whether child is alive |
73 | //redundant:signal_handler(SIGCHLD); | 76 | //redundant:signal_handler(SIGCHLD); |
74 | // child seems OK -> parent goes on | 77 | // child seems OK -> parent goes on |