aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2011-05-24 22:21:34 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2011-05-24 22:21:34 +0000
commit5bb92e54b78558ba9e105824b807325c45cd7644 (patch)
treea17569556c9f8bfb53e143af4d2f41428e34e44b
parent657730879110d20c9aa1de4f085a99e0ef6127de (diff)
downloadgcc-5bb92e54b78558ba9e105824b807325c45cd7644.zip
gcc-5bb92e54b78558ba9e105824b807325c45cd7644.tar.gz
gcc-5bb92e54b78558ba9e105824b807325c45cd7644.tar.bz2
libgo: Make os.setenv_c work on systems without setenv.
From-SVN: r174147
-rw-r--r--libgo/config.h.in3
-rwxr-xr-xlibgo/configure2
-rw-r--r--libgo/configure.ac2
-rw-r--r--libgo/runtime/go-setenv.c24
4 files changed, 25 insertions, 6 deletions
diff --git a/libgo/config.h.in b/libgo/config.h.in
index 2976e97..d604392 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 565bc89..4bf5a2e 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 2451214..8a5ffb7 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 20f9939..9c93f52 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 <stddef.h>
#include <stdlib.h>
@@ -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)