Rename some of the more stupidly named files in the Unix back end.
[u/mdw/putty] / unix / uxsignal.c
diff --git a/unix/uxsignal.c b/unix/uxsignal.c
new file mode 100644 (file)
index 0000000..e21e0e8
--- /dev/null
@@ -0,0 +1,45 @@
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/*
+ * 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)
+ */
+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;
+}
+
+void block_signal(int sig, int block_it)
+{
+    sigset_t ss;
+
+    sigemptyset(&ss);
+    sigaddset(&ss, sig);
+    if(sigprocmask(block_it ? SIG_BLOCK : SIG_UNBLOCK, &ss, 0) < 0) {
+       perror("sigprocmask");
+       exit(1);
+    }
+}
+
+/*
+Local Variables:
+c-basic-offset:4
+comment-column:40
+End:
+*/