tno anon union - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 613093289d311dd241b92c15892be270493cb32f
 (DIR) parent 6019a96c7867a30b6968c9ebe9276b1025e157df
 (HTM) Author: rsc <devnull@localhost>
       Date:   Fri, 31 Mar 2006 14:37:04 +0000
       
       no anon union
       
       Diffstat:
         M src/cmd/tar.c                       |      59 ++++++++++++++++---------------
       
       1 file changed, 30 insertions(+), 29 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/tar.c b/src/cmd/tar.c
       t@@ -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];
       t@@ -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 */
       t@@ -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;
        }
        
       t@@ -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);
       t@@ -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);
                                /*
       t@@ -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);
       t@@ -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;
       t@@ -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++;