func unpackJar()

in wrappers/golang/pgadapter.go [542:595]


func unpackJar(ctx context.Context, tarGzFile string) error {
	dst := filepath.Dir(tarGzFile)
	reader, err := os.Open(tarGzFile)
	if err != nil {
		return err
	}
	gzr, err := gzip.NewReader(reader)
	if err != nil {
		return err
	}
	defer gzr.Close()

	tr := tar.NewReader(gzr)
	for {
		header, err := tr.Next()
		switch {
		// if no more files are found return
		case err == io.EOF:
			return nil
		// return any other error
		case err != nil:
			return err
		case header == nil:
			continue
		}
		// Make sure that there are no relative paths in the gzipped file that could overwrite any existing files on
		// this system.
		if strings.Contains(header.Name, "..") {
			return fmt.Errorf("zipped file contains relative path: %s", header.Name)
		}
		target := filepath.Join(dst, header.Name)

		// check the file type
		switch header.Typeflag {
		// if it's a dir, and it doesn't exist, then create it
		case tar.TypeDir:
			if _, err := os.Stat(target); err != nil {
				if err := os.MkdirAll(target, 0755); err != nil {
					return err
				}
			}
		// if it's a file create it
		case tar.TypeReg:
			f, err := os.OpenFile(target, os.O_CREATE|os.O_RDWR, os.FileMode(header.Mode))
			if err != nil {
				return err
			}
			if _, err := io.Copy(f, tr); err != nil {
				return err
			}
			_ = f.Close()
		}
	}
}