Fix pg_basebackup output to stdout on Windows.
authorHeikki Linnakangas <[email protected]>
Fri, 14 Jul 2017 13:02:53 +0000 (16:02 +0300)
committerHeikki Linnakangas <[email protected]>
Fri, 14 Jul 2017 13:03:27 +0000 (16:03 +0300)
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[email protected]

src/bin/pg_basebackup/pg_basebackup.c
src/bin/pg_dump/pg_backup_archiver.c

index 6b88b734ada675b92e872842ffac8f74c732eb63..0366f1ad68035d362f02c32fc3825a4edbe9e465 100644 (file)
@@ -528,6 +528,10 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
         */
        if (strcmp(basedir, "-") == 0)
        {
+#ifdef WIN32
+           _setmode(fileno(stdout), _O_BINARY);
+#endif
+
 #ifdef HAVE_LIBZ
            if (compresslevel != 0)
            {
index 71974ed0f94d55330ee7d60221eb691fb62343f4..71e83366bc29e6522e70e3d6f6382d60b7187df2 100644 (file)
@@ -2144,9 +2144,9 @@ _allocAH(const char *FileSpec, const ArchiveFormat fmt,
        (AH->fSpec == NULL || strcmp(AH->fSpec, "") == 0))
    {
        if (mode == archModeWrite)
-           setmode(fileno(stdout), O_BINARY);
+           _setmode(fileno(stdout), O_BINARY);
        else
-           setmode(fileno(stdin), O_BINARY);
+           _setmode(fileno(stdin), O_BINARY);
    }
 #endif