]> granicus.if.org Git - postgresql/commitdiff
Make pg_dump and pg_restore handle binary archive formats correctly
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 26 Jan 2005 19:44:43 +0000 (19:44 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 26 Jan 2005 19:44:43 +0000 (19:44 +0000)
when using stdout/stdin on Windows.

src/bin/pg_dump/pg_backup_archiver.c

index e3b99a9b1d98cba791ec5bc9a3085588acb1f88f..f0086118270f506c98d0b4de8be7e5ccdf669c07 100644 (file)
@@ -15,7 +15,7 @@
  *
  *
  * IDENTIFICATION
- *             $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.103 2005/01/25 22:44:31 tgl Exp $
+ *             $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.104 2005/01/26 19:44:43 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include <ctype.h>
 #include <unistd.h>
 
+#ifdef WIN32
+#include <io.h>
+#endif
+
 #include "pqexpbuffer.h"
 #include "libpq/libpq-fs.h"
 
@@ -1709,6 +1713,21 @@ _allocAH(const char *FileSpec, const ArchiveFormat fmt,
        AH->gzOut = 0;
        AH->OF = stdout;
 
+       /*
+        * On Windows, we need to use binary mode to read/write non-text archive
+        * formats.  Force stdin/stdout into binary mode in case that is what
+        * we are using.
+        */
+#ifdef WIN32
+       if (fmt != archNull)
+       {
+               if (mode == archModeWrite)
+                       setmode(fileno(stdout), O_BINARY);
+               else
+                       setmode(fileno(stdin), O_BINARY);
+       }
+#endif
+
 #if 0
        write_msg(modulename, "archive format is %d\n", fmt);
 #endif
@@ -1720,7 +1739,6 @@ _allocAH(const char *FileSpec, const ArchiveFormat fmt,
 
        switch (AH->format)
        {
-
                case archCustom:
                        InitArchiveFmt_Custom(AH);
                        break;