aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2014-05-05 11:26:41 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2014-05-05 11:26:41 -0400
commite03485ae8a2025d5deea291ebb24412229cc2fe5 (patch)
treeadf4024e2c81ed2d516e6ae42e73264fb112b601
parentf8db074049be74fa100b4f97d09ee76222660e7c (diff)
downloadpostgresql-e03485ae8a2025d5deea291ebb24412229cc2fe5.tar.gz
postgresql-e03485ae8a2025d5deea291ebb24412229cc2fe5.zip
Fix case of pg_dump -Fc to an unseekable file (such as a pipe).
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".
-rw-r--r--src/bin/pg_dump/pg_backup_custom.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/src/bin/pg_dump/pg_backup_custom.c b/src/bin/pg_dump/pg_backup_custom.c
index 72bdc3928b2..de4f023fa74 100644
--- a/src/bin/pg_dump/pg_backup_custom.c
+++ b/src/bin/pg_dump/pg_backup_custom.c
@@ -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;