env.mx raw

   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