| /* go-setenv.c -- set the C environment from Go. | 
 |  | 
 |    Copyright 2011 The Go Authors. All rights reserved. | 
 |    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> | 
 |  | 
 | #include "runtime.h" | 
 |  | 
 | /* Set the C environment from Go.  This is called by syscall.Setenv.  */ | 
 |  | 
 | void setenv_c (String, String) __asm__ (GOSYM_PREFIX "syscall.setenv__c"); | 
 |  | 
 | void | 
 | setenv_c (String k, String v) | 
 | { | 
 |   const byte *ks; | 
 |   unsigned char *kn; | 
 |   const byte *vs; | 
 |   unsigned char *vn; | 
 |  | 
 |   ks = k.str; | 
 |   if (ks == NULL) | 
 |     ks = (const byte *) ""; | 
 |   kn = NULL; | 
 |  | 
 |   vs = v.str; | 
 |   if (vs == NULL) | 
 |     vs = (const byte *) ""; | 
 |   vn = NULL; | 
 |  | 
 | #ifdef HAVE_SETENV | 
 |  | 
 |   if (ks[k.len] != 0) | 
 |     { | 
 |       kn = malloc (k.len + 1); | 
 |       if (kn == NULL) | 
 | 	runtime_throw ("out of malloc memory"); | 
 |       __builtin_memcpy (kn, ks, k.len); | 
 |       kn[k.len] = '\0'; | 
 |       ks = kn; | 
 |     } | 
 |  | 
 |   if (vs[v.len] != 0) | 
 |     { | 
 |       vn = malloc (v.len + 1); | 
 |       if (vn == NULL) | 
 | 	runtime_throw ("out of malloc memory"); | 
 |       __builtin_memcpy (vn, vs, v.len); | 
 |       vn[v.len] = '\0'; | 
 |       vs = vn; | 
 |     } | 
 |  | 
 |   setenv ((const char *) ks, (const char *) vs, 1); | 
 |  | 
 | #else /* !defined(HAVE_SETENV) */ | 
 |  | 
 |   len = k.len + v.len + 2; | 
 |   kn = malloc (len); | 
 |   if (kn == NULL) | 
 |     runtime_throw ("out of malloc memory"); | 
 |   __builtin_memcpy (kn, ks, k.len); | 
 |   kn[k.len] = '='; | 
 |   __builtin_memcpy (kn + k.len + 1, vs, v.len); | 
 |   kn[k.len + v.len + 1] = '\0'; | 
 |   putenv ((char *) kn); | 
 |   kn = NULL; /* putenv takes ownership of the string.  */ | 
 |  | 
 | #endif /* !defined(HAVE_SETENV) */ | 
 |  | 
 |   if (kn != NULL) | 
 |     free (kn); | 
 |   if (vn != NULL) | 
 |     free (vn); | 
 | } |