diff --git a/internal/app/wwctl/container/exec/child/main.go b/internal/app/wwctl/container/exec/child/main.go index 1e464fbd..3a418ec1 100644 --- a/internal/app/wwctl/container/exec/child/main.go +++ b/internal/app/wwctl/container/exec/child/main.go @@ -7,10 +7,10 @@ import ( "fmt" "os" "path" - "strings" "syscall" "github.com/hpcng/warewulf/internal/pkg/container" + "github.com/hpcng/warewulf/internal/pkg/util" "github.com/hpcng/warewulf/internal/pkg/wwlog" "github.com/spf13/cobra" ) @@ -38,7 +38,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { var source string var dest string - bind := strings.Split(b, ":") + bind := util.SplitValidPaths(b, ":") source = bind[0] if len(bind) == 1 { diff --git a/internal/pkg/util/util.go b/internal/pkg/util/util.go index c2698ce4..73c7b74c 100644 --- a/internal/pkg/util/util.go +++ b/internal/pkg/util/util.go @@ -315,3 +315,45 @@ func CopyUIDGID(source string, dest string) error { err = os.Chown(dest, UID, GID) return err } + +func SplitEscaped(input, delim, escape string) []string { + var ret []string + str := "" + for i := 1; i < len(input); i++ { + str += string(input[i-1]) + if string(input[i]) == delim && string(input[i-1]) != escape { + i++ + ret = append(ret, str) + str = "" + } + if string(input[i]) == escape { + i++ + } + + } + str += string(input[len(input)-1]) + ret = append(ret, str) + + return (ret) +} + +func SplitValidPaths(input, delim string) []string { + var ret []string + str := "" + for i := 1; i < len(input); i++ { + str += string(input[i-1]) + if (string(input[i]) == delim && string(input[i-1]) != "\\") && (IsDir(str) || IsFile(str)) { + i++ + ret = append(ret, str) + str = "" + } + if string(input[i]) == "\\" { + i++ + } + + } + str += string(input[len(input)-1]) + ret = append(ret, str) + + return (ret) +}