summaryrefslogtreecommitdiff
path: root/src/syscall/env_plan9.go
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2014-10-03 12:22:19 -0400
committerRuss Cox <rsc@golang.org>2014-10-03 12:22:19 -0400
commitc5aca6fedbdd83d9153f6a00dc656aaabb0774c5 (patch)
tree26952b971b307783cde4b126c0a133f62ac3c893 /src/syscall/env_plan9.go
parent4eb6792aa572c7e6d3448d4cf22223b61b65724f (diff)
parent338c7ea5df93e25ac4dc143970603a1e88b26124 (diff)
downloadgo-c5aca6fedbdd83d9153f6a00dc656aaabb0774c5.tar.gz
[dev.garbage] merge default into dev.garbage
Diffstat (limited to 'src/syscall/env_plan9.go')
-rw-r--r--src/syscall/env_plan9.go39
1 files changed, 36 insertions, 3 deletions
diff --git a/src/syscall/env_plan9.go b/src/syscall/env_plan9.go
index 9587ab5af..934507905 100644
--- a/src/syscall/env_plan9.go
+++ b/src/syscall/env_plan9.go
@@ -12,16 +12,22 @@ import (
)
var (
- // envOnce guards copyenv, which populates env.
+ // envOnce guards copyenv, which populates env, envi and envs.
envOnce sync.Once
- // envLock guards env and envs.
+ // 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")
@@ -83,6 +89,7 @@ func copyenv() {
}
env[key] = v
envs[i] = key + "=" + v
+ envi[key] = i
i++
}
}
@@ -121,6 +128,7 @@ func Setenv(key, value string) error {
}
env[key] = value
envs = append(envs, key+"="+value)
+ envi[key] = len(envs) - 1
return nil
}
@@ -129,14 +137,39 @@ func Clearenv() {
defer envLock.Unlock()
env = make(map[string]string)
+ envi = make(map[string]int)
envs = []string{}
RawSyscall(SYS_RFORK, RFCENVG, 0, 0)
}
+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()
envOnce.Do(copyenv)
- return append([]string(nil), envs...)
+ ret := make([]string, 0, len(envs))
+ for _, pair := range envs {
+ if pair != "" {
+ ret = append(ret, pair)
+ }
+ }
+ return ret
}