summaryrefslogtreecommitdiff
path: root/libpq/pqsignal.c
diff options
context:
space:
mode:
Diffstat (limited to 'libpq/pqsignal.c')
-rw-r--r--libpq/pqsignal.c90
1 files changed, 90 insertions, 0 deletions
diff --git a/libpq/pqsignal.c b/libpq/pqsignal.c
new file mode 100644
index 0000000..07797f9
--- /dev/null
+++ b/libpq/pqsignal.c
@@ -0,0 +1,90 @@
+/*-------------------------------------------------------------------------
+ *
+ * pqsignal.c
+ * reliable BSD-style signal(2) routine stolen from RWW who stole it
+ * from Stevens...
+ *
+ * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/port/pqsignal.c
+ *
+ * We now assume that all Unix-oid systems have POSIX sigaction(2)
+ * with support for restartable signals (SA_RESTART). We used to also
+ * support BSD-style signal(2), but there really shouldn't be anything
+ * out there anymore that doesn't have the POSIX API.
+ *
+ * Windows, of course, is resolutely in a class by itself. In the backend,
+ * we don't use this file at all; src/backend/port/win32/signal.c provides
+ * pqsignal() for the backend environment. Frontend programs can use
+ * this version of pqsignal() if they wish, but beware that this does
+ * not provide restartable signals on Windows.
+ *
+ * ------------------------------------------------------------------------
+ */
+
+#include "c.h"
+
+#include <signal.h>
+
+#if !defined(WIN32) || defined(FRONTEND)
+
+/*
+ * Set up a signal handler, with SA_RESTART, for signal "signo"
+ *
+ * Returns the previous handler.
+ */
+pqsigfunc
+pqsignal(int signo, pqsigfunc func)
+{
+#ifndef WIN32
+ struct sigaction act,
+ oact;
+
+ act.sa_handler = func;
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = SA_RESTART;
+#ifdef SA_NOCLDSTOP
+ if (signo == SIGCHLD)
+ act.sa_flags |= SA_NOCLDSTOP;
+#endif
+ if (sigaction(signo, &act, &oact) < 0)
+ return SIG_ERR;
+ return oact.sa_handler;
+#else /* WIN32 */
+ return signal(signo, func);
+#endif
+}
+
+/*
+ * Set up a signal handler, without SA_RESTART, for signal "signo"
+ *
+ * Returns the previous handler.
+ *
+ * On Windows, this would be identical to pqsignal(), so don't bother.
+ */
+#ifndef WIN32
+
+pqsigfunc
+pqsignal_no_restart(int signo, pqsigfunc func)
+{
+ struct sigaction act,
+ oact;
+
+ act.sa_handler = func;
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = 0;
+#ifdef SA_NOCLDSTOP
+ if (signo == SIGCHLD)
+ act.sa_flags |= SA_NOCLDSTOP;
+#endif
+ if (sigaction(signo, &act, &oact) < 0)
+ return SIG_ERR;
+ return oact.sa_handler;
+}
+
+#endif /* !WIN32 */
+
+#endif /* !defined(WIN32) || defined(FRONTEND) */