X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=uloop.c;h=d4df6e210e36b534bea7b0d9e62b7c438c2641dc;hb=08c27ceb016ae42235c413a7693f18f437cd4972;hp=9fedcce078e836ebb46c8997838aac7c8f7336c4;hpb=213122a0830e1ba3a05013b5cb5d17c49af13282;p=project%2Flibubox.git diff --git a/uloop.c b/uloop.c index 9fedcce..d4df6e2 100644 --- a/uloop.c +++ b/uloop.c @@ -453,14 +453,14 @@ int uloop_timeout_set(struct uloop_timeout *timeout, int msecs) if (timeout->pending) uloop_timeout_cancel(timeout); - uloop_gettime(&timeout->time); + uloop_gettime(time); time->tv_sec += msecs / 1000; time->tv_usec += (msecs % 1000) * 1000; if (time->tv_usec > 1000000) { time->tv_sec++; - time->tv_usec %= 1000000; + time->tv_usec -= 1000000; } return uloop_timeout_add(timeout); @@ -558,28 +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 (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)