/*  Replacement for a missing setenv.
**
**  Written by Russ Allbery <rra@stanford.edu>
**  This work is hereby placed in the public domain by its author.
**
**  Provides the same functionality as the standard library routine setenv
**  for those platforms that don't have it.
*/

#include "config.h"

#include <stdlib.h>
#include <string.h>

int
setenv(const char *name, const char *value, int overwrite)
{
  char *envstring;

  if (!overwrite && getenv(name) != NULL)
    return 0;

  /* Allocate memory for the environment string.  We intentionally don't
     use concat here, or the xmalloc family of allocation routines, since
     the intention is to provide a replacement for the standard library
     function which sets errno and returns in the event of a memory
     allocation failure. */
  envstring = malloc(strlen(name) + 1 + strlen(value) + 1); /* __MEM_CHECKED__ */
  if (envstring == NULL)
    return -1;

  /* Build the environment string and add it to the environment using
     putenv.  Systems without putenv lose, but XPG4 requires it. */
  strcpy(envstring, name);  /* __STRCPY_CHECKED__ */
  strcat(envstring, "=");   /* __STRCAT_CHECKED__ */
  strcat(envstring, value); /* __STRCAT_CHECKED__ */
  return putenv(envstring);

  /* Note that the memory allocated is not freed.  This is intentional;
     many implementations of putenv assume that the string passed to
     putenv will never be freed and don't make a copy of it.  Repeated use
     of this function will therefore leak memory, since most
     implementations of putenv also don't free strings removed from the
     environment (due to being overwritten). */
}
