OSDN Git Service

libgo: Update to weekly.2011-12-22.
[pf3gnuchains/gcc-fork.git] / libgo / go / syscall / env_unix.go
1 // Copyright 2010 The Go Authors.  All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 // +build darwin freebsd linux netbsd openbsd
6
7 // Unix environment variables.
8
9 package syscall
10
11 import "sync"
12
13 var env map[string]string
14 var envOnce sync.Once
15 var Envs []string // provided by runtime
16
17 func setenv_c(k, v string)
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 func Getenv(key string) (value string, found bool) {
34         envOnce.Do(copyenv)
35         if len(key) == 0 {
36                 return "", false
37         }
38
39         envLock.RLock()
40         defer envLock.RUnlock()
41
42         v, ok := env[key]
43         if !ok {
44                 return "", false
45         }
46         return v, true
47 }
48
49 func Setenv(key, value string) error {
50         envOnce.Do(copyenv)
51         if len(key) == 0 {
52                 return EINVAL
53         }
54
55         envLock.Lock()
56         defer envLock.Unlock()
57
58         env[key] = value
59         setenv_c(key, value) // is a no-op if cgo isn't loaded
60         return nil
61 }
62
63 func Clearenv() {
64         envOnce.Do(copyenv) // prevent copyenv in Getenv/Setenv
65
66         envLock.Lock()
67         defer envLock.Unlock()
68
69         env = make(map[string]string)
70
71         // TODO(bradfitz): pass through to C
72 }
73
74 func Environ() []string {
75         envOnce.Do(copyenv)
76         envLock.RLock()
77         defer envLock.RUnlock()
78         a := make([]string, len(env))
79         i := 0
80         for k, v := range env {
81                 a[i] = k + "=" + v
82                 i++
83         }
84         return a
85 }