]> Cypherpunks repositories - gostls13.git/commitdiff
gc: use HEADER_IO macro from gopack
authorRon Minnich <rminnich@gmail.com>
Mon, 7 Nov 2011 16:42:13 +0000 (11:42 -0500)
committerRuss Cox <rsc@golang.org>
Mon, 7 Nov 2011 16:42:13 +0000 (11:42 -0500)
Use HEADER_IO macro from gopack to read archive header
The HEADER_IO macro portably reads archive headers. The
current arsize code fails in the case of archive headers produced
on plan 9 6c and read on other systems (it's not portable).
Modify lex.c to use the portable macro
Build tested (including tests) on OSX.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5323072

src/cmd/gc/lex.c

index 7c770453864c6184d0c18144a515992c37d45e27..b1eab441c3d1bde4aa626ce10b19b17e0e86f67c 100644 (file)
@@ -380,18 +380,30 @@ saveerrors(void)
        nerrors = 0;
 }
 
+/*
+ *     macro to portably read/write archive header.
+ *     'cmd' is read/write/Bread/Bwrite, etc.
+ */
+#define        HEADER_IO(cmd, f, h)    cmd(f, h.name, sizeof(h.name)) != sizeof(h.name)\
+                               || cmd(f, h.date, sizeof(h.date)) != sizeof(h.date)\
+                               || cmd(f, h.uid, sizeof(h.uid)) != sizeof(h.uid)\
+                               || cmd(f, h.gid, sizeof(h.gid)) != sizeof(h.gid)\
+                               || cmd(f, h.mode, sizeof(h.mode)) != sizeof(h.mode)\
+                               || cmd(f, h.size, sizeof(h.size)) != sizeof(h.size)\
+                               || cmd(f, h.fmag, sizeof(h.fmag)) != sizeof(h.fmag)
+
 static int
 arsize(Biobuf *b, char *name)
 {
-       struct ar_hdr *a;
+       struct ar_hdr a;
 
-       if((a = Brdline(b, '\n')) == nil)
+       if (HEADER_IO(Bread, b, a))
                return -1;
-       if(Blinelen(b) != sizeof(struct ar_hdr))
-               return -1;
-       if(strncmp(a->name, name, strlen(name)) != 0)
+
+       if(strncmp(a.name, name, strlen(name)) != 0)
                return -1;
-       return atoi(a->size);
+
+       return atoi(a.size);
 }
 
 static int