|  | // Copyright 2012 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. | 
|  |  | 
|  | // +build aix darwin dragonfly freebsd js,wasm linux netbsd openbsd solaris windows plan9 | 
|  |  | 
|  | package runtime | 
|  |  | 
|  | import "unsafe" | 
|  |  | 
|  | func gogetenv(key string) string { | 
|  | env := environ() | 
|  | if env == nil { | 
|  | throw("getenv before env init") | 
|  | } | 
|  | for _, s := range env { | 
|  | if len(s) > len(key) && s[len(key)] == '=' && envKeyEqual(s[:len(key)], key) { | 
|  | return s[len(key)+1:] | 
|  | } | 
|  | } | 
|  | return "" | 
|  | } | 
|  |  | 
|  | // envKeyEqual reports whether a == b, with ASCII-only case insensitivity | 
|  | // on Windows. The two strings must have the same length. | 
|  | func envKeyEqual(a, b string) bool { | 
|  | if GOOS == "windows" { // case insensitive | 
|  | for i := 0; i < len(a); i++ { | 
|  | ca, cb := a[i], b[i] | 
|  | if ca == cb || lowerASCII(ca) == lowerASCII(cb) { | 
|  | continue | 
|  | } | 
|  | return false | 
|  | } | 
|  | return true | 
|  | } | 
|  | return a == b | 
|  | } | 
|  |  | 
|  | func lowerASCII(c byte) byte { | 
|  | if 'A' <= c && c <= 'Z' { | 
|  | return c + ('a' - 'A') | 
|  | } | 
|  | return c | 
|  | } | 
|  |  | 
|  | var _cgo_setenv unsafe.Pointer   // pointer to C function | 
|  | var _cgo_unsetenv unsafe.Pointer // pointer to C function | 
|  |  | 
|  | // Update the C environment if cgo is loaded. | 
|  | // Called from syscall.Setenv. | 
|  | //go:linkname syscall_setenv_c syscall.setenv_c | 
|  | func syscall_setenv_c(k string, v string) { | 
|  | if _cgo_setenv == nil { | 
|  | return | 
|  | } | 
|  | arg := [2]unsafe.Pointer{cstring(k), cstring(v)} | 
|  | asmcgocall(_cgo_setenv, unsafe.Pointer(&arg)) | 
|  | } | 
|  |  | 
|  | // Update the C environment if cgo is loaded. | 
|  | // Called from syscall.unsetenv. | 
|  | //go:linkname syscall_unsetenv_c syscall.unsetenv_c | 
|  | func syscall_unsetenv_c(k string) { | 
|  | if _cgo_unsetenv == nil { | 
|  | return | 
|  | } | 
|  | arg := [1]unsafe.Pointer{cstring(k)} | 
|  | asmcgocall(_cgo_unsetenv, unsafe.Pointer(&arg)) | 
|  | } | 
|  |  | 
|  | func cstring(s string) unsafe.Pointer { | 
|  | p := make([]byte, len(s)+1) | 
|  | copy(p, s) | 
|  | return unsafe.Pointer(&p[0]) | 
|  | } |