From fc5c577e34a53af8104415bae63d315fee2b125a Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Fri, 25 Oct 2002 01:33:17 +0000
Subject: [PATCH] Allow fseeko in pg_dump only if fseeko() will work for all
 supported file sizes.

---
 src/bin/pg_dump/common.c             |  4 ++--
 src/bin/pg_dump/pg_backup_archiver.c | 28 +++++++++++++++++++++++++++-
 src/bin/pg_dump/pg_backup_archiver.h |  4 +++-
 src/bin/pg_dump/pg_backup_custom.c   |  6 +++---
 src/bin/pg_dump/pg_backup_files.c    |  6 +++---
 src/bin/pg_dump/pg_backup_tar.c      |  6 +++---
 6 files changed, 41 insertions(+), 13 deletions(-)

diff --git a/src/bin/pg_dump/common.c b/src/bin/pg_dump/common.c
index 7870a0d66d..a703660aa2 100644
--- a/src/bin/pg_dump/common.c
+++ b/src/bin/pg_dump/common.c
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/bin/pg_dump/common.c,v 1.71 2002/10/09 16:20:25 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/bin/pg_dump/common.c,v 1.72 2002/10/25 01:33:17 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -290,7 +290,7 @@ flagInhAttrs(TableInfo *tblinfo, int numTables,
 		 * attr with the same name, then only dump it if:
 		 *
 		 * - it is NOT NULL and zero parents are NOT NULL
-		 *   OR 
+		 *   OR
 		 * - it has a default value AND the default value does not match
 		 *   all parent default values, or no parents specify a default.
 		 *
diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c
index d56ebdcd06..c5cfa2f405 100644
--- a/src/bin/pg_dump/pg_backup_archiver.c
+++ b/src/bin/pg_dump/pg_backup_archiver.c
@@ -15,7 +15,7 @@
  *
  *
  * IDENTIFICATION
- *		$Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.59 2002/10/22 19:15:23 momjian Exp $
+ *		$Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.60 2002/10/25 01:33:17 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2338,6 +2338,32 @@ ReadHead(ArchiveHandle *AH)
 }
 
 
