Fix pg_basebackup output to stdout on Windows.

When writing a backup to stdout with pg_basebackup on Windows, put stdout
to binary mode. Any CR bytes in the output will otherwise be output
incorrectly as CR+LF.

In the passing, standardize on using "_setmode" instead of "setmode", for
the sake of consistency. They both do the same thing, but according to
MSDN documentation, setmode is deprecated.

Fixes bug #14634, reported by Henry Boehlert. Patch by Haribabu Kommi.
Backpatch to all supported versions.

Discussion: https://www.postgresql.org/message-id/20170428082818.24366.13134@wrigleys.postgresql.org
This commit is contained in:
Heikki Linnakangas 2017-07-14 16:02:53 +03:00
parent a3ca72ae9a
commit 8046465c2e
2 changed files with 6 additions and 2 deletions

View File

@ -954,6 +954,10 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
*/ */
if (strcmp(basedir, "-") == 0) if (strcmp(basedir, "-") == 0)
{ {
#ifdef WIN32
_setmode(fileno(stdout), _O_BINARY);
#endif
#ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
if (compresslevel != 0) if (compresslevel != 0)
{ {

View File

@ -2346,9 +2346,9 @@ _allocAH(const char *FileSpec, const ArchiveFormat fmt,
(AH->fSpec == NULL || strcmp(AH->fSpec, "") == 0)) (AH->fSpec == NULL || strcmp(AH->fSpec, "") == 0))
{ {
if (mode == archModeWrite) if (mode == archModeWrite)
setmode(fileno(stdout), O_BINARY); _setmode(fileno(stdout), O_BINARY);
else else
setmode(fileno(stdin), O_BINARY); _setmode(fileno(stdin), O_BINARY);
} }
#endif #endif