From cb6d3f79501e3c03637ca49f4b980288771eabd3 Mon Sep 17 00:00:00 2001
From: Stelian Pop <stelian@popies.net>
Date: Wed, 8 Jun 2005 13:24:08 +0000
Subject: [PATCH] Fix big endian issues with EA/ACL

---
 CHANGES         |  5 ++++-
 restore/tape.c  |  6 ++++--
 restore/xattr.c | 40 +++++++++++++++++++++++++---------------
 3 files changed, 33 insertions(+), 18 deletions(-)

diff --git a/CHANGES b/CHANGES
index f2ce5fe..1c3488f 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,4 @@
-$Id: CHANGES,v 1.276 2005/06/08 09:34:33 stelian Exp $
+$Id: CHANGES,v 1.277 2005/06/08 13:24:08 stelian Exp $
 
 Changes between versions 0.4b40 and 0.4b41 (released ???????????)
 =================================================================
@@ -7,6 +7,9 @@ Changes between versions 0.4b40 and 0.4b41 (released ???????????)
 	code for EA works fine, but ACLs needed conversion from the
 	ext2/3 disk format to posix_acl format before restoring.
 
+2.	Fix some issues with restoration of EA on big endian
+	platforms.
+
 Changes between versions 0.4b39 and 0.4b40 (released May 2, 2005)
 =================================================================
 
diff --git a/restore/tape.c b/restore/tape.c
index e60921b..c74e390 100644
--- a/restore/tape.c
+++ b/restore/tape.c
@@ -42,7 +42,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-	"$Id: tape.c,v 1.89 2005/05/02 15:10:46 stelian Exp $";
+	"$Id: tape.c,v 1.90 2005/06/08 13:24:11 stelian Exp $";
 #endif /* not lint */
 
 #include <config.h>
@@ -346,6 +346,7 @@ setup(void)
 #endif
 	FLUSHTAPEBUF();
 	findtapeblksize();
+	cvtflag = 0;
 	if (gethead(&spcl) == FAIL) {
 		blkcnt--; /* push back this block */
 		blksread--;
@@ -2412,6 +2413,7 @@ findtapeblksize(void)
 		errx(1, "Tape read error on first record");
 
 	memcpy(&spclpt, tapebuf, TP_BSIZE);
+	cvtflag = 0;
 	if (converthead(&spclpt) == FAIL) {
 		cvtflag++;
 		if (converthead(&spclpt) == FAIL) {
@@ -2622,7 +2624,7 @@ converthead(struct s_spcl *buf)
 		if (checksum((int *)buf) == FAIL)
 			return (FAIL);
 		if (Bcvt)
-			swabst((u_char *)"8i4s31i528bi192b3i", (u_char *)buf);
+			swabst((u_char *)"8i4s1l29i528bi192b4i", (u_char *)buf);
 		goto good;
 	}
 	memcpy(&u_ospcl.s_ospcl, buf, TP_BSIZE);
diff --git a/restore/xattr.c b/restore/xattr.c
index 1182d85..290f8b9 100644
--- a/restore/xattr.c
+++ b/restore/xattr.c
@@ -29,7 +29,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-	"$Id: xattr.c,v 1.2 2005/06/08 09:34:40 stelian Exp $";
+	"$Id: xattr.c,v 1.3 2005/06/08 13:24:12 stelian Exp $";
 #endif /* not lint */
 
 #include <config.h>
@@ -308,15 +308,17 @@ posix_acl_to_xattr(const struct posix_acl *acl, void *buffer, size_t size) {
 	}
 
 	ext_acl->a_version = POSIX_ACL_XATTR_VERSION;
-	if (Bcvt) 
-		swabst("1i", (u_char *)ext_acl);
+#if BYTE_ORDER == BIG_ENDIAN
+	swabst("1i", (u_char *)ext_acl);
+#endif
 
 	for (n=0; n < acl->a_count; n++, ext_entry++) {
 		ext_entry->e_tag  = acl->a_entries[n].e_tag;
 		ext_entry->e_perm = acl->a_entries[n].e_perm;
 		ext_entry->e_id   = acl->a_entries[n].e_id;
-		if (Bcvt)
-			swabst("2s1i", (u_char *)ext_entry);
+#if BYTE_ORDER == BIG_ENDIAN
+		swabst("2s1i", (u_char *)ext_entry);
+#endif
 	}
 	return real_size;
 }
@@ -334,8 +336,9 @@ ext3_acl_from_disk(const void *value, size_t size)
 		fprintf(stderr, "ACL size too little\n");
 		return NULL;
 	}
-	if (Bcvt) 
-		swabst("1i", (u_char *)value);
+#if BYTE_ORDER == BIG_ENDIAN
+	swabst("1i", (u_char *)value);
+#endif
 	if (((ext3_acl_header *)value)->a_version != EXT3_ACL_VERSION) {
 		fprintf(stderr, "ACL version unknown\n");
 		return NULL;
@@ -356,9 +359,10 @@ ext3_acl_from_disk(const void *value, size_t size)
 	acl->a_count = count;
 
 	for (n=0; n < count; n++) {
-		if (Bcvt)
-			swabst("2s1i", (u_char *)value);
 		ext3_acl_entry *entry = (ext3_acl_entry *)value;
+#if BYTE_ORDER == BIG_ENDIAN
+		swabst("2s", (u_char *)entry);
+#endif
 		if ((char *)value + sizeof(ext3_acl_entry_short) > end)
 			goto fail;
 		acl->a_entries[n].e_tag  = entry->e_tag;
@@ -374,6 +378,9 @@ ext3_acl_from_disk(const void *value, size_t size)
 
 		case ACL_USER:
 		case ACL_GROUP:
+#if BYTE_ORDER == BIG_ENDIAN
+			swabst("4b1i", (u_char *)entry);
+#endif
 			value = (char *)value + sizeof(ext3_acl_entry);
 			if ((char *)value > end)
 				goto fail;
@@ -453,8 +460,9 @@ xattr_verify(char *buffer)
 
 	end = buffer + XATTR_MAXSIZE;
 
-	if (Bcvt)
-		swabst("4i", (u_char *)buffer);
+#if BYTE_ORDER == BIG_ENDIAN
+	swabst("4i", (u_char *)buffer);
+#endif
 
 	if (HDR(buffer)->h_magic != EXT2_XATTR_MAGIC &&
 	    HDR(buffer)->h_magic != EXT2_XATTR_MAGIC2) {
@@ -466,8 +474,9 @@ xattr_verify(char *buffer)
 
 	/* check the on-disk data structure */
 	entry = FIRST_ENTRY(buffer);
-	if (Bcvt) 
-		swabst("2b1s3i", (u_char *)entry);
+#if BYTE_ORDER == BIG_ENDIAN
+	swabst("2b1s3i", (u_char *)entry);
+#endif
 	while (!IS_LAST_ENTRY(entry)) {
 		struct ext2_xattr_entry *next = EXT2_XATTR_NEXT(entry);
 
@@ -476,8 +485,9 @@ xattr_verify(char *buffer)
 			return FAIL;
 		}
 		entry = next;
-		if (Bcvt) 
-			swabst("2b1s3i", (u_char *)entry);
+#if BYTE_ORDER == BIG_ENDIAN
+		swabst("2b1s3i", (u_char *)entry);
+#endif
 	}
 	return GOOD;
 }
-- 
2.39.5