]> Cypherpunks repositories - gostls13.git/commitdiff
Add support for v7 tar.
authorDavid Symonds <dsymonds@golang.org>
Tue, 7 Jul 2009 05:59:31 +0000 (22:59 -0700)
committerDavid Symonds <dsymonds@golang.org>
Tue, 7 Jul 2009 05:59:31 +0000 (22:59 -0700)
R=rsc
APPROVED=rsc
DELTA=32  (26 added, 4 deleted, 2 changed)
OCL=31172
CL=31242

src/pkg/archive/tar/testdata/v7.tar [new file with mode: 0644]
src/pkg/archive/tar/untar.go
src/pkg/archive/tar/untar_test.go

diff --git a/src/pkg/archive/tar/testdata/v7.tar b/src/pkg/archive/tar/testdata/v7.tar
new file mode 100644 (file)
index 0000000..dd33f92
Binary files /dev/null and b/src/pkg/archive/tar/testdata/v7.tar differ
index e662971a4f0f2680e2670009c5fda3114281d494..3ebfc5e562b118bde5b8f9ecd23a506ebebb236a 100644 (file)
@@ -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 {
index 11f7735f124c222560b061c2db60fe5181366e00..9a42c9c9269dc510170294fc884de42ce408768d 100644 (file)
@@ -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) {