From 3c07fbf40bd0276e4be02fc72cba6b1cd62da301 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sun, 17 Mar 2013 16:09:47 -0400
Subject: [PATCH] Use pqsignal() in contrib programs rather than calling
 signal(2) directly.

The semantics of signal(2) are more variable than one could wish; in
particular, on strict-POSIX platforms the signal handler will be reset
to SIG_DFL when the signal is delivered.  This demonstrably breaks
pg_test_fsync's use of SIGALRM.  The other changes I made are not
absolutely necessary today, because the called handlers all exit the
program anyway.  But it seems like a good general practice to use
pqsignal() exclusively in Postgres code, now that we have it available
everywhere.
---
 contrib/pg_standby/pg_standby.c       | 8 ++++----
 contrib/pg_test_fsync/pg_test_fsync.c | 8 ++++----
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/contrib/pg_standby/pg_standby.c b/contrib/pg_standby/pg_standby.c
index 659bd50da7d..11615eb438b 100644
--- a/contrib/pg_standby/pg_standby.c
+++ b/contrib/pg_standby/pg_standby.c
@@ -549,7 +549,7 @@ sighandler(int sig)
 static void
 sigquit_handler(int sig)
 {
-	signal(SIGINT, SIG_DFL);
+	pqsignal(SIGINT, SIG_DFL);
 	kill(getpid(), SIGINT);
 }
 #endif
@@ -592,9 +592,9 @@ main(int argc, char **argv)
 	 *
 	 * There's no way to trigger failover via signal on Windows.
 	 */
-	(void) signal(SIGUSR1, sighandler);
-	(void) signal(SIGINT, sighandler);	/* deprecated, use SIGUSR1 */
-	(void) signal(SIGQUIT, sigquit_handler);
+	(void) pqsignal(SIGUSR1, sighandler);
+	(void) pqsignal(SIGINT, sighandler);	/* deprecated, use SIGUSR1 */
+	(void) pqsignal(SIGQUIT, sigquit_handler);
 #endif
 
 	while ((c = getopt(argc, argv, "cdk:lr:s:t:w:")) != -1)
diff --git a/contrib/pg_test_fsync/pg_test_fsync.c b/contrib/pg_test_fsync/pg_test_fsync.c
index 5ee03981a3b..7bc0d0e5fd9 100644
--- a/contrib/pg_test_fsync/pg_test_fsync.c
+++ b/contrib/pg_test_fsync/pg_test_fsync.c
@@ -101,14 +101,14 @@ main(int argc, char *argv[])
 	handle_args(argc, argv);
 
 	/* Prevent leaving behind the test file */
-	signal(SIGINT, signal_cleanup);
-	signal(SIGTERM, signal_cleanup);
+	pqsignal(SIGINT, signal_cleanup);
+	pqsignal(SIGTERM, signal_cleanup);
 #ifndef WIN32
-	signal(SIGALRM, process_alarm);
+	pqsignal(SIGALRM, process_alarm);
 #endif
 #ifdef SIGHUP
 	/* Not defined on win32 */
-	signal(SIGHUP, signal_cleanup);
+	pqsignal(SIGHUP, signal_cleanup);
 #endif
 
 	prepare_buf();
-- 
GitLab