41 lines
1.5 KiB
Go
41 lines
1.5 KiB
Go
package chrootarchive
|
|
|
|
import (
|
|
"io"
|
|
"strings"
|
|
|
|
"github.com/moby/go-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)
|
|
}
|