16
"github.com/siderolabs/talos/pkg/safepath"
22
func Untar(ctx context.Context, r io.Reader, rootPath string) error {
23
tr := tar.NewReader(r)
38
return fmt.Errorf("error reading tar header: %s", err)
41
hdrPath := safepath.CleanPath(hdr.Name)
43
return errors.New("empty tar header path")
46
path := filepath.Join(rootPath, hdrPath)
50
mode := hdr.FileInfo().Mode()
53
if err = os.Mkdir(path, mode); err != nil {
54
return fmt.Errorf("error creating directory %q mode %s: %w", path, mode, err)
57
if err = os.Chmod(path, mode); err != nil {
58
return fmt.Errorf("error updating mode %s for %q: %w", mode, path, err)
62
if err = os.Symlink(hdr.Linkname, path); err != nil {
63
return fmt.Errorf("error creating symlink %q -> %q: %w", path, hdr.Linkname, err)
67
mode := hdr.FileInfo().Mode()
69
fp, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_EXCL, mode)
71
return fmt.Errorf("error creating file %q mode %s: %w", path, mode, err)
74
_, err = io.Copy(fp, tr)
76
return fmt.Errorf("error copying data to %q: %w", path, err)
79
if err = fp.Close(); err != nil {
80
return fmt.Errorf("error closing %q: %w", path, err)
83
if err = os.Chmod(path, mode); err != nil {
84
return fmt.Errorf("error updating mode %s for %q: %w", mode, path, err)