mirror of
https://github.com/containers/podman.git
synced 2025-05-22 09:36:57 +08:00

We now use the golang error wrapping format specifier `%w` instead of the deprecated github.com/pkg/errors package. [NO NEW TESTS NEEDED] Signed-off-by: Sascha Grunert <sgrunert@redhat.com>
60 lines
1.6 KiB
Go
60 lines
1.6 KiB
Go
package specgen
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
"unicode"
|
|
)
|
|
|
|
func isHostWinPath(path string) bool {
|
|
return shouldResolveWinPaths() && strings.HasPrefix(path, `\\`) || hasWinDriveScheme(path, 0) || winPathExists(path)
|
|
}
|
|
|
|
func hasWinDriveScheme(path string, start int) bool {
|
|
if len(path) < start+2 || path[start+1] != ':' {
|
|
return false
|
|
}
|
|
|
|
drive := rune(path[start])
|
|
return drive < unicode.MaxASCII && unicode.IsLetter(drive)
|
|
}
|
|
|
|
// Converts a Windows path to a WSL guest path if local env is a WSL linux guest or this is a Windows client.
|
|
func ConvertWinMountPath(path string) (string, error) {
|
|
if !shouldResolveWinPaths() {
|
|
return path, nil
|
|
}
|
|
|
|
if strings.HasPrefix(path, "/") {
|
|
// Handle /[driveletter]/windows/path form (e.g. c:\Users\bar == /c/Users/bar)
|
|
if len(path) > 2 && path[2] == '/' && shouldResolveUnixWinVariant(path) {
|
|
drive := unicode.ToLower(rune(path[1]))
|
|
if unicode.IsLetter(drive) && drive <= unicode.MaxASCII {
|
|
return fmt.Sprintf("/mnt/%c/%s", drive, path[3:]), nil
|
|
}
|
|
}
|
|
|
|
// unix path - pass through
|
|
return path, nil
|
|
}
|
|
|
|
// Convert remote win client relative paths to absolute
|
|
path = resolveRelativeOnWindows(path)
|
|
|
|
// Strip extended marker prefix if present
|
|
path = strings.TrimPrefix(path, `\\?\`)
|
|
|
|
// Drive installed via wsl --mount
|
|
switch {
|
|
case strings.HasPrefix(path, `\\.\`):
|
|
path = "/mnt/wsl/" + path[4:]
|
|
case len(path) > 1 && path[1] == ':':
|
|
path = "/mnt/" + strings.ToLower(path[0:1]) + path[2:]
|
|
default:
|
|
return path, errors.New("unsupported UNC path")
|
|
}
|
|
|
|
return strings.ReplaceAll(path, `\`, "/"), nil
|
|
}
|