diff options
Diffstat (limited to 'src/pkg/syscall/env_plan9.go')
-rw-r--r-- | src/pkg/syscall/env_plan9.go | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/pkg/syscall/env_plan9.go b/src/pkg/syscall/env_plan9.go new file mode 100644 index 000000000..518573318 --- /dev/null +++ b/src/pkg/syscall/env_plan9.go @@ -0,0 +1,74 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Plan 9 environment variables. + +package syscall + +import "errors" + +func Getenv(key string) (value string, found bool) { + if len(key) == 0 { + return "", false + } + f, e := Open("/env/"+key, O_RDONLY) + if e != nil { + return "", false + } + defer Close(f) + + l, _ := Seek(f, 0, 2) + Seek(f, 0, 0) + buf := make([]byte, l) + n, e := Read(f, buf) + if e != nil { + return "", false + } + + if n > 0 && buf[n-1] == 0 { + buf = buf[:n-1] + } + return string(buf), true +} + +func Setenv(key, value string) error { + if len(key) == 0 { + return errors.New("bad arg in system call") + } + + f, e := Create("/env/"+key, O_RDWR, 0666) + if e != nil { + return e + } + defer Close(f) + + _, e = Write(f, []byte(value)) + return nil +} + +func Clearenv() { + RawSyscall(SYS_RFORK, RFCENVG, 0, 0) +} + +func Environ() []string { + env := make([]string, 0, 100) + + f, e := Open("/env", O_RDONLY) + if e != nil { + panic(e) + } + defer Close(f) + + names, e := readdirnames(f) + if e != nil { + panic(e) + } + + for _, k := range names { + if v, ok := Getenv(k); ok { + env = append(env, k+"="+v) + } + } + return env[0:len(env)] +} |