From 9e421237c423d83596d39b8f17f03e9218de180c Mon Sep 17 00:00:00 2001 From: Tudor Marcu Date: Thu, 9 Aug 2018 15:10:29 -0700 Subject: [PATCH] Add zstd to reader Signed-off-by: Tudor Marcu --- swupd/archive.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/swupd/archive.go b/swupd/archive.go index 0cee25b..60483ab 100644 --- a/swupd/archive.go +++ b/swupd/archive.go @@ -29,6 +29,8 @@ var ( gzipMagic = []byte{0x1F, 0x8B} xzMagic = []byte{0xFD, '7', 'z', 'X', 'Z', 0x00} bzip2Magic = []byte{'B', 'Z', 'h'} + // https://github.com/facebook/zstd/blob/dev/lib/zstd.h#L385 + zstdMagic = []byte{0x28, 0xB5, 0x2F, 0xFD} ) // NewCompressedTarReader creates a struct compatible with tar.Reader reading from uncompressed or @@ -44,7 +46,6 @@ func NewCompressedTarReader(rs io.ReadSeeker) (*CompressedTarReader, error) { return nil, err } result := &CompressedTarReader{} - switch { case bytes.HasPrefix(h[:], gzipMagic): gr, err := gzip.NewReader(rs) @@ -63,6 +64,13 @@ func NewCompressedTarReader(rs io.ReadSeeker) (*CompressedTarReader, error) { case bytes.HasPrefix(h[:], bzip2Magic): br := bzip2.NewReader(rs) result.Reader = tar.NewReader(br) + case bytes.HasPrefix(h[:], zstdMagic): + zr, err := NewExternalReader(rs, "zstd", "-d") + if err != nil { + return nil, fmt.Errorf("couldn't decompress using zstd: %s", err) + } + result.CompressionCloser = zr + result.Reader = tar.NewReader(zr) default: // Assume uncompressed tar and let it complain if not valid. result.Reader = tar.NewReader(rs)