diff options
author | David du Colombier <0intro@gmail.com> | 2014-10-16 22:30:14 +0200 |
---|---|---|
committer | David du Colombier <0intro@gmail.com> | 2014-10-16 22:30:14 +0200 |
commit | 946cc7b9f36f7f4971cbe71702df5265a1cc7b5b (patch) | |
tree | a2ef5f2b549fbfedd0d5c215f36c77cd26b212c5 /src/syscall | |
parent | 557c1a8b2022216b8b6a0f395c6597075d523656 (diff) | |
download | go-946cc7b9f36f7f4971cbe71702df5265a1cc7b5b.tar.gz |
syscall: don't cache environment variables on Plan 9
Fixes issue 8849.
LGTM=bradfitz, aram
R=bradfitz, rsc, aram
CC=golang-codereviews
https://codereview.appspot.com/158970045
Diffstat (limited to 'src/syscall')
-rw-r--r-- | src/syscall/env_plan9.go | 97 |
1 files changed, 15 insertions, 82 deletions
diff --git a/src/syscall/env_plan9.go b/src/syscall/env_plan9.go index 934507905..9ea36c886 100644 --- a/src/syscall/env_plan9.go +++ b/src/syscall/env_plan9.go @@ -8,28 +8,9 @@ package syscall import ( "errors" - "sync" ) var ( - // envOnce guards copyenv, which populates env, envi and envs. - envOnce sync.Once - - // envLock guards env, envi and envs. - envLock sync.RWMutex - - // env maps from an environment variable to its value. - // TODO: remove this? golang.org/issue/8849 - env = make(map[string]string) - - // envi maps from an environment variable to its index in envs. - // TODO: remove this? golang.org/issue/8849 - envi = make(map[string]int) - - // envs contains elements of env in the form "key=value". - // empty strings mean deleted. - envs []string - errZeroLengthKey = errors.New("zero length key") errShortWrite = errors.New("i/o count too small") ) @@ -70,47 +51,14 @@ func writeenv(key, value string) error { return nil } -func copyenv() { - fd, err := Open("/env", O_RDONLY) - if err != nil { - return - } - defer Close(fd) - files, err := readdirnames(fd) - if err != nil { - return - } - envs = make([]string, len(files)) - i := 0 - for _, key := range files { - v, err := readenv(key) - if err != nil { - continue - } - env[key] = v - envs[i] = key + "=" + v - envi[key] = i - i++ - } -} - func Getenv(key string) (value string, found bool) { if len(key) == 0 { return "", false } - - envLock.RLock() - defer envLock.RUnlock() - - if v, ok := env[key]; ok { - return v, true - } v, err := readenv(key) if err != nil { return "", false } - env[key] = v - envs = append(envs, key+"="+v) return v, true } @@ -118,27 +66,14 @@ func Setenv(key, value string) error { if len(key) == 0 { return errZeroLengthKey } - - envLock.Lock() - defer envLock.Unlock() - err := writeenv(key, value) if err != nil { return err } - env[key] = value - envs = append(envs, key+"="+value) - envi[key] = len(envs) - 1 return nil } func Clearenv() { - envLock.Lock() - defer envLock.Unlock() - - env = make(map[string]string) - envi = make(map[string]int) - envs = []string{} RawSyscall(SYS_RFORK, RFCENVG, 0, 0) } @@ -146,30 +81,28 @@ func Unsetenv(key string) error { if len(key) == 0 { return errZeroLengthKey } - - envLock.Lock() - defer envLock.Unlock() - Remove("/env/" + key) - - if i, ok := envi[key]; ok { - delete(env, key) - delete(envi, key) - envs[i] = "" - } return nil } func Environ() []string { - envLock.RLock() - defer envLock.RUnlock() + fd, err := Open("/env", O_RDONLY) + if err != nil { + return nil + } + defer Close(fd) + files, err := readdirnames(fd) + if err != nil { + return nil + } + ret := make([]string, 0, len(files)) - envOnce.Do(copyenv) - ret := make([]string, 0, len(envs)) - for _, pair := range envs { - if pair != "" { - ret = append(ret, pair) + for _, key := range files { + v, err := readenv(key) + if err != nil { + continue } + ret = append(ret, key+"="+v) } return ret } |