From 9ae8ebe0b221d9d547adfbfae74bd62e73e39fcd Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Fri, 27 Jul 2012 19:31:13 -0400
Subject: [PATCH] Improve reporting of error situations in find_other_exec().

This function suppressed any stderr output from the called program, which
is unnecessary in the normal case and unhelpful in error cases.  It also
gave a rather opaque message along the lines of "fgets failure: Success"
in case the called program failed to return anything on stdout.  Since
we've seen multiple reports of people not understanding what's wrong when
pg_ctl reports this, improve the message.

Back-patch to all active branches.
---
 src/port/exec.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/port/exec.c b/src/port/exec.c
index 24bcd806c08..1687c9c9729 100644
--- a/src/port/exec.c
+++ b/src/port/exec.c
@@ -322,7 +322,7 @@ find_other_exec(const char *argv0, const char *target,
 	if (validate_exec(retpath) != 0)
 		return -1;
 
-	snprintf(cmd, sizeof(cmd), "\"%s\" -V 2>%s", retpath, DEVNULL);
+	snprintf(cmd, sizeof(cmd), "\"%s\" -V", retpath);
 
 	if (!pipe_read_line(cmd, line, sizeof(line)))
 		return -1;
@@ -352,12 +352,20 @@ pipe_read_line(char *cmd, char *line, int maxsize)
 	fflush(stdout);
 	fflush(stderr);
 
+	errno = 0;
 	if ((pgver = popen(cmd, "r")) == NULL)
+	{
+		perror("popen failure");
 		return NULL;
+	}
 
+	errno = 0;
 	if (fgets(line, maxsize, pgver) == NULL)
 	{
-		perror("fgets failure");
+		if (feof(pgver))
+			fprintf(stderr, "no data was returned by command \"%s\"\n", cmd);
+		else
+			perror("fgets failure");
 		pclose(pgver);			/* no error checking */
 		return NULL;
 	}
-- 
GitLab