From: Vincent Bernat Date: Mon, 15 Jul 2013 13:28:46 +0000 (+0200) Subject: priv: use `sigaction()` instead of `signal()` to install non-default signals X-Git-Tag: 0.7.7~44 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5c4fa9bdc202c7f474cb50f77a79acbea2abd009;p=thirdparty%2Flldpd.git priv: use `sigaction()` instead of `signal()` to install non-default signals `signal()` is not portable to install non-default signals. --- diff --git a/src/daemon/priv.c b/src/daemon/priv.c index 6b65e911..c5e630ae 100644 --- a/src/daemon/priv.c +++ b/src/daemon/priv.c @@ -492,12 +492,22 @@ priv_init(const char *chrootdir, int ctl, uid_t uid, gid_t gid) if (atexit(priv_exit) != 0) fatal("privsep", "unable to set exit function"); - signal(SIGALRM, sig_pass_to_chld); - signal(SIGTERM, sig_pass_to_chld); - signal(SIGHUP, sig_pass_to_chld); - signal(SIGINT, sig_pass_to_chld); - signal(SIGQUIT, sig_pass_to_chld); - signal(SIGCHLD, sig_chld); + /* Install signal handlers */ + const struct sigaction pass_to_child = { + .sa_handler = sig_pass_to_chld, + .sa_flags = SA_RESTART + }; + sigaction(SIGALRM, &pass_to_child, NULL); + sigaction(SIGTERM, &pass_to_child, NULL); + sigaction(SIGHUP, &pass_to_child, NULL); + sigaction(SIGINT, &pass_to_child, NULL); + sigaction(SIGQUIT, &pass_to_child, NULL); + const struct sigaction child = { + .sa_handler = sig_chld, + .sa_flags = SA_RESTART + }; + sigaction(SIGCHLD, &child, NULL); + if (waitpid(monitored, &status, WNOHANG) != 0) /* Child is already dead */ _exit(1);