X-Git-Url: http://git.archive.openwrt.org/?p=project%2Flibubox.git;a=blobdiff_plain;f=uloop.c;h=9a77ce49a5a7c2444a768eac3eb5059f52681fb3;hp=c3d206a0ed146a5d12173543d9af37acb166811e;hb=0bfb44f590402137bfcf8e65c54638908d5ed6d2;hpb=f32a53f92b377fa92dbafd2ce3d2df93fffb314d;ds=sidebyside diff --git a/uloop.c b/uloop.c index c3d206a..9a77ce4 100644 --- a/uloop.c +++ b/uloop.c @@ -58,7 +58,6 @@ static struct list_head processes = LIST_HEAD_INIT(processes); static int poll_fd = -1; bool uloop_cancelled = false; -bool uloop_handle_sigchld = true; static bool do_sigchld = false; static struct uloop_fd_event cur_fds[ULOOP_MAX_EVENTS]; @@ -559,31 +558,37 @@ static void uloop_sigchld(int signo) do_sigchld = true; } -static void uloop_setup_signals(bool add) +static void uloop_install_handler(int signum, void (*handler)(int), struct sigaction* old, bool add) { - static struct sigaction old_sigint, old_sigchld; struct sigaction s; + struct sigaction *act; - memset(&s, 0, sizeof(struct sigaction)); + act = NULL; + sigaction(signum, NULL, &s); if (add) { - s.sa_handler = uloop_handle_sigint; - s.sa_flags = 0; - } else { - s = old_sigint; + if (s.sa_handler == SIG_DFL) { /* Do not override existing custom signal handlers */ + memcpy(old, &s, sizeof(struct sigaction)); + s.sa_handler = handler; + s.sa_flags = 0; + act = &s; + } + } + else if (s.sa_handler == handler) { /* Do not restore if someone modified our handler */ + act = old; } - sigaction(SIGINT, &s, &old_sigint); - - if (!uloop_handle_sigchld) - return; + if (act != NULL) + sigaction(signum, act, NULL); +} - if (add) - s.sa_handler = uloop_sigchld; - else - s = old_sigchld; +static void uloop_setup_signals(bool add) +{ + static struct sigaction old_sigint, old_sigchld, old_sigterm; - sigaction(SIGCHLD, &s, &old_sigchld); + uloop_install_handler(SIGINT, uloop_handle_sigint, &old_sigint, add); + uloop_install_handler(SIGTERM, uloop_handle_sigint, &old_sigterm, add); + uloop_install_handler(SIGCHLD, uloop_sigchld, &old_sigchld, add); } static int uloop_get_next_timeout(struct timeval *tv)