summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pkg/env/env_unix.go (renamed from pkg/env/env_supported.go)2
-rw-r--r--pkg/env/env_unsupported.go8
-rw-r--r--pkg/env/env_windows.go25
3 files changed, 26 insertions, 9 deletions
diff --git a/pkg/env/env_supported.go b/pkg/env/env_unix.go
index 8be9f9592..16061a700 100644
--- a/pkg/env/env_supported.go
+++ b/pkg/env/env_unix.go
@@ -1,4 +1,4 @@
-// +build linux darwin
+// +build !windows
package env
diff --git a/pkg/env/env_unsupported.go b/pkg/env/env_unsupported.go
deleted file mode 100644
index a71c2956d..000000000
--- a/pkg/env/env_unsupported.go
+++ /dev/null
@@ -1,8 +0,0 @@
-// +build !linux,!darwin
-
-package env
-
-func ParseSlice(s []string) (map[string]string, error) {
- m := make(map[string]string)
- return m, nil
-}
diff --git a/pkg/env/env_windows.go b/pkg/env/env_windows.go
new file mode 100644
index 000000000..5df08fadc
--- /dev/null
+++ b/pkg/env/env_windows.go
@@ -0,0 +1,25 @@
+package env
+
+// ParseSlice parses the specified slice and transforms it into an environment
+// map.
+func ParseSlice(s []string) (map[string]string, error) {
+ env := make(map[string]string, len(s))
+ for _, e := range s {
+ if len(e) > 0 && e[0] == '=' {
+ // The legacy Windows CMD command interpreter uses a hack, where to emulate
+ // DOS semantics, it uses an illegal (by windows definition) env name for
+ // state storage to avoid conlficting with user defined env names. This is
+ // used to preserve drive letter paths. E.g., typing c: from another drive
+ // will remember the last CWD because CMD stores it in an env named "=C:".
+ // Since these are illegal, they are filtered from standard user access but
+ // are still available in the underlying win32 API calls. Since they have
+ // zero value to a container, we filter as well.
+ continue
+ }
+
+ if err := parseEnv(env, e); err != nil {
+ return nil, err
+ }
+ }
+ return env, nil
+}