...
Source file src/pkg/syscall/env_plan9.go
1
2
3
4
5
6
7 package syscall
8
9 import (
10 "errors"
11 )
12
13 var (
14 errZeroLengthKey = errors.New("zero length key")
15 errShortWrite = errors.New("i/o count too small")
16 )
17
18 func readenv(key string) (string, error) {
19 fd, err := open("/env/"+key, O_RDONLY)
20 if err != nil {
21 return "", err
22 }
23 defer Close(fd)
24 l, _ := Seek(fd, 0, 2)
25 Seek(fd, 0, 0)
26 buf := make([]byte, l)
27 n, err := Read(fd, buf)
28 if err != nil {
29 return "", err
30 }
31 if n > 0 && buf[n-1] == 0 {
32 buf = buf[:n-1]
33 }
34 return string(buf), nil
35 }
36
37 func writeenv(key, value string) error {
38 fd, err := create("/env/"+key, O_RDWR, 0666)
39 if err != nil {
40 return err
41 }
42 defer Close(fd)
43 b := []byte(value)
44 n, err := Write(fd, b)
45 if err != nil {
46 return err
47 }
48 if n != len(b) {
49 return errShortWrite
50 }
51 return nil
52 }
53
54 func Getenv(key string) (value string, found bool) {
55 if len(key) == 0 {
56 return "", false
57 }
58 v, err := readenv(key)
59 if err != nil {
60 return "", false
61 }
62 return v, true
63 }
64
65 func Setenv(key, value string) error {
66 if len(key) == 0 {
67 return errZeroLengthKey
68 }
69 err := writeenv(key, value)
70 if err != nil {
71 return err
72 }
73 return nil
74 }
75
76 func Clearenv() {
77 RawSyscall(SYS_RFORK, RFCENVG, 0, 0)
78 }
79
80 func Unsetenv(key string) error {
81 if len(key) == 0 {
82 return errZeroLengthKey
83 }
84 Remove("/env/" + key)
85 return nil
86 }
87
88 func Environ() []string {
89 fd, err := open("/env", O_RDONLY)
90 if err != nil {
91 return nil
92 }
93 defer Close(fd)
94 files, err := readdirnames(fd)
95 if err != nil {
96 return nil
97 }
98 ret := make([]string, 0, len(files))
99
100 for _, key := range files {
101 v, err := readenv(key)
102 if err != nil {
103 continue
104 }
105 ret = append(ret, key+"="+v)
106 }
107 return ret
108 }
109
View as plain text