summaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
authorTom Lane2014-05-15 19:58:05 +0000
committerTom Lane2014-05-15 19:58:05 +0000
commitda05e57f70d42a41a0c6f01e2440bd3efbd972d1 (patch)
tree007c7aa798aaea90aae76043d6ab070d79f8bab5 /src/include
parentf47e4ce6cea2ced5da35e49d41154a19d7b3ebed (diff)
Fix unportable setvbuf() usage in initdb.
In yesterday's commit 2dc4f011fd61501cce507be78c39a2677690d44b, I tried to force buffering of stdout/stderr in initdb to be what it is by default when the program is run interactively on Unix (since that's how most manual testing is done). This tripped over the fact that Windows doesn't support _IOLBF mode. We dealt with that a long time ago in syslogger.c by falling back to unbuffered mode on Windows. Export that solution in port.h and use it in initdb. Back-patch to 8.4, like the previous commit.
Diffstat (limited to 'src/include')
-rw-r--r--src/include/port.h14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/include/port.h b/src/include/port.h
index e7f37559dde..8563cd6158b 100644
--- a/src/include/port.h
+++ b/src/include/port.h
@@ -372,6 +372,20 @@ extern int gettimeofday(struct timeval * tp, struct timezone * tzp);
#endif /* WIN32 */
/*
+ * On Windows, setvbuf() does not support _IOLBF mode, and interprets that
+ * as _IOFBF. To add insult to injury, setvbuf(file, NULL, _IOFBF, 0)
+ * crashes outright if "parameter validation" is enabled. Therefore, in
+ * places where we'd like to select line-buffered mode, we fall back to
+ * unbuffered mode instead on Windows. Always use PG_IOLBF not _IOLBF
+ * directly in order to implement this behavior.
+ */
+#ifndef WIN32
+#define PG_IOLBF _IOLBF
+#else
+#define PG_IOLBF _IONBF
+#endif
+
+/*
* Default "extern" declarations or macro substitutes for library routines.
* When necessary, these routines are provided by files in src/port/.
*/