From 9cbb5fcd2b1aa0affc19394fd5b007ed94965ec5 Mon Sep 17 00:00:00 2001
From: Philip Warner <pjw@rhyme.com.au>
Date: Tue, 24 Oct 2000 13:24:30 +0000
Subject: [PATCH] Various fixes to TAR header format Fix for endian bug in TAR
 output Nicer error messages in pg_dump

---
 src/bin/pg_dump/pg_backup_archiver.h |  2 +-
 src/bin/pg_dump/pg_backup_tar.c      | 30 +++++++++++++++++-----------
 src/bin/pg_dump/pg_dump.c            | 20 +++++++++++++++++--
 3 files changed, 37 insertions(+), 15 deletions(-)

diff --git a/src/bin/pg_dump/pg_backup_archiver.h b/src/bin/pg_dump/pg_backup_archiver.h
index e82cae170f5..417c50bf68a 100644
--- a/src/bin/pg_dump/pg_backup_archiver.h
+++ b/src/bin/pg_dump/pg_backup_archiver.h
@@ -62,7 +62,7 @@ typedef z_stream *z_streamp;
 
 #define K_VERS_MAJOR 1
 #define K_VERS_MINOR 4 
-#define K_VERS_REV 19 
+#define K_VERS_REV 20 
 
 /* Data block types */
 #define BLK_DATA 1
diff --git a/src/bin/pg_dump/pg_backup_tar.c b/src/bin/pg_dump/pg_backup_tar.c
index 6a3b2122064..674c24191dc 100644
--- a/src/bin/pg_dump/pg_backup_tar.c
+++ b/src/bin/pg_dump/pg_backup_tar.c
@@ -673,8 +673,8 @@ static void	_LoadBlobs(ArchiveHandle* AH, RestoreOptions *ropt)
 static int	_WriteByte(ArchiveHandle* AH, const int i)
 {
     lclContext*		ctx = (lclContext*)AH->formatData;
-    int			res;
-	int			b = i;
+    int				res;
+	char			b = i; /* Avoid endian problems */
 
     res = tarWrite(&b, 1, ctx->FH);
     if (res != EOF) {
@@ -1088,28 +1088,34 @@ static void _tarWriteHeader(TAR_MEMBER* th)
 	sprintf(&h[100], "100600 ");
 
 	/* User ID 8 */
-	sprintf(&h[108], "     0 ");
+	sprintf(&h[108], " 04000 ");
 
 	/* Group 8 */
-	sprintf(&h[116], "     0 ");
+	sprintf(&h[116], " 02000 ");
 
 	/* File size 12 */
-	sprintf(&h[124], "%12o", th->fileLen);
+	sprintf(&h[124], "%10o ", th->fileLen);
 
 	/* Mod Time 12 */
-	sprintf(&h[136], "%12o", (int)time(NULL));
+	sprintf(&h[136], "%10o ", (int)time(NULL));
 
 	/* Checksum 8 */
-	sprintf(&h[148], "%8o", lastSum);
+	sprintf(&h[148], "%6o ", lastSum);
 
-	/* Link 1 */
-	sprintf(&h[156], "%c", LF_NORMAL);
+	/* Type 1 */
+	/* sprintf(&h[156], "%c", LF_NORMAL); */
+	sprintf(&h[156], "0");
 
 	/* Link name 100 (NULL) */
 
 	/* Magic 8 */
 	sprintf(&h[257], "ustar  ");
 
+	/* GNU Version...
+	 * sprintf(&h[257], "ustar");
+	 * sprintf(&h[263], "00");
+	*/
+
 	/* User 32 */
 	sprintf(&h[265], "%.31s", ""); /* How do I get username reliably? Do I need to? */
 
@@ -1117,15 +1123,15 @@ static void _tarWriteHeader(TAR_MEMBER* th)
 	sprintf(&h[297], "%.31s", ""); /* How do I get group reliably? Do I need to? */
 
 	/* Maj Dev 8 */
-	/* sprintf(&h[329], "%8o", 0); */
+	/* sprintf(&h[329], "%6o ", 0); */
 
 	/* Min Dev */
-	/* sprintf(&h[337], "%8o", 0); */
+	/* sprintf(&h[337], "%6o ", 0); */
 
 
 	while ( (sum = _tarChecksum(h)) != lastSum)
 	{
-		sprintf(&h[148], "%8o", sum);
+		sprintf(&h[148], "%6o ", sum);
 		lastSum = sum;
 	}
 
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 0d2c1612805..0ae0ee00144 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -22,7 +22,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.175 2000/10/24 01:38:32 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.176 2000/10/24 13:24:30 pjw Exp $
  *
  * Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb
  *
@@ -696,7 +696,7 @@ main(int argc, char **argv)
 	if (strcmp(progname, "pg_backup") == 0)
 	{
 		format = "c";
-		outputBlobs = 1;
+		outputBlobs = true;
 	}
 
 #ifdef HAVE_GETOPT_LONG
@@ -864,6 +864,14 @@ main(int argc, char **argv)
 		}
 	}
 
+	if (optind < (argc - 1)) {
+		fprintf(stderr,
+				"%s: extra parameters found on command line after '%s' (first is '%s').\n"
+			    "Please respecify command.\nUse -? for help on invocation options.\n",
+				progname, argv[optind], argv[optind+1]);
+		exit(1);
+	}
+
 	if (dataOnly && schemaOnly)
 	{
 		fprintf(stderr,
@@ -888,6 +896,14 @@ main(int argc, char **argv)
 		exit(1);
 	}
 
+	if (outputBlobs == true && (format[0] == 'p' || format[0] == 'P') )
+	{
+		fprintf(stderr,
+			"%s: BLOB output is not supported for plain text dump files. Use a different output format.\n",
+			progname);
+		exit(1);
+	}
+
 	/* open the output file */
 	switch (format[0]) {
 
-- 
GitLab