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