1
2
3
4
5
6
7 package os
8
9 import (
10 "sync"
11 )
12
13
14 var ENOENV = NewError("no such environment variable")
15
16 var env map[string]string
17 var once sync.Once
18
19 func copyenv() {
20 env = make(map[string]string)
21 for _, s := range Envs {
22 for j := 0; j < len(s); j++ {
23 if s[j] == '=' {
24 env[s[0:j]] = s[j+1:]
25 break
26 }
27 }
28 }
29 }
30
31 var envLock sync.RWMutex
32
33
34
35 func Getenverror(key string) (value string, err Error) {
36 once.Do(copyenv)
37
38 if len(key) == 0 {
39 return "", EINVAL
40 }
41
42 envLock.RLock()
43 defer envLock.RUnlock()
44
45 v, ok := env[key]
46 if !ok {
47 return "", ENOENV
48 }
49 return v, nil
50 }
51
52
53
54 func Getenv(key string) string {
55 v, _ := Getenverror(key)
56 return v
57 }
58
59
60
61 func Setenv(key, value string) Error {
62 once.Do(copyenv)
63 if len(key) == 0 {
64 return EINVAL
65 }
66
67 envLock.Lock()
68 defer envLock.Unlock()
69
70 env[key] = value
71 setenv_c(key, value)
72 return nil
73 }
74
75
76 func Clearenv() {
77 once.Do(copyenv)
78
79 envLock.Lock()
80 defer envLock.Unlock()
81
82 env = make(map[string]string)
83
84
85 }
86
87
88
89 func Environ() []string {
90 once.Do(copyenv)
91 envLock.RLock()
92 defer envLock.RUnlock()
93 a := make([]string, len(env))
94 i := 0
95 for k, v := range env {
96 a[i] = k + "=" + v
97 i++
98 }
99 return a
100 }
101
102
103 func TempDir() string {
104 dir := Getenv("TMPDIR")
105 if dir == "" {
106 dir = "/tmp"
107 }
108 return dir
109 }