]> granicus.if.org Git - postgresql/commitdiff
Improve reporting of error situations in find_other_exec().
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 27 Jul 2012 23:31:19 +0000 (19:31 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 27 Jul 2012 23:31:19 +0000 (19:31 -0400)
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

index 24bcd806c086cc798165e6c2885e4dc8341d2d8f..1687c9c9729c21c3b21808357e3b6c1c88d77010 100644 (file)
@@ -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;
        }