github.com/Prakhar-Agarwal-byte/moby@v0.0.0-20231027092010-a14e3e8ab87e/pkg/chrootarchive/archive_linux.go (about)

     1  package chrootarchive // import "github.com/Prakhar-Agarwal-byte/moby/pkg/chrootarchive"
     2  
     3  import (
     4  	"io"
     5  
     6  	"github.com/Prakhar-Agarwal-byte/moby/pkg/archive"
     7  	"github.com/pkg/errors"
     8  	"golang.org/x/sys/unix"
     9  )
    10  
    11  func doUnpack(decompressedArchive io.Reader, relDest, root string, options *archive.TarOptions) error {
    12  	done := make(chan error)
    13  	err := goInChroot(root, func() { done <- archive.Unpack(decompressedArchive, relDest, options) })
    14  	if err != nil {
    15  		return err
    16  	}
    17  	return <-done
    18  }
    19  
    20  func doPack(relSrc, root string, options *archive.TarOptions) (io.ReadCloser, error) {
    21  	tb, err := archive.NewTarballer(relSrc, options)
    22  	if err != nil {
    23  		return nil, errors.Wrap(err, "error processing tar file")
    24  	}
    25  	err = goInChroot(root, tb.Do)
    26  	if err != nil {
    27  		return nil, errors.Wrap(err, "could not chroot")
    28  	}
    29  	return tb.Reader(), nil
    30  }
    31  
    32  func doUnpackLayer(root string, layer io.Reader, options *archive.TarOptions) (int64, error) {
    33  	type result struct {
    34  		layerSize int64
    35  		err       error
    36  	}
    37  	done := make(chan result)
    38  
    39  	err := goInChroot(root, func() {
    40  		// We need to be able to set any perms
    41  		_ = unix.Umask(0)
    42  
    43  		size, err := archive.UnpackLayer("/", layer, options)
    44  		done <- result{layerSize: size, err: err}
    45  	})
    46  	if err != nil {
    47  		return 0, err
    48  	}
    49  
    50  	res := <-done
    51  
    52  	return res.layerSize, res.err
    53  }