libgo: Make os.setenv_c work on systems without setenv.
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 24 May 2011 22:21:34 +0000 (22:21 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 24 May 2011 22:21:34 +0000 (22:21 +0000)
From-SVN: r174147

libgo/config.h.in
libgo/configure
libgo/configure.ac
libgo/runtime/go-setenv.c

index 2976e979a360025a2e4f8f9bc2519ed765522a16..d604392323a2ebed0257abfd683c872c3e1736e3 100644 (file)
@@ -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
 
index 565bc89a34169506c2ffbb6df4dfd2d65c0e739d..4bf5a2e609694a517e0c8ba3e1e3343b8ad30115 100755 (executable)
@@ -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"
index 2451214f7680fb5ef4d8eb329544de2bef08c980..8a5ffb723a423fbe1cec68f1eb4200911b14a513 100644 (file)
@@ -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)
 
index 20f9939975973791dfc4a946efb5db92f404d756..9c93f52668e058481df4d5847a59ff081cd6d4f1 100644 (file)
@@ -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)