]> granicus.if.org Git - neomutt/commitdiff
Add Russ Allbery's setenv replacement function.
authorBrendan Cully <brendan@kublai.com>
Sun, 9 Oct 2005 20:13:53 +0000 (20:13 +0000)
committerBrendan Cully <brendan@kublai.com>
Sun, 9 Oct 2005 20:13:53 +0000 (20:13 +0000)
configure.in
setenv.c [new file with mode: 0644]

index 99ebaaedb01479d2ccaf14c15d8a5524f28f9131..9df0d6511764605a6f125c1ac0897d0c308c996f 100644 (file)
@@ -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 (file)
index 0000000..0fd9019
--- /dev/null
+++ b/setenv.c
@@ -0,0 +1,47 @@
+/*  $Id$
+**
+**  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);
+    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). */
+}