|  | /* 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); | 
|  | } |