mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			109 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
| // 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"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	errZeroLengthKey = errors.New("zero length key")
 | |
| 	errShortWrite    = errors.New("i/o count too small")
 | |
| )
 | |
| 
 | |
| func readenv(key string) (string, error) {
 | |
| 	fd, err := open("/env/"+key, O_RDONLY)
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 	defer Close(fd)
 | |
| 	l, _ := Seek(fd, 0, 2)
 | |
| 	Seek(fd, 0, 0)
 | |
| 	buf := make([]byte, l)
 | |
| 	n, err := Read(fd, buf)
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 	if n > 0 && buf[n-1] == 0 {
 | |
| 		buf = buf[:n-1]
 | |
| 	}
 | |
| 	return string(buf), nil
 | |
| }
 | |
| 
 | |
| func writeenv(key, value string) error {
 | |
| 	fd, err := create("/env/"+key, O_RDWR, 0666)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	defer Close(fd)
 | |
| 	b := []byte(value)
 | |
| 	n, err := Write(fd, b)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	if n != len(b) {
 | |
| 		return errShortWrite
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func Getenv(key string) (value string, found bool) {
 | |
| 	if len(key) == 0 {
 | |
| 		return "", false
 | |
| 	}
 | |
| 	v, err := readenv(key)
 | |
| 	if err != nil {
 | |
| 		return "", false
 | |
| 	}
 | |
| 	return v, true
 | |
| }
 | |
| 
 | |
| func Setenv(key, value string) error {
 | |
| 	if len(key) == 0 {
 | |
| 		return errZeroLengthKey
 | |
| 	}
 | |
| 	err := writeenv(key, value)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func Clearenv() {
 | |
| 	RawSyscall(SYS_RFORK, RFCENVG, 0, 0)
 | |
| }
 | |
| 
 | |
| func Unsetenv(key string) error {
 | |
| 	if len(key) == 0 {
 | |
| 		return errZeroLengthKey
 | |
| 	}
 | |
| 	Remove("/env/" + key)
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func Environ() []string {
 | |
| 	fd, err := open("/env", O_RDONLY)
 | |
| 	if err != nil {
 | |
| 		return nil
 | |
| 	}
 | |
| 	defer Close(fd)
 | |
| 	files, err := readdirnames(fd)
 | |
| 	if err != nil {
 | |
| 		return nil
 | |
| 	}
 | |
| 	ret := make([]string, 0, len(files))
 | |
| 
 | |
| 	for _, key := range files {
 | |
| 		v, err := readenv(key)
 | |
| 		if err != nil {
 | |
| 			continue
 | |
| 		}
 | |
| 		ret = append(ret, key+"="+v)
 | |
| 	}
 | |
| 	return ret
 | |
| }
 |