diff options
Diffstat (limited to 'unix/utils/signal.c')
-rw-r--r-- | unix/utils/signal.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/unix/utils/signal.c b/unix/utils/signal.c new file mode 100644 index 00000000..a56fe6be --- /dev/null +++ b/unix/utils/signal.c @@ -0,0 +1,30 @@ +/* + * PuTTY's wrapper on signal(2). + * + * Calling signal() is non-portable, as it varies in meaning between + * platforms and depending on feature macros, and has stupid semantics + * at least some of the time. + * + * This function provides the same interface as the libc function, but + * provides consistent semantics. It assumes POSIX semantics for + * sigaction() (so you might need to do some more work if you port to + * something ancient like SunOS 4). + */ + +#include <signal.h> + +#include "defs.h" + +void (*putty_signal(int sig, void (*func)(int)))(int) +{ + struct sigaction sa; + struct sigaction old; + + sa.sa_handler = func; + if(sigemptyset(&sa.sa_mask) < 0) + return SIG_ERR; + sa.sa_flags = SA_RESTART; + if(sigaction(sig, &sa, &old) < 0) + return SIG_ERR; + return old.sa_handler; +} |