diff --git a/src/runtime/env_linux.go b/src/runtime/env_unix.go similarity index 67% rename from src/runtime/env_linux.go rename to src/runtime/env_unix.go index 2581ab8e..70716204 100644 --- a/src/runtime/env_linux.go +++ b/src/runtime/env_unix.go @@ -1,28 +1,40 @@ -//go:build linux +//go:build linux || darwin package runtime // Update the C environment if cgo is loaded. -// Called from syscall.Setenv. +// Called from Go 1.20 and above. // -//go:linkname syscall_setenv_c syscall.setenv_c -func syscall_setenv_c(key string, val string) { +//go:linkname syscallSetenv syscall.runtimeSetenv +func syscallSetenv(key, value string) { keydata := cstring(key) - valdata := cstring(val) + valdata := cstring(value) // ignore any errors libc_setenv(&keydata[0], &valdata[0], 1) - return } // Update the C environment if cgo is loaded. -// Called from syscall.Unsetenv. +// Called from Go 1.20 and above. // -//go:linkname syscall_unsetenv_c syscall.unsetenv_c -func syscall_unsetenv_c(key string) { +//go:linkname syscallUnsetenv syscall.runtimeUnsetenv +func syscallUnsetenv(key string) { keydata := cstring(key) // ignore any errors libc_unsetenv(&keydata[0]) - return +} + +// Compatibility with Go 1.19 and below. +// +//go:linkname syscall_setenv_c syscall.setenv_c +func syscall_setenv_c(key string, val string) { + syscallSetenv(key, val) +} + +// Compatibility with Go 1.19 and below. +// +//go:linkname syscall_unsetenv_c syscall.unsetenv_c +func syscall_unsetenv_c(key string) { + syscallUnsetenv(key) } // cstring converts a Go string to a C string. diff --git a/src/syscall/syscall_libc.go b/src/syscall/syscall_libc.go index 002c9dc3..5c701710 100644 --- a/src/syscall/syscall_libc.go +++ b/src/syscall/syscall_libc.go @@ -197,21 +197,12 @@ func Setenv(key, val string) (err error) { return EINVAL } } - keydata := cstring(key) - valdata := cstring(val) - errCode := libc_setenv(&keydata[0], &valdata[0], 1) - if errCode != 0 { - err = getErrno() - } + runtimeSetenv(key, val) return } func Unsetenv(key string) (err error) { - keydata := cstring(key) - errCode := libc_unsetenv(&keydata[0]) - if errCode != 0 { - err = getErrno() - } + runtimeUnsetenv(key) return } @@ -312,6 +303,10 @@ func splitSlice(p []byte) (buf *byte, len uintptr) { return slice.buf, slice.len } +// These two functions are provided by the runtime. +func runtimeSetenv(key, value string) +func runtimeUnsetenv(key string) + //export strlen func libc_strlen(ptr unsafe.Pointer) uintptr @@ -325,16 +320,6 @@ func libc_write(fd int32, buf *byte, count uint) int //export getenv func libc_getenv(name *byte) *byte -// int setenv(const char *name, const char *val, int replace); -// -//export setenv -func libc_setenv(name *byte, val *byte, replace int32) int32 - -// int unsetenv(const char *name); -// -//export unsetenv -func libc_unsetenv(name *byte) int32 - // ssize_t read(int fd, void *buf, size_t count); // //export read