dotcloud/docker

View on GitHub
pkg/chrootarchive/archive_windows.go

Summary

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

import (
    "io"
    "strings"

    "github.com/docker/docker/pkg/archive"
)

// longPathPrefix is the longpath prefix for Windows file paths.
const longPathPrefix = `\\?\`

// addLongPathPrefix adds the Windows long path prefix to the path provided if
// it does not already have it. It is a no-op on platforms other than Windows.
//
// addLongPathPrefix is a copy of [github.com/docker/docker/pkg/longpath.AddPrefix].
func addLongPathPrefix(srcPath string) string {
    if strings.HasPrefix(srcPath, longPathPrefix) {
        return srcPath
    }
    if strings.HasPrefix(srcPath, `\\`) {
        // This is a UNC path, so we need to add 'UNC' to the path as well.
        return longPathPrefix + `UNC` + srcPath[1:]
    }
    return longPathPrefix + srcPath
}

func invokeUnpack(decompressedArchive io.ReadCloser, dest string, options *archive.TarOptions, root string) error {
    // Windows is different to Linux here because Windows does not support
    // chroot. Hence there is no point sandboxing a chrooted process to
    // do the unpack. We call inline instead within the daemon process.
    return archive.Unpack(decompressedArchive, addLongPathPrefix(dest), options)
}

func invokePack(srcPath string, options *archive.TarOptions, root string) (io.ReadCloser, error) {
    // Windows is different to Linux here because Windows does not support
    // chroot. Hence there is no point sandboxing a chrooted process to
    // do the pack. We call inline instead within the daemon process.
    return archive.TarWithOptions(srcPath, options)
}