diff options
| author | Roy Marples <roy@marples.name> | 2008-05-26 19:19:11 +0000 |
|---|---|---|
| committer | Roy Marples <roy@marples.name> | 2008-05-26 19:19:11 +0000 |
| commit | e0496aa9eb35c9006f105e5db6bb8d27270c0c25 (patch) | |
| tree | 600c7e8e1ab71bbd17090a5f1d8a1269fae8ca4a /signals.c | |
| parent | 08e5e31f93122865ce9c92ff1e82560811d24cad (diff) | |
| download | dhcpcd-e0496aa9eb35c9006f105e5db6bb8d27270c0c25.tar.xz | |
Fix a signal race when daemonising.
Diffstat (limited to 'signals.c')
| -rw-r--r-- | signals.c | 18 |
1 files changed, 12 insertions, 6 deletions
@@ -134,30 +134,36 @@ signal_init(void) } static int -signal_handle(void (*func)(int)) +signal_handle(void (*func)(int), int restore) { unsigned int i; - struct sigaction sa; + struct sigaction sa, sa_old; memset(&sa, 0, sizeof(sa)); sa.sa_handler = func; sigemptyset(&sa.sa_mask); for (i = 0; i < sizeof(handle_sigs) / sizeof(handle_sigs[0]); i++) - if (sigaction(handle_sigs[i], &sa, NULL) == -1) + if (sigaction(handle_sigs[i], &sa, &sa_old) == -1) return -1; - + if (restore && sigaction(handle_sigs[i], &sa_old, NULL) == -1) + return -1; return 0; } int signal_setup(void) { - return signal_handle(signal_handler); + return signal_handle(signal_handler, 0); } int signal_reset(void) { - return signal_handle(SIG_DFL); + return signal_handle(SIG_DFL, 0); +} + +int +signal_clear(void) + return signal_handle(SIG_IGN, 1); } |
