From: David Symonds Date: Tue, 7 Jul 2009 05:59:31 +0000 (-0700) Subject: Add support for v7 tar. X-Git-Tag: weekly.2009-11-06~1242 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=52ccdf3510a1c2920a4398ca032ead3c57657d51;p=gostls13.git Add support for v7 tar. R=rsc APPROVED=rsc DELTA=32 (26 added, 4 deleted, 2 changed) OCL=31172 CL=31242 --- diff --git a/src/pkg/archive/tar/testdata/v7.tar b/src/pkg/archive/tar/testdata/v7.tar new file mode 100644 index 0000000000..dd33f92ffa Binary files /dev/null and b/src/pkg/archive/tar/testdata/v7.tar differ diff --git a/src/pkg/archive/tar/untar.go b/src/pkg/archive/tar/untar.go index e662971a4f..3ebfc5e562 100644 --- a/src/pkg/archive/tar/untar.go +++ b/src/pkg/archive/tar/untar.go @@ -4,7 +4,7 @@ // The tar package implements access to tar archives. // It aims to cover most of the variations, including those produced -// by GNU and BSD tars (not yet started). +// by GNU and BSD tars. // // References: // http://www.freebsd.org/cgi/man.cgi?query=tar&sektion=5 @@ -12,8 +12,7 @@ package tar // TODO(dsymonds): -// - Make it seekable. -// - Extensions. +// - pax extensions import ( "bufio"; @@ -211,9 +210,6 @@ func (tr *Reader) readHeader() *Header { hdr := new(Header); s := slicer(header); - // TODO(dsymonds): The format of the header depends on the value of magic (hdr[257:262]), - // so use that value to do the correct parsing below. - hdr.Name = cString(s.next(100)); hdr.Mode = tr.octal(s.next(8)); hdr.Uid = tr.octal(s.next(8)); @@ -225,6 +221,8 @@ func (tr *Reader) readHeader() *Header { hdr.Linkname = cString(s.next(100)); // The remainder of the header depends on the value of magic. + // The original (v7) version of tar had no explicit magic field, + // so its magic bytes, like the rest of the block, are NULs. magic := string(s.next(8)); // contains version field as well. var format string; switch magic { diff --git a/src/pkg/archive/tar/untar_test.go b/src/pkg/archive/tar/untar_test.go index 11f7735f12..9a42c9c926 100644 --- a/src/pkg/archive/tar/untar_test.go +++ b/src/pkg/archive/tar/untar_test.go @@ -79,6 +79,29 @@ var untarTests = []*untarTest{ }, }, }, + &untarTest{ + file: "testdata/v7.tar", + headers: []*Header{ + &Header{ + Name: "small.txt", + Mode: 0640, + Uid: 73025, + Gid: 5000, + Size: 5, + Mtime: 1246508266, + Typeflag: '\x00', + }, + &Header{ + Name: "small2.txt", + Mode: 0640, + Uid: 73025, + Gid: 5000, + Size: 11, + Mtime: 1245217492, + Typeflag: '\x00', + }, + }, + }, }; func TestAll(t *testing.T) {