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)