...
Run Format

Source file src/syscall/env_plan9.go

Documentation: syscall

  // 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
  }
  

View as plain text