From 3c62457138f8dbeaaea1d2129ff47fa7241c84d3 Mon Sep 17 00:00:00 2001 From: Brendan Cully Date: Sun, 9 Oct 2005 20:13:53 +0000 Subject: [PATCH] Add Russ Allbery's setenv replacement function. --- configure.in | 2 +- setenv.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 setenv.c diff --git a/configure.in b/configure.in index 99ebaaedb..9df0d6511 100644 --- a/configure.in +++ b/configure.in @@ -332,7 +332,7 @@ AC_CHECK_TYPE(ssize_t, int) AC_CHECK_FUNCS(fgetpos memmove setegid srand48 strerror) -AC_REPLACE_FUNCS(strcasecmp strdup) +AC_REPLACE_FUNCS([setenv strcasecmp strdup]) AC_CHECK_FUNC(getopt) if test $ac_cv_func_getopt = yes; then diff --git a/setenv.c b/setenv.c new file mode 100644 index 000000000..0fd901986 --- /dev/null +++ b/setenv.c @@ -0,0 +1,47 @@ +/* $Id$ +** +** Replacement for a missing setenv. +** +** Written by Russ Allbery +** 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 +#include + +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); + 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); + strcat(envstring, "="); + strcat(envstring, value); + 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). */ +} -- 2.40.0