From 986ad31b2dad78d2238a426904fcf9fbf120d2c8 Mon Sep 17 00:00:00 2001 From: Ron Minnich Date: Mon, 7 Nov 2011 11:42:13 -0500 Subject: [PATCH] gc: use HEADER_IO macro from gopack 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 | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/cmd/gc/lex.c b/src/cmd/gc/lex.c index 7c77045386..b1eab441c3 100644 --- a/src/cmd/gc/lex.c +++ b/src/cmd/gc/lex.c @@ -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 -- 2.50.0