1 //go:build linux || darwin || windows || wasip1
2 3 package runtime
4 5 // Update the C environment if cgo is loaded.
6 // Called from Go 1.20 and above.
7 //
8 //go:linkname syscallSetenv syscall.runtimeSetenv
9 func syscallSetenv(key, value string) {
10 keydata := cstring(key)
11 valdata := cstring(value)
12 setenv(&keydata[0], &valdata[0])
13 if key == "GODEBUG" && godebugUpdate != nil {
14 // Starting with Go 1.20, we need to call a callback (set by
15 // internal/godebug) to notify the GODEBUG environment variable has
16 // changed. This is necessary to get archive/zip to pass tests.
17 godebugUpdate(key, value)
18 }
19 }
20 21 // Update the C environment if cgo is loaded.
22 // Called from Go 1.20 and above.
23 //
24 //go:linkname syscallUnsetenv syscall.runtimeUnsetenv
25 func syscallUnsetenv(key string) {
26 keydata := cstring(key)
27 unsetenv(&keydata[0])
28 }
29 30 // Compatibility with Go 1.19 and below.
31 //
32 //go:linkname syscall_setenv_c syscall.setenv_c
33 func syscall_setenv_c(key string, val string) {
34 syscallSetenv(key, val)
35 }
36 37 // Compatibility with Go 1.19 and below.
38 //
39 //go:linkname syscall_unsetenv_c syscall.unsetenv_c
40 func syscall_unsetenv_c(key string) {
41 syscallUnsetenv(key)
42 }
43 44 // cstring converts a Go string to a C string.
45 // borrowed from syscall
46 func cstring(s string) []byte {
47 data := make([]byte, len(s)+1)
48 copy(data, s)
49 // final byte should be zero from the initial allocation
50 return data
51 }
52