On Thursday, 06 October 2005 at 14:28, David Champion wrote: > * On 2005.10.06, in <20051006181856.F3051@xxxxxxxxxxxxxxxxxxxxx>, > * "Moritz Barsnick" <moritz+mutt@xxxxxxxxxxxx> wrote: > > > > Are you sure all systems actually have putenv()? I know I had problems > > with the one or the other in old SunOS (Solaris). Usually there should > > be an autoconf check for it. > > No, I'm not sure -- but all the systems I use do, and it is POSIX, which > is a reasonable baseline. An autoconf check would be better, but I think > this is safe. > > Solaris 5.9 has putenv() but not setenv(), for example. (Solaris 5.10 > does have setenv().) > > > > OTOH, I haven't checked whether mutt already uses putenv() in other > > places without alternatives, and whether these "old" systems are > > considered dying. ;-) > > It had neither until this code was added recently. I think I'd prefer the attached patch if it works. Does it?
Index: configure.in
===================================================================
RCS file: /home/roessler/cvs/mutt/configure.in,v
retrieving revision 3.41
diff -u -p -r3.41 configure.in
--- configure.in 29 Sep 2005 23:52:16 -0000 3.41
+++ configure.in 9 Oct 2005 04:50:02 -0000
@@ -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
Index: setenv.c
===================================================================
RCS file: setenv.c
diff -N setenv.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ setenv.c 9 Oct 2005 04:50:02 -0000
@@ -0,0 +1,47 @@
+/* $Id: setenv.c,v 1.6 2002/09/01 03:04:10 rra Exp $
+**
+** Replacement for a missing setenv.
+**
+** Written by Russ Allbery <rra@xxxxxxxxxxxx>
+** 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). */
+}
Attachment:
pgpcljeUNSP7G.pgp
Description: PGP signature