dotcloud/docker

View on GitHub
pkg/chrootarchive/archive_linux.go

Summary

Maintainability
A
0 mins
Test Coverage
package chrootarchive // import "github.com/docker/docker/pkg/chrootarchive"

import (
    "io"

    "github.com/docker/docker/pkg/archive"
    "github.com/pkg/errors"
    "golang.org/x/sys/unix"
)

func doUnpack(decompressedArchive io.Reader, relDest, root string, options *archive.TarOptions) error {
    done := make(chan error)
    err := goInChroot(root, func() { done <- archive.Unpack(decompressedArchive, relDest, options) })
    if err != nil {
        return err
    }
    return <-done
}

func doPack(relSrc, root string, options *archive.TarOptions) (io.ReadCloser, error) {
    tb, err := archive.NewTarballer(relSrc, options)
    if err != nil {
        return nil, errors.Wrap(err, "error processing tar file")
    }
    err = goInChroot(root, tb.Do)
    if err != nil {
        return nil, errors.Wrap(err, "could not chroot")
    }
    return tb.Reader(), nil
}

func doUnpackLayer(root string, layer io.Reader, options *archive.TarOptions) (int64, error) {
    type result struct {
        layerSize int64
        err       error
    }
    done := make(chan result)

    err := goInChroot(root, func() {
        // We need to be able to set any perms
        _ = unix.Umask(0)

        size, err := archive.UnpackLayer("/", layer, options)
        done <- result{layerSize: size, err: err}
    })
    if err != nil {
        return 0, err
    }

    res := <-done

    return res.layerSize, res.err
}