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