diff --git a/libgo/config.h.in b/libgo/config.h.in index 2976e979a36..d604392323a 100644 --- a/libgo/config.h.in +++ b/libgo/config.h.in @@ -24,6 +24,9 @@ /* Define to 1 if you have the `random' function. */ #undef HAVE_RANDOM +/* Define to 1 if you have the `setenv' function. */ +#undef HAVE_SETENV + /* Define to 1 if you have the `srandom' function. */ #undef HAVE_SRANDOM diff --git a/libgo/configure b/libgo/configure index 565bc89a341..4bf5a2e6096 100755 --- a/libgo/configure +++ b/libgo/configure @@ -14271,7 +14271,7 @@ else fi -for ac_func in srandom random strerror_r strsignal wait4 mincore +for ac_func in srandom random strerror_r strsignal wait4 mincore setenv do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" diff --git a/libgo/configure.ac b/libgo/configure.ac index 2451214f768..8a5ffb723a4 100644 --- a/libgo/configure.ac +++ b/libgo/configure.ac @@ -431,7 +431,7 @@ esac AC_CHECK_HEADERS(sys/mman.h syscall.h sys/epoll.h sys/ptrace.h sys/syscall.h sys/user.h sys/utsname.h sys/select.h) AM_CONDITIONAL(HAVE_SYS_MMAN_H, test "$ac_cv_header_sys_mman_h" = yes) -AC_CHECK_FUNCS(srandom random strerror_r strsignal wait4 mincore) +AC_CHECK_FUNCS(srandom random strerror_r strsignal wait4 mincore setenv) AM_CONDITIONAL(HAVE_STRERROR_R, test "$ac_cv_func_strerror_r" = yes) AM_CONDITIONAL(HAVE_WAIT4, test "$ac_cv_func_wait4" = yes) diff --git a/libgo/runtime/go-setenv.c b/libgo/runtime/go-setenv.c index 20f99399759..9c93f52668e 100644 --- a/libgo/runtime/go-setenv.c +++ b/libgo/runtime/go-setenv.c @@ -4,6 +4,8 @@ Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. */ +#include "config.h" + #include #include @@ -25,24 +27,38 @@ setenv_c (struct __go_string k, struct __go_string v) ks = k.__data; kn = NULL; + vs = v.__data; + vn = NULL; + +#ifdef HAVE_SETENV + if (ks[k.__length] != 0) { kn = __go_alloc (k.__length + 1); - __builtin_memcpy (kn, k.__data, k.__length); + __builtin_memcpy (kn, ks, k.__length); ks = kn; } - vs = v.__data; - vn = NULL; if (vs[v.__length] != 0) { vn = __go_alloc (v.__length + 1); - __builtin_memcpy (vn, v.__data, v.__length); + __builtin_memcpy (vn, vs, v.__length); vs = vn; } setenv ((const char *) ks, (const char *) vs, 1); +#else /* !defined(HAVE_SETENV) */ + + kn = malloc (k.__length + v.__length + 2); + __builtin_memcpy (kn, ks, k.__length); + kn[k.__length] = '='; + __builtin_memcpy (kn + k.__length + 1, vs, v.__length); + kn[k.__length + v.__length + 1] = '\0'; + putenv ((char *) kn); + +#endif /* !defined(HAVE_SETENV) */ + if (kn != NULL) __go_free (kn); if (vn != NULL)