From 613093289d311dd241b92c15892be270493cb32f Mon Sep 17 00:00:00 2001 From: rsc Date: Fri, 31 Mar 2006 14:37:04 +0000 Subject: no anon union --- src/cmd/tar.c | 59 ++++++++++++++++++++++++++++++----------------------------- 1 file changed, 30 insertions(+), 29 deletions(-) (limited to 'src/cmd') diff --git a/src/cmd/tar.c b/src/cmd/tar.c index 576db677..1306ed41 100644 --- a/src/cmd/tar.c +++ b/src/cmd/tar.c @@ -78,31 +78,30 @@ enum { #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]; - - /* 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 */ - }; +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 */ + + char pad[12]; } Hdr; -typedef struct { +typedef struct Compress { char *comp; char *decomp; char *sfx[4]; @@ -115,7 +114,7 @@ static Compress comps[] = { ".tar.bz2",".tbz2" }, }; -typedef struct { +typedef struct Pushstate { int kid; int fd; /* original fd */ int rfd; /* replacement fd */ @@ -327,7 +326,7 @@ getblkz(int ar) Hdr *hp = getblke(ar); if (hp != nil) - memset(hp->data, 0, Tblock); + memset(hp, 0, Tblock); return hp; } @@ -400,7 +399,7 @@ chksum(Hdr *hp) { 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 @@ addtoar(int ar, char *file, char *shortf) 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 @@ addtoar(int ar, char *file, char *shortf) * 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 @@ extract1(int ar, Hdr *hp, char *fname) 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 @@ main(int argc, char *argv[]) fmtinstall('M', dirmodefmt); + if(sizeof(Hdr) != Tblock) + sysfatal("padding in hdr should be %d", Tblock-sizeof(Hdr)+sizeof(curblk->pad)); TARGBEGIN { case 'c': docreate++; -- cgit v1.2.3