...
1 package tzdata
2
3 import (
4 "archive/tar"
5 "compress/gzip"
6 "fmt"
7 "io"
8 )
9
10 func ExtractTarGz(src io.Reader, dst io.Writer, name string) error {
11 uncompressedStream, err := gzip.NewReader(src)
12 if err != nil {
13 return fmt.Errorf("ExtractTarGz: NewReader failed")
14 }
15
16 tarReader := tar.NewReader(uncompressedStream)
17
18 for {
19 header, err := tarReader.Next()
20
21 if err == io.EOF {
22 return nil
23 }
24
25 if err != nil {
26 return fmt.Errorf("ExtractTarGz: Next() failed: %w", err)
27 }
28
29 switch header.Typeflag {
30 case tar.TypeDir:
31 return fmt.Errorf("ExtractTarGz: directories are not supported: %w", err)
32 case tar.TypeReg:
33 if header.Name == name {
34 if _, err := io.Copy(dst, tarReader); err != nil {
35 return fmt.Errorf("ExtractTarGz: Copy() failed: %w", err)
36 }
37 return nil
38 }
39 default:
40 return fmt.Errorf("ExtractTarGz: uknown type: %v in %v", header.Typeflag, header.Name)
41 }
42 }
43 }
44
View as plain text