no anon union
diff --git a/src/cmd/tar.c b/src/cmd/tar.c
index 576db67..1306ed4 100644
--- a/src/cmd/tar.c
+++ b/src/cmd/tar.c
@@ -78,31 +78,30 @@
 #define isreallink(lf)	((lf) == LF_LINK)
 #define issymlink(lf)	((lf) == LF_SYMLINK1 || (lf) == LF_SYMLINK2)
 
-typedef union {
-	uchar	data[Tblock];
-	struct {
-		char	name[Namsiz];
-		char	mode[8];
-		char	uid[8];
-		char	gid[8];
-		char	size[12];
-		char	mtime[12];
-		char	chksum[8];
-		char	linkflag;
-		char	linkname[Namsiz];
+typedef struct Hdr {
+	char	name[Namsiz];
+	char	mode[8];
+	char	uid[8];
+	char	gid[8];
+	char	size[12];
+	char	mtime[12];
+	char	chksum[8];
+	char	linkflag;
+	char	linkname[Namsiz];
 
-		/* rest are defined by POSIX's ustar format; see p1003.2b */
-		char	magic[6];	/* "ustar" */
-		char	version[2];
-		char	uname[32];
-		char	gname[32];
-		char	devmajor[8];
-		char	devminor[8];
-		char	prefix[Maxpfx]; /* if non-null, path= prefix "/" name */
-	};
+	/* rest are defined by POSIX's ustar format; see p1003.2b */
+	char	magic[6];	/* "ustar" */
+	char	version[2];
+	char	uname[32];
+	char	gname[32];
+	char	devmajor[8];
+	char	devminor[8];
+	char	prefix[Maxpfx]; /* if non-null, path= prefix "/" name */
+	
+	char pad[12];
 } Hdr;
 
-typedef struct {
+typedef struct Compress {
 	char	*comp;
 	char	*decomp;
 	char	*sfx[4];
@@ -115,7 +114,7 @@
 					  ".tar.bz2",".tbz2" },
 };
 
-typedef struct {
+typedef struct Pushstate {
 	int	kid;
 	int	fd;	/* original fd */
 	int	rfd;	/* replacement fd */
@@ -327,7 +326,7 @@
 	Hdr *hp = getblke(ar);
 
 	if (hp != nil)
-		memset(hp->data, 0, Tblock);
+		memset(hp, 0, Tblock);
 	return hp;
 }
 
@@ -400,7 +399,7 @@
 {
 	int n = Tblock;
 	long i = 0;
-	uchar *cp = hp->data;
+	uchar *cp = (uchar*)hp;
 	char oldsum[sizeof hp->chksum];
 
 	memmove(oldsum, hp->chksum, sizeof oldsum);
@@ -736,7 +735,7 @@
 			hbp = getblke(ar);
 			blksread = gothowmany(blksleft);
 			bytes = blksread * Tblock;
-			n = readn(fd, hbp->data, bytes);
+			n = readn(fd, hbp, bytes);
 			if (n < 0)
 				sysfatal("error reading %s: %r", file);
 			/*
@@ -744,7 +743,7 @@
 			 * compression and emergency recovery of data.
 			 */
 			if (n < Tblock)
-				memset(hbp->data + n, 0, bytes - n);
+				memset((uchar*)hbp + n, 0, bytes - n);
 			putblkmany(ar, blksread);
 		}
 		close(fd);
@@ -1008,7 +1007,7 @@
 		wrbytes = Tblock*blksread;
 		if(wrbytes > bytes)
 			wrbytes = bytes;
-		if (fd >= 0 && write(fd, hbp->data, wrbytes) != wrbytes)
+		if (fd >= 0 && write(fd, hbp, wrbytes) != wrbytes)
 			sysfatal("write error on %s: %r", fname);
 		putreadblks(ar, blksread);
 		bytes -= wrbytes;
@@ -1097,6 +1096,8 @@
 
 	fmtinstall('M', dirmodefmt);
 
+	if(sizeof(Hdr) != Tblock)
+		sysfatal("padding in hdr should be %d", Tblock-sizeof(Hdr)+sizeof(curblk->pad));
 	TARGBEGIN {
 	case 'c':
 		docreate++;