diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2014-05-05 11:26:41 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2014-05-05 11:26:41 -0400 |
commit | e03485ae8a2025d5deea291ebb24412229cc2fe5 (patch) | |
tree | adf4024e2c81ed2d516e6ae42e73264fb112b601 | |
parent | f8db074049be74fa100b4f97d09ee76222660e7c (diff) | |
download | postgresql-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.c | 22 |
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; |