]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix case of pg_dump -Fc to an unseekable file (such as a pipe).
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 5 May 2014 15:26:41 +0000 (11:26 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 5 May 2014 15:26:41 +0000 (11:26 -0400)
This was accidentally broken in commits cfa1b4a711/5e8e794e3b.
It saves a line or so to call ftello unconditionally in _CloseArchive,
but we have to expect that it might fail if we're not in hasSeek mode.
Per report from Bernd Helmle.

In passing, improve _getFilePos to print an appropriate message if
ftello fails unexpectedly, rather than just a vague complaint about
"ftell mismatch".

src/bin/pg_dump/pg_backup_custom.c

index 72bdc3928b2b401e714d9a405982dab605787c74..de4f023fa748b37306753f83f6d07c4d164c89e3 100644 (file)
@@ -707,8 +707,9 @@ _CloseArchive(ArchiveHandle *AH)
        if (AH->mode == archModeWrite)
        {
                WriteHead(AH);
+               /* Remember TOC's seek position for use below */
                tpos = ftello(AH->FH);
-               if (tpos < 0)
+               if (tpos < 0 && ctx->hasSeek)
                        exit_horribly(modulename, "could not determine seek position in archive file: %s\n",
                                                  strerror(errno));
                WriteToc(AH);
@@ -899,17 +900,20 @@ _getFilePos(ArchiveHandle *AH, lclContext *ctx)
 
        if (ctx->hasSeek)
        {
+               /*
+                * Prior to 1.7 (pg7.3) we relied on the internally maintained
+                * pointer.  Now we rely on ftello() always, unless the file has been
+                * found to not support it.  For debugging purposes, print a warning
+                * if the internal pointer disagrees, so that we're more likely to
+                * notice if something's broken about the internal position tracking.
+                */
                pos = ftello(AH->FH);
+               if (pos < 0)
+                       exit_horribly(modulename, "could not determine seek position in archive file: %s\n",
+                                                 strerror(errno));
+
                if (pos != ctx->filePos)
-               {
                        write_msg(modulename, "WARNING: ftell mismatch with expected position -- ftell used\n");
-
-                       /*
-                        * Prior to 1.7 (pg7.3) we relied on the internally maintained
-                        * pointer. Now we rely on ftello() always, unless the file has
-                        * been found to not support it.
-                        */
-               }
        }
        else
                pos = ctx->filePos;