github.com/hbdrawn/golang@v0.0.0-20141214014649-6b835209aba2/src/syscall/env_windows.go (about) 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 // Windows environment variables. 6 7 package syscall 8 9 import ( 10 "unicode/utf16" 11 "unsafe" 12 ) 13 14 func Getenv(key string) (value string, found bool) { 15 keyp, err := UTF16PtrFromString(key) 16 if err != nil { 17 return "", false 18 } 19 b := make([]uint16, 100) 20 n, e := GetEnvironmentVariable(keyp, &b[0], uint32(len(b))) 21 if n == 0 && e == ERROR_ENVVAR_NOT_FOUND { 22 return "", false 23 } 24 if n > uint32(len(b)) { 25 b = make([]uint16, n) 26 n, e = GetEnvironmentVariable(keyp, &b[0], uint32(len(b))) 27 if n > uint32(len(b)) { 28 n = 0 29 } 30 } 31 return string(utf16.Decode(b[0:n])), true 32 } 33 34 func Setenv(key, value string) error { 35 v, err := UTF16PtrFromString(value) 36 if err != nil { 37 return err 38 } 39 keyp, err := UTF16PtrFromString(key) 40 if err != nil { 41 return err 42 } 43 e := SetEnvironmentVariable(keyp, v) 44 if e != nil { 45 return e 46 } 47 return nil 48 } 49 50 func Unsetenv(key string) error { 51 keyp, err := UTF16PtrFromString(key) 52 if err != nil { 53 return err 54 } 55 return SetEnvironmentVariable(keyp, nil) 56 } 57 58 func Clearenv() { 59 for _, s := range Environ() { 60 // Environment variables can begin with = 61 // so start looking for the separator = at j=1. 62 // http://blogs.msdn.com/b/oldnewthing/archive/2010/05/06/10008132.aspx 63 for j := 1; j < len(s); j++ { 64 if s[j] == '=' { 65 Setenv(s[0:j], "") 66 break 67 } 68 } 69 } 70 } 71 72 func Environ() []string { 73 s, e := GetEnvironmentStrings() 74 if e != nil { 75 return nil 76 } 77 defer FreeEnvironmentStrings(s) 78 r := make([]string, 0, 50) // Empty with room to grow. 79 for from, i, p := 0, 0, (*[1 << 24]uint16)(unsafe.Pointer(s)); true; i++ { 80 if p[i] == 0 { 81 // empty string marks the end 82 if i <= from { 83 break 84 } 85 r = append(r, string(utf16.Decode(p[from:i]))) 86 from = i + 1 87 } 88 } 89 return r 90 }