summaryrefslogtreecommitdiffstats
path: root/signals.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2008-05-26 19:19:11 +0000
committerRoy Marples <roy@marples.name>2008-05-26 19:19:11 +0000
commite0496aa9eb35c9006f105e5db6bb8d27270c0c25 (patch)
tree600c7e8e1ab71bbd17090a5f1d8a1269fae8ca4a /signals.c
parent08e5e31f93122865ce9c92ff1e82560811d24cad (diff)
downloaddhcpcd-e0496aa9eb35c9006f105e5db6bb8d27270c0c25.tar.xz
Fix a signal race when daemonising.
Diffstat (limited to 'signals.c')
-rw-r--r--signals.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/signals.c b/signals.c
index d8c7a7e9..0cf59023 100644
--- a/signals.c
+++ b/signals.c
@@ -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);
}