+/*
+ * checkSeek
+ *	  check to see if fseek can be performed.
+ */
+
+bool
+checkSeek(FILE *fp)
+{
+
+	if (fseek(fp, 0, SEEK_CUR) != 0)
+		return false;
+	else if (sizeof(off_t) > sizeof(long))
+	/*
+	 *	At this point, off_t is too large for long, so we return
+	 *	based on whether an off_t version of fseek is available.
+	 */
+#ifdef HAVE_FSEEKO
+		return true;
+#else
+		return false;
+#endif
+	else
+		return true;
+}
+
+
 static void
 _SortToc(ArchiveHandle *AH, TocSortCompareFn fn)
 {
diff --git a/src/bin/pg_dump/pg_backup_archiver.h b/src/bin/pg_dump/pg_backup_archiver.h
index 980d262e93..73b5c29c32 100644
--- a/src/bin/pg_dump/pg_backup_archiver.h
+++ b/src/bin/pg_dump/pg_backup_archiver.h
@@ -17,7 +17,7 @@
  *
  *
  * IDENTIFICATION
- *		$Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.h,v 1.48 2002/10/22 19:15:23 momjian Exp $
+ *		$Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.h,v 1.49 2002/10/25 01:33:17 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -27,6 +27,7 @@
 
 #include "postgres_fe.h"
 
+#include <stdio.h>
 #include <time.h>
 #include <errno.h>
 
@@ -284,6 +285,7 @@ extern void ReadToc(ArchiveHandle *AH);
 extern void WriteDataChunks(ArchiveHandle *AH);
 
 extern int	TocIDRequired(ArchiveHandle *AH, int id, RestoreOptions *ropt);
+extern bool checkSeek(FILE *fp);
 
 /*
  * Mandatory routines for each supported format
diff --git a/src/bin/pg_dump/pg_backup_custom.c b/src/bin/pg_dump/pg_backup_custom.c
index 873bfb59ce..c2fcef7536 100644
--- a/src/bin/pg_dump/pg_backup_custom.c
+++ b/src/bin/pg_dump/pg_backup_custom.c
@@ -19,7 +19,7 @@
  *
  *
  * IDENTIFICATION
- *		$Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_custom.c,v 1.22 2002/10/22 19:15:23 momjian Exp $
+ *		$Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_custom.c,v 1.23 2002/10/25 01:33:17 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -179,7 +179,7 @@ InitArchiveFmt_Custom(ArchiveHandle *AH)
 		if (!AH->FH)
 			die_horribly(AH, modulename, "could not open archive file %s: %s\n", AH->fSpec, strerror(errno));
 
-		ctx->hasSeek = (fseeko(AH->FH, 0, SEEK_CUR) == 0);
+		ctx->hasSeek = checkSeek(AH->FH);
 	}
 	else
 	{
@@ -190,7 +190,7 @@ InitArchiveFmt_Custom(ArchiveHandle *AH)
 		if (!AH->FH)
 			die_horribly(AH, modulename, "could not open archive file %s: %s\n", AH->fSpec, strerror(errno));
 
-		ctx->hasSeek = (fseeko(AH->FH, 0, SEEK_CUR) == 0);
+		ctx->hasSeek = checkSeek(AH->FH);
 
 		ReadHead(AH);
 		ReadToc(AH);
diff --git a/src/bin/pg_dump/pg_backup_files.c b/src/bin/pg_dump/pg_backup_files.c
index 1bcb16ca00..3a4914828a 100644
--- a/src/bin/pg_dump/pg_backup_files.c
+++ b/src/bin/pg_dump/pg_backup_files.c
@@ -20,7 +20,7 @@
  *
  *
  * IDENTIFICATION
- *		$Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_files.c,v 1.20 2002/10/22 19:15:23 momjian Exp $
+ *		$Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_files.c,v 1.21 2002/10/25 01:33:17 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -129,7 +129,7 @@ InitArchiveFmt_Files(ArchiveHandle *AH)
 		if (AH->FH == NULL)
 			die_horribly(NULL, modulename, "could not open output file: %s\n", strerror(errno));
 
-		ctx->hasSeek = (fseeko(AH->FH, 0, SEEK_CUR) == 0);
+		ctx->hasSeek = checkSeek(AH->FH);
 
 		if (AH->compression < 0 || AH->compression > 9)
 			AH->compression = Z_DEFAULT_COMPRESSION;
@@ -147,7 +147,7 @@ InitArchiveFmt_Files(ArchiveHandle *AH)
 		if (AH->FH == NULL)
 			die_horribly(NULL, modulename, "could not open input file: %s\n", strerror(errno));
 
-		ctx->hasSeek = (fseeko(AH->FH, 0, SEEK_CUR) == 0);
+		ctx->hasSeek = checkSeek(AH->FH);
 
 		ReadHead(AH);
 		ReadToc(AH);
diff --git a/src/bin/pg_dump/pg_backup_tar.c b/src/bin/pg_dump/pg_backup_tar.c
index fdfcc95d4b..6bbd1ba2a3 100644
--- a/src/bin/pg_dump/pg_backup_tar.c
+++ b/src/bin/pg_dump/pg_backup_tar.c
@@ -16,7 +16,7 @@
  *
  *
  * IDENTIFICATION
- *		$Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_tar.c,v 1.31 2002/10/22 19:15:23 momjian Exp $
+ *		$Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_tar.c,v 1.32 2002/10/25 01:33:17 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -190,7 +190,7 @@ InitArchiveFmt_Tar(ArchiveHandle *AH)
 		 */
 		/* setvbuf(ctx->tarFH, NULL, _IONBF, 0); */
 
-		ctx->hasSeek = (fseeko(ctx->tarFH, 0, SEEK_CUR) == 0);
+		ctx->hasSeek = checkSeek(ctx->tarFH);
 
 		if (AH->compression < 0 || AH->compression > 9)
 			AH->compression = Z_DEFAULT_COMPRESSION;
@@ -227,7 +227,7 @@ InitArchiveFmt_Tar(ArchiveHandle *AH)
 
 		ctx->tarFHpos = 0;
 
-		ctx->hasSeek = (fseeko(ctx->tarFH, 0, SEEK_CUR) == 0);
+		ctx->hasSeek = checkSeek(ctx->tarFH);
 
 		/*
 		 * Forcibly unmark the header as read since we use the lookahead
-- 
2.50.1