summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2014-05-15 01:14:02 +0000
committerTom Lane2014-05-15 01:14:02 +0000
commit360ec00a57964ce27c4ee064b7313d55dbf2fb9f (patch)
tree66acff4f8428289e61fd0bdc654ed0740925e1d0
parent1913d0f28d6ad1ccebba1035e7c319b1ff4a8b02 (diff)
In initdb, ensure stdout/stderr buffering behavior is what we expect.
Since this program may print to either stdout or stderr, the relative ordering of its messages depends on the buffering behavior of those files. Force stdout to be line-buffered and stderr to be unbuffered, ensuring that the behavior will match standard Unix interactive behavior, even when stdout and stderr are rerouted to a file. Per complaint from Tomas Vondra. The particular case he pointed out is new in HEAD, but issues of the same sort could arise in any branch with other error messages, so back-patch to all branches. I'm unsure whether we might not want to do this in other client programs as well. For the moment, just fix initdb.
-rw-r--r--src/bin/initdb/initdb.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 091b13f3e4d..40852a33b9a 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -2551,6 +2551,15 @@ main(int argc, char *argv[])
"pg_stat_tmp"
};
+ /*
+ * Ensure that buffering behavior of stdout and stderr matches what it is
+ * in interactive usage (at least on most platforms). This prevents
+ * unexpected output ordering when, eg, output is redirected to a file.
+ * POSIX says we must do this before any other usage of these files.
+ */
+ setvbuf(stdout, NULL, _IOLBF, 0);
+ setvbuf(stderr, NULL, _IONBF, 0);
+
progname = get_progname(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("initdb"));