summaryrefslogtreecommitdiff
path: root/pkg/env/env_windows.go
blob: 5df08fadcd90e045a706ee5ac2f658448e4847c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
}