diff --git a/libc/signal.cc b/libc/signal.cc index 122f689ff5e2c13ce5fb210983c536104945edf1..44606941ad8ea5e46fdb0134cafaf55771e28c47 100644 --- a/libc/signal.cc +++ b/libc/signal.cc @@ -151,12 +151,12 @@ int sigaction(int signum, const struct sigaction* act, struct sigaction* oldact) // using signal() is not recommended (use sigaction instead!), but some // programs like to call to do simple things, like ignoring a certain signal. -sighandler_t signal(int signum, sighandler_t handler) +static sighandler_t signal(int signum, sighandler_t handler, int sa_flags) { struct sigaction act; memset(&act, 0, sizeof(act)); act.sa_handler = handler; - act.sa_flags = SA_RESTART; + act.sa_flags = sa_flags; struct sigaction old; if (sigaction(signum, &act, &old) < 0) { return SIG_ERR; @@ -169,6 +169,17 @@ sighandler_t signal(int signum, sighandler_t handler) } } +sighandler_t signal(int signum, sighandler_t handler) +{ + return signal(signum, handler, SA_RESTART); +} + +extern "C" +sighandler_t __sysv_signal(int signum, sighandler_t handler) +{ + return signal(signum, handler, SA_RESETHAND | SA_NODEFER); +} + // using sigignore() and friends is not recommended as it is obsolete System V // APIs. Nevertheless, some programs use it. int sigignore(int signum